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