TCP-七種定時器(作用)

一 建立連接時

1.建立連接(connection establishment)定時器

在發送一個 SYN報文段建議一個新的連接時啓動這個定時器,如果在75秒內沒有收到響應,連接建立將終止。

二 傳輸數據時

2.重傳(retransmission)定時器:

在TCP發送數據時設定,如果定時器已經超時而對端的確認還未到達,TCP將重傳數據。重傳定時器的值(即TCP等待對端確認的時間)是動態計算的,取決於TCP爲該連接測量的往返時間和該報文段已經被重傳的次數

3.延遲應答(delayed ACK)定時器

接收端收到數據必須確認但無需馬上發出確認的數據時設定。TCP等待200ms後發出確認響應(如果在200ms在此收到了數據,在這個延遲ACK的定時器將重置成200ms)。如果,在這200ms內,接收端想發數據給對端,那麼這個延遲ACK就隨着這個數據一起發送到對端(稱爲:捎帶確認)

4.堅持(persist)定時器

在接收端通告接受窗口爲0,阻止TCP繼續發送數據時設定。用於接收端發送的窗口通告不可靠(只有數據纔會被確認,ACK不會被確認),允許TCP發送數據的後續窗口更新有可能丟失。因此,如果TCP有數據要發送,但接收端通告接受窗口爲0。則堅持定時器啓動,超時後向接受端發送一個字節的數據,判斷接受端的窗口是否打開。與重傳定時器類似。堅持定時器的值也是動態計算的,取決於連接的往返時間,在5s~6s之間取值。

5.保活(keepalive)定時器:

如果連接的連續空閒時間超過兩個小時,保活定時器超時,向對端發送連接的探測報文,強迫對端響應,如果收到期待的響應,TCP可確定對端的主機工作正常,否則,TCP可確定對端主機以重啓或者故障。在通信進程(通過setsockopt函數)選取了socket的SO_KEEPALIVE選項時生效。但是不太實用,2個小時太長了,一般都獨自設置心跳協議來探測是否保持連接的。

三 斷開連接時

6.FIN_WAIT_2 定時器

主動關閉的一端調用完 close以後(即發送FIN給被動關閉的一端,並且收到其對FIN的確認ACK)則進入FIN_WAIT_2狀態。

如果這個時候因爲網絡突然斷掉,被動關閉的一段宕機等原因,導致主動關閉的一端接受不到被動關閉的一端發來的FIN,主動關閉的一端總不能一直等着(畢竟不是真愛),這時候設置FIN_WAIT_2 定時器,如果這個定時器超時的時候 還沒有收到被動關閉的一端發過來的FIN,那麼那麼直接釋放這個連接。

7.TIME_WAIT 定時器【也稱爲 2MSL(max segment lifetime , 報文段最大生存時間)定時器】:

即兩倍最大報文段生存時間定時器(windows:MSL = 2min, linux:MSL = 60s, UNIX: MSL=30s)。主動關閉連接的一端最後進入的狀態不是直接變成CLOSED狀態而是TIME_WAIT狀態。原因1:如果被動關閉的一端在超時時間內沒有收到最後一個ACK,則會重發最後的FIN, 2MSL等待時間保證了重發的FIN會被被動關閉的一端收到且重新發送過一個ACK;原因2:在2MSL等待時間時,任何遲到的報文段會被接受並丟棄,防止老的TCP連接的包 在新的TCP連接裏面出現。

三次握手和四次揮手的定時器工作圖

更多的C/C++ linux編程我會在下面的文章中陸續的分享,也可以關注‘奇牛學院’

來一起討論

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章