(1)超時重傳定時器
tcp的靠譜特性,通過確認機制,保證每一個包都被對方收到,那么什么時候需要重傳呢?就是靠這個超時重傳定時器,每次發送報文前都啟動這個定時器,如果定時器超時之前收到了應答則關閉定時器,如果沒收到就重發該報文,並重置定時器。
(2)建連定時器
和重傳定時器類似,發送syn時,為了防止被丟棄,一段時間不回復ack也會重傳。
和重傳定時器類似,發送syn時,為了防止被丟棄,一段時間不回復ack也會重傳。

(3)TIME_WAIT(2MSL)定時器
主動發送fin的一端,在接收到對端的ack報文后會進入TIME_WAIT等待自狀態,一方面是防止自己回復對方fin的ack被丟掉了,對方無法釋放資源,給對方一次重新發送fin的機會(對方等1MSL發現沒回+又發送fin(最多耗時1MSL收到)),另一方面是防止剛釋放的端口被新建立的連接用上,剛好又有老連接的報文遲到被新連接誤用。tcp是一群講究公平的生物,他們總是期望兩邊的資源盡量對等,一端釋放的時候盡量確保對方也釋放,但有時候對端死活沒響應,那也不能死等。通常的做法是,我想釋放資源了,那么我告訴你一聲,等收到你回復了,我就知道你已經釋放了,那么我也釋放資源。但是有時候,等了一段時間還沒收到回復,那就認為是中間傳話的系統出問題了,那我再通知一次,再過一段時間,還不回復,那就認為你自己偷偷釋放資源了,所以我也不等了,釋放資源。TIME_WAIT為了確定對方能釋放資源,多等一會兒自己再釋放。
(4)堅持定時器
如果發送方數據發送的比較快,接收方處理的比較慢,那么接收方的緩存隊列可能會滿,這時沒法接收新數據了,會將窗口值為0通知給發送方,而發送方將不再發送數據。過一段時間接收方處理完了,隊列有了空閑,又把窗口調大,通知給發送方,但這個報文可能被不可靠的鏈路丟掉,而這個是不會確認和重傳的,這樣發送方就一直認為接收方的窗口為0,一直等待下去了。為此有了堅持定時器,發送方接收到0窗口就會啟動該定時器,定期的詢問窗口值變為多少了。
(5)保活定時器
不懂為什么起名叫保活定時器,其實是起的探測作用,定時發送探測報文,探測對端是否還活着,防止資源被白白占用。如客戶端和服務器建立連接,客戶端直接斷電,那么如果沒有這個探測,那么服務器會認為這個客戶端還在,對應連接的資源就不會釋放。有了這個探測,如果客戶端已經重啟了,會直接回復復位報文給服務器,服務器就會釋放原來的資源,新建立連接,如果客戶端關機不重啟,服務器探測幾次之后也知道對方掛了,會釋放資源。
不懂為什么起名叫保活定時器,其實是起的探測作用,定時發送探測報文,探測對端是否還活着,防止資源被白白占用。如客戶端和服務器建立連接,客戶端直接斷電,那么如果沒有這個探測,那么服務器會認為這個客戶端還在,對應連接的資源就不會釋放。有了這個探測,如果客戶端已經重啟了,會直接回復復位報文給服務器,服務器就會釋放原來的資源,新建立連接,如果客戶端關機不重啟,服務器探測幾次之后也知道對方掛了,會釋放資源。
(6)延遲確認定時器
為了提高利用率,接收到報文,不立即回復ack,而是延時一段時間,將ack捎帶在其他報文里。
為了提高利用率,接收到報文,不立即回復ack,而是延時一段時間,將ack捎帶在其他報文里。