TCP一共有四個主要的定時器,前面已經講到了一個--超時定時器--是TCP裏面最複雜的一個,另外的三個是: 算法
其中堅持定時器用於防止通告窗口爲0之後雙方互相等待死鎖的狀況;而保活定時器則用於處理半開放鏈接 緩存
堅持定時器的原理是簡單的,當TCP服務器收到了客戶端的0滑動窗口報文的時候,就啓動一個定時器來計時,並在定時器溢出的時候向向客戶端查詢窗口是否已經增大,若是獲得非零的窗口就從新開始發送數據,若是獲得0窗口就再開一個新的定時器準備下一次查詢。經過觀察能夠得知,TCP的堅持定時器使用1,2,4,8,16……64秒這樣的普通指數退避序列來做爲每一次的溢出時間。 服務器
糊塗窗口綜合症 網絡
TCP的窗口協議,會引發一種一般叫作糊塗窗口綜合症的問題,具體表現爲,當客戶端通告一個小的非零窗口時,服務器馬上發送小數據給客戶端並充滿其緩衝區,一來二去就會讓網絡中充滿小TCP數據報,從而影響網絡利用率。對於發送方和接收端的這種糊塗行爲。TCP給出了一些建議(或者是規定)。 spa
ok,如今咱們回憶一下,能夠發現TCP的不少規定都是爲了在一次傳送中發送儘可能多的數據,例如捎帶ACK數據報文的策略,Nagle算法,重傳時發送包含原數據報文的策略,等等。 io
保活定時器更加的簡單,還記得FTP或者Http服務器都有Sesstion Time機制麼?由於TCP是面向鏈接的,因此就會出現只鏈接不傳送數據的「半開放鏈接」,服務器固然要檢測到這種鏈接而且在某些狀況下釋放這種鏈接,這就是保活定時器的做用。其時限根據服務器的實現不一樣而不通。另外要提到的是,當其中一端若是崩潰並從新啓動的狀況下,若是收到該端「前生」的保活探察,則要發送一個RST數據報文幫助另外一端結束鏈接。 原理