TCP/IP中關於定時器的介紹,TCP為每條串連建立七個定時器,分別為:
1.串連建立定時器,在發送SYN報文段建立一條新串連時啟動。如果沒有在75S內收到響應,串連建立將終止。
2.重傳定時器在TCP發送資料時設定。如果定時器已逾時而對端的確認還未到達,TCP將重傳資料。重傳定時器的值(即TCP等待對端確認的時間)是動態計算的,取決於TCP為該串連測量的往返時間和該報文段 已被重傳的次數。
3.延遲ACK定時器在TCP收到必須被確認但無需馬上發出確認的資料設定。TCP等待200ms後發送確認響應。如果,在這200ms內,有資料要在該串連上發送,延遲的ACK響應就可隨著資料一起發送回對端,稱為捎帶確認。
4.持續定時器在串連對端通告接收視窗為0,阻止TCP繼續發送資料時設定。由於串連對端發送的視窗通告不可靠(只有資料才會被確認,ACK不會被確認),允許TCP繼續發送資料的後續視窗更新有可能丟失。因此,如果TCP有資料要發送,單對端通告接收視窗為0,則持續定時器啟動,逾時後向對端發送1位元組的資料,判斷對端接收視窗是否已開啟。與重傳定時器類似,持續定時器的值也是動態計算的,取決於串連的往返時間,在5S到60S之間取值。
5.保活定時器在應用進程選取了插口的SO_KEEPALIVE選項時生效。如果串連的連續空閑時間超過2小時,保活定時器逾時,向對端發送串連探測報文段,強迫對端響應。如果收到了期待的響應,TCP可確定對端主機正常工作,在該串連再次空閑超過2小時之前,TCP不會再進行保活測試。如果收到的是其他響應,TCP可確定對端主機已重啟。如果串連若干次保活測試都未收到響應,TCP就假定對端主機已崩潰,儘管它無法區分是主機故障(例如系統崩潰而尚未重啟),還是串連故障(例如,中間的路由器發送故障或電話線斷了)。
6.FIN_WAIT_2定時器。當摸個串連從FIN_WAIT_1狀態變遷到FIN_WAIT_2狀態,並且態再接收任何新資料時(意味著應用進程調用了close,而非shutdown,沒有利用TCP的半關閉功能),FIN_WAIT_2定時器啟動,設為10分鐘。定時器逾時後,重新設為75S,第二次逾時後串連被關閉。加入這個定時器的目的是為了避免如果對端一直不發送FIN,某個串連會永遠滯留在FIN_WAIT_2狀態。
7.TIME_WAIT定時器,一般也稱為2MSL定時器。MSL指最大報文段存留時間。當串連轉移到TIME_WAIT狀態,即串連主動關閉時,定時器啟動。串連進入TIME_WAIT狀態時,定時器設定為1分鐘,逾時後,TCP控制塊和InternetPCB被刪除,連接埠號碼可重新使用。
TCP包括兩個定時器函數:一個函數為200ms調用一次(快速定時器);另一個函數每500ms調用一次(慢速定時器)。延遲ACK定時器與其它6個定時器有所不同,如果摸個串連上設定了延遲ACK定時器,那麼下一個200ms定時器逾時後,延遲的ACK必須被發送(ACK的延時時間必須在0-200ms之間)。其它的定時器每500ms遞減一次,計時器減為0時,就觸發相應的動作。