http://blog.csdn.net/chenhanzhun/article/details/41823931
2014
TCP 是提供可靠的傳輸層,它使用的方法之一就是確認(rèn)從另一端收到的數(shù)據(jù)。但是數(shù)據(jù)和確認(rèn)都可能會(huì)丟失。TCP 通過在發(fā)送時(shí)設(shè)置一個(gè)定時(shí)器來解決這個(gè)問題。如果當(dāng)定時(shí)器溢出時(shí)還沒收到確認(rèn),它就會(huì)重傳該數(shù)據(jù)。關(guān)鍵在于超時(shí)和重傳策略,即怎樣決定超時(shí)的時(shí)間間隔和如何確定重傳的頻率。
對(duì)于每個(gè)連接,TCP 管理著四個(gè)不同的定時(shí)器:重傳定時(shí)器、堅(jiān)持定時(shí)器、保活定時(shí)器 以及 2MSL 定時(shí)器。
為了防止丟失數(shù)據(jù)報(bào)文段或確認(rèn)報(bào)文段,當(dāng) TCP 發(fā)送報(bào)文段時(shí),啟動(dòng)了特定報(bào)文段的重傳計(jì)時(shí)器,若在計(jì)時(shí)器超時(shí)之前收到對(duì)報(bào)文段的確認(rèn),則撤銷計(jì)時(shí)器。若收到特定報(bào)文段的確認(rèn)之前計(jì)時(shí)器已經(jīng)超時(shí),則重傳該報(bào)文,并把計(jì)時(shí)器復(fù)位。這里最重要的是超時(shí)的時(shí)間計(jì)算,有關(guān)該時(shí)間的請(qǐng)查閱具體的算法,這里不再進(jìn)行記錄。
堅(jiān)持定時(shí)器主要是解決零窗口大小通知可能導(dǎo)致的死鎖問題。剛開始接收端向發(fā)送端發(fā)送了一個(gè)零窗口報(bào)文段。在不久之后,如果接收端的緩存區(qū)有一定的空間可以接收數(shù)據(jù),此時(shí)接收端就會(huì)向發(fā)送端發(fā)送了一個(gè)非零窗口大小的報(bào)文段(即窗口更新),但是這個(gè)非零窗口大小的報(bào)文段在傳輸過程中丟失,導(dǎo)致發(fā)送端無法接收到該非零窗口大小的報(bào)文段。因此,發(fā)送端就會(huì)一直處于等待非零窗口大小的報(bào)文端通知,由于接收端已經(jīng)發(fā)送了非零窗口大小的報(bào)文段,而且并不知道該報(bào)文段在傳輸過程中丟失,則接收端會(huì)一直處于等待接收數(shù)據(jù)狀態(tài),如果沒有任何措施的話,這個(gè)死鎖的局面會(huì)一直延續(xù)下去。
為了解決上面這個(gè)問題,TCP 為每一個(gè)連接設(shè)有一個(gè)堅(jiān)持定時(shí)器(也叫持續(xù)計(jì)數(shù)器)。當(dāng)發(fā)送端收到零窗口的確認(rèn)時(shí),就啟動(dòng)堅(jiān)持計(jì)時(shí)器,當(dāng)堅(jiān)持計(jì)時(shí)器截止期到時(shí),發(fā)送端就發(fā)送一個(gè)特殊的報(bào)文段,叫探測(cè)報(bào)文段,這個(gè)報(bào)文段只有一個(gè)字節(jié)的數(shù)據(jù)。探測(cè)報(bào)文段有序號(hào),但序號(hào)永遠(yuǎn)不需要確認(rèn),甚至在計(jì)算對(duì)其他部分?jǐn)?shù)據(jù)的確認(rèn)時(shí)這個(gè)序號(hào)也被忽略。探測(cè)報(bào)文段提醒接收端,確認(rèn)已丟失,必須重傳。
堅(jiān)持計(jì)時(shí)器的截止期設(shè)置為重傳時(shí)間的值,但若沒有收到來自接收端的響應(yīng),則發(fā)送另一個(gè)探測(cè)報(bào)文段,并將堅(jiān)持計(jì)時(shí)器的值加倍和并復(fù)位,發(fā)送端繼續(xù)發(fā)送探測(cè)報(bào)文段,將堅(jiān)持計(jì)時(shí)器的值加倍和復(fù)位,直到這個(gè)值增大到閾值為止(通常為 60 秒)。在此之后,發(fā)送端每隔 60s 就發(fā)送一個(gè)報(bào)文段,直到窗口重新打開為止。
堅(jiān)持定時(shí)器的原理:當(dāng) TCP 服務(wù)器收到了客戶端的 0 滑動(dòng)窗口報(bào)文時(shí),啟動(dòng)一個(gè)定時(shí)器來計(jì)時(shí),并在定時(shí)器溢出的時(shí)向客戶端查詢窗口是否已經(jīng)增大,如果得到非零的窗口就重新開始發(fā)送數(shù)據(jù),如果得到零窗口就再開一個(gè)新的定時(shí)器準(zhǔn)備下一次查詢。
保活定時(shí)器是為了應(yīng)對(duì) TCP 連接雙方出現(xiàn)長時(shí)間的沒有數(shù)據(jù)傳輸?shù)那闆r。如果客戶端與服務(wù)器建立了 TCP 連接之后,客戶端由于某種原因?qū)е轮鳈C(jī)故障,則服務(wù)器就不能收到來自客戶端的數(shù)據(jù),而服務(wù)器不可能一直處于等待狀態(tài),?;疃〞r(shí)器就是用來解決這個(gè)問題的。服務(wù)器每收到一次客戶端的數(shù)據(jù),就重新設(shè)置?;疃〞r(shí)器,通常為 2 小時(shí),如果 2 小時(shí)沒有收到客戶端的數(shù)據(jù),服務(wù)端就發(fā)送一個(gè)探測(cè)報(bào)文,以后每隔75秒發(fā)送一次,如果連續(xù)發(fā)送10次探測(cè)報(bào)文段后仍沒有收到客戶端的響應(yīng),服務(wù)器就認(rèn)為客戶端出現(xiàn)了故障,就可以終止這個(gè)連接。
2MSL 定時(shí)器主要是解決以下兩種情況:
聯(lián)系客服