TCP一共有四個主要的定時器,前面已經講到了一個--逾時定時器--是TCP裡面最複雜的一個,另外的三個是:
- 堅持定時器
- 保活定時器
- 2MSL定時器
其中堅持定時器用於防止通告視窗為0以後雙方互相等待死結的情況;而保活定時器則用於處理半開放串連
1.堅持定時器
堅持定時器的原理是簡單的,當TCP伺服器收到了用戶端的0滑動視窗報文的時候,就啟動一個定時器來計時,並在定時器溢出的時候向向用戶端查詢時段是否已經增大,如果得到非零的視窗就重新開始發送資料,如果得到0視窗就再開一個新的定時器準備下一次查詢。通過觀察可以得知,TCP的堅持定時器使用1,2,4,8,16……64秒這樣的普通指數退避序列來作為每一次的溢出時間。
糊塗視窗綜合症
TCP的視窗協議,會引起一種通常叫做糊塗視窗綜合症的問題,具體表現為,當用戶端通告一個小的非零視窗時,伺服器立刻發送小資料給用戶端並充滿其緩衝區,一來二去就會讓網路中充滿小TCP資料報,從而影響網路利用率。對於發送方和接收端的這種糊塗行為。TCP給出了一些建議(或者是規定)。
- 接收方不通告小視窗。通常的演算法是接收方不通告一個比當前視窗大的視窗(可以為0),
除非視窗可以增加一個報文段大小(也就是將要接收的MSS)或者可以增加接收方緩衝空間
的一半,不論實際有多少。
- 發送方避免出現糊塗視窗綜合症的措施是只有以下條件之一滿足時才發送資料: ( a )可
以發送一個滿長度的報文段; ( b )可以發送至少是接收方通告視窗大小一半的報文段; ( c )可以
發送任何資料並且不希望接收ACK(也就是說,我們沒有還未被確認的資料)或者該串連上
不能使用Nagle演算法。
ok,現在我們回憶一下,可以發現TCP的很多規定都是為了在一次傳送中發送盡量多的資料,例如捎帶ACK資料報文的策略,Nagle演算法,重傳時發送包含原資料報文的策略,等等。
2.保活定時器
保活定時器更加的簡單,還記得FTP或者Http伺服器都有Sesstion Time機制嗎?因為TCP是連線導向的,所以就會出現只串連不傳送資料的“半開放串連”,伺服器當然要檢測到這種串連並且在某些情況下釋放這種串連,這就是保活定時器的作用。其時限根據伺服器的實現不同而不通。另外要提到的是,當其中一端如果崩潰並重新啟動的情況下,如果收到該端“前生”的保活探察,則要發送一個RST資料報文協助另一端結束串連。