tcp通訊TIME WAIT狀態問題

2021-10-21 19:48:58 字數 1134 閱讀 4333

1 為什麼time_wait狀態需要經過2msl(最大報文段生存時間)才能返回到close狀態?

msl是最大報文生存時間,如果報文超過這個時間,就認為這個報文丟掉了

比如客戶端a到b進行通訊,對於4次斷開(揮手);

如果客戶a在最後一次傳送ack給b,如果中途丟失,客戶b會重新向a傳送fin=1,ack=1,即4次斷開第3步驟,如何判斷ack是否丟了呢?就是通過msl(最大報文生存時間)來決定的;

如果b傳送fin=1,ack=1,b會等待2msl時間,因為b向a傳送需要1msl時間,a再向b傳送ack需要1msl時間;如果b在2msl時間內還沒有收到a返回的ack,那麼b會重傳fin=1,ack=1的分包給a

這就是msl的概念,msl就決定了1個分包單向傳輸的最長時間,如果超過,就認為丟掉了

在圖中客戶a time_wait為什麼需要等待2msl呢?

因為客戶a在收到b傳送過來的fin=1,ack=1分包後,首先會向b傳送ack,這個時間最大需要msl,但是a需要保證b收到ack,如果在此期間a向b傳送的ack丟掉了,a在此期間是不知道的,a只有收到第3步驟b向a傳送的fin=1,ack=1的時候,a才能知道,a自己在第4步傳送給b的ack丟掉了,因此在b等待第4步a傳送ack期間,b經歷了2msl時間,所以a在2msl時間內都沒有收到,b向a傳送的第3步的fin=1,ack=1的重傳分包,a就會認為b收到了第4步,a向b傳送的ack分包了;

所以a才能進入closed的狀態

如果b沒有收到ack,那麼在2個msl時間內,a肯定會在2個msl時間內 收到b向a傳送的第3步的

fin=1,ack=1的分包的; a收到第3步fin=1,ack=1分包,會重新進入time_wait等待時間2msl,

繼續傳送ack,重試的流程;在a等待2msl時間b能收到,a向b傳送的最後1個ack分包

2 msl的大小一般為多少, 可否配置?

cat /proc/sys/net/ipv4/tcp_fin_timeout 

這裡是2msl的值,所以msl值為30

修改echo 30 >/proc/sys/net/ipv4/tcp_fin_timeout 

埠釋放的更快

TCP連線的TIME WAIT狀態

time wait狀態是tcp的11個狀態其中之一,是發生在正常關閉tcp連線的時候發生的。如下圖所示 在這幅圖中我們可以明顯看出,流程是這樣的,顯示主動傳送乙個fin報文,然後接收到乙個ack報文,這樣這一方的連線已經關閉,也就是不能再傳送資料了,進入fin wait2狀態,這個狀態就是為了等待,...

TCP中的time wait狀態

tcp連線的建立三次握手,連線的斷開需要四次揮手。tcp連線在四次揮手的過程中,主動關閉的一端往往會進入乙個叫time wait的狀態。這個狀態是被動關閉端發出fin分節以後,被動端就會進入last ack狀態,主動關閉端接受到這個fin分節以後就會發出最後乙個ack分節,並進入time wait狀...

TCP中的TIME WAIT狀態

上面是tcp客戶端向伺服器申請鏈結 傳輸資料 斷開連線的過程。在斷開連線的4次握手過程中,執行主動關閉的那一端 也就是我們這個圖中的客戶端 將進入time wait狀態 這個狀態將持續2msl的時間 最長分節生命週期 maximun segment lifetime 每乙個tcp都有乙個msl的值 ...