TCP TIME_WAIT 详解
先放上TCP狀態(tài)轉(zhuǎn)換圖
再放上三次握手
然后放上四次揮手
OK,我們發(fā)現(xiàn)在四次揮手中出現(xiàn)了TIME_WAIT 狀態(tài)
1.time_wait狀態(tài)是什么
簡單來說:time_wait狀態(tài)是四次揮手中server向client發(fā)送FIN終止連接后進(jìn)入的狀態(tài)。
上面圖為tcp四次揮手過程
這里寫圖片描寫敘述
能夠看到time_wait狀態(tài)存在于client收到serverFin并返回ack包時的狀態(tài)
當(dāng)處于time_wait狀態(tài)時,我們無法創(chuàng)建新的連接,由于port被占用。
2.為什么會有time_wait狀態(tài)
time_wait存在的原因有兩點
1.可靠的終止TCP連接。
2.保證讓遲來的TCP報文段有足夠的時間被識別并丟棄。
1.可靠的終止TCP連接,若處于time_wait的client發(fā)送給server確認(rèn)報文段丟失的話,server將在此又一次發(fā)送FIN報文段,那么client必須處于一個可接收的狀態(tài)就是time_wait而不是close狀態(tài)。
2.保證遲來的TCP報文段有足夠的時間被識別并丟棄,linux 中一個TCPport不能打開兩次或兩次以上。當(dāng)client處于time_wait狀態(tài)時我們將無法使用此port建立新連接,假設(shè)不存在time_wait狀態(tài),新連接可能會收到舊連接的數(shù)據(jù)。
time_wait持續(xù)的時間是2MSL,保證舊的數(shù)據(jù)能夠丟棄。由于網(wǎng)絡(luò)中的數(shù)據(jù)最大存在MSL(maxinum segment lifetime)
3.哪一方會有time_wait狀態(tài)
time_wait狀態(tài)是一般有client的狀態(tài)。
并且會占用port
有時產(chǎn)生在server端,由于server主動斷開連接或者發(fā)生異常
4.怎樣避免time_wait狀態(tài)占用資源
假設(shè)是client,我們一般不用操心,由于client一般選用暫時port。再次創(chuàng)建連接會新分配一個port。
除非指定client使用某port,只是一般不須要這么做。
假設(shè)是server主動關(guān)閉連接后異常終止。則由于它總是使用用一個知名serverport號,所以連接的time_wait狀態(tài)將導(dǎo)致它不能重新啟動。只是我們能夠通過socket的選項SO_REUSEADDR來強制進(jìn)程馬上使用處于time_wait狀態(tài)的連接占用的port。
通過socksetopt設(shè)置后,即使sock處于time_wait狀態(tài),與之綁定的socket地址也能夠馬上被重用。
此外也能夠通過改動內(nèi)核參數(shù)/proc/sys/net/ipv4/tcp_tw/recycle來高速回收被關(guān)閉的socket,從而是tcp連接根本不進(jìn)入time_wait狀態(tài),進(jìn)而同意應(yīng)用程序馬上重用本地的socket地址。
TCP 狀態(tài)遷移過程
LISTEN:服務(wù)端已經(jīng)啟動一個socket,其狀態(tài)處于監(jiān)聽狀態(tài),等待客戶發(fā)起請求連接。
ESTABLISHED:客戶端和服務(wù)端經(jīng)過三次握手建立,兩個方向上連接狀態(tài)都建立,狀態(tài)置為ESTABLISHED
客戶端狀態(tài)變遷:(主動端)
FIN_WAIT_1: 發(fā)送FIN給服務(wù)端口。
FIN_WAIT_2:收到服務(wù)端的ACK報文
TIME_WAIT :收到服務(wù)端發(fā)過來的FIN報文,發(fā)送ACK報文給服務(wù)端口。主動關(guān)閉連接端,接收到服務(wù)(TIME_WAIT是主動端關(guān)閉)之后進(jìn)入2MSL時間的等待
CLOSE:2MSl過后,關(guān)閉進(jìn)入初始化狀態(tài)。
服務(wù)端狀態(tài)變遷:(服務(wù)端)
CLOSE_WAIT:收到客戶端FIN報文,給客戶端發(fā)送ACK狀態(tài)后,表示知道客戶端要關(guān)閉連接請求,服務(wù)端可能數(shù)據(jù)還沒有傳送完,所以處于等待關(guān)閉狀態(tài)。(CLOSE_WAIT是被動端關(guān)閉)
LAST_ACK:服務(wù)端數(shù)據(jù)傳輸完畢,發(fā)送FIN報文給客戶端,同時等待客戶端發(fā)ACK報文狀態(tài)
CLOSE:收到客戶端ACK報文后,進(jìn)入初始化狀態(tài)
轉(zhuǎn)載于:https://blog.51cto.com/superhakce/2091872
總結(jié)
以上是生活随笔為你收集整理的TCP TIME_WAIT 详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cesium(鼠标事件)
- 下一篇: 实战GraphQL+express+my