本文將圍繞TCP中為什么有計(jì)時(shí)器,計(jì)時(shí)器的種類以及它們各自的特點(diǎn)來(lái)闡述。
TCP中為什么要設(shè)置計(jì)時(shí)器
TCP 是提供給可靠的傳輸層,它使用的方法之一就是確認(rèn)從另一端收到的數(shù)據(jù),但是數(shù)據(jù)和確認(rèn)都可能會(huì)丟失。TCP 通過(guò)在發(fā)送時(shí)設(shè)置一個(gè)定時(shí)器來(lái)解決這個(gè)問(wèn)題。如果當(dāng)定時(shí)器溢出時(shí)還沒(méi)收到確認(rèn),它就會(huì)重傳該數(shù)據(jù)(關(guān)鍵在于超時(shí)和重傳策略,即怎樣決定超時(shí)的時(shí)間間隔和如何確定重傳的頻率) ,對(duì)于每個(gè)連接,TCP 管理著四個(gè)不同的定時(shí)器。
TCP使用的四種計(jì)時(shí)器
重傳計(jì)時(shí)器堅(jiān)持計(jì)時(shí)器保活計(jì)時(shí)器時(shí)間等待計(jì)時(shí)器四種計(jì)時(shí)器各自的特點(diǎn)
1.重傳計(jì)時(shí)器 當(dāng)TCP發(fā)送報(bào)文段時(shí),就創(chuàng)建該特定報(bào)文段的重傳計(jì)時(shí)器 ,可能發(fā)生兩種情況:
若在計(jì)時(shí)器截止時(shí)間到( 通常是60秒 )之前收到了對(duì)此特定報(bào)文段的確認(rèn),則撤銷此計(jì)時(shí)器。 若在收到了對(duì)此特定報(bào)文段的確認(rèn)之前計(jì)時(shí)器截止期到,則重傳此報(bào)文段,并將計(jì)時(shí)器復(fù)位。2.堅(jiān)持計(jì)時(shí)器
為了對(duì)付零窗口大小通知,TCP需要另一個(gè)計(jì)時(shí)器。假定接收TCP宣布了窗口大小為零。發(fā)送TCP就停止傳送報(bào)文段,直到接
收TCP發(fā)送確認(rèn)并宣布一個(gè)非零的窗口大小,但這個(gè)確認(rèn)可能會(huì)丟失。我們知道在TCP中,對(duì)確認(rèn)是不需要發(fā)送確認(rèn)的。若確認(rèn)
丟失了,接收TCP并不知道,而是會(huì)認(rèn)為它已經(jīng)完成任務(wù)了,并等待著發(fā)送TCP接著會(huì)發(fā)送更多的報(bào)文段。但發(fā)送TCP由于沒(méi)有
收到確認(rèn),就等待對(duì)方發(fā)送確認(rèn)來(lái)通知窗口的大小。雙方的TCP都在永遠(yuǎn)地等待著對(duì)方。
要打開(kāi)這種死鎖,TCP為每一個(gè)連接使用一個(gè)堅(jiān)持計(jì)時(shí)器。 當(dāng)發(fā)送TCP收到一個(gè)窗口大小為零的確認(rèn)時(shí),就啟動(dòng)堅(jiān)持器 。 當(dāng)
堅(jiān)持計(jì)時(shí)器期限到時(shí),發(fā)送TCP就發(fā)送一個(gè)特殊的報(bào)文段, 叫做 探測(cè)報(bào)文段 。這個(gè)報(bào)文段只有一個(gè)字節(jié)的數(shù)據(jù)。它有一個(gè)序號(hào),
但它的序號(hào)永遠(yuǎn)不需要確認(rèn);甚至在計(jì)算對(duì)其他部分的數(shù)據(jù)的確認(rèn)時(shí)該序號(hào)也被忽略。探測(cè)報(bào)文段提醒對(duì)端:確認(rèn)已丟失,必須
重傳。
堅(jiān)持計(jì)時(shí)器的值設(shè)置為重傳時(shí)間的數(shù)值。但是若沒(méi)有收到從接收端來(lái)的響應(yīng),則需發(fā)送另一個(gè)探測(cè)報(bào)文段,并將堅(jiān)持計(jì)時(shí)器的
值加倍和復(fù)位。發(fā)送端繼續(xù)發(fā)送探測(cè)報(bào)文段,將堅(jiān)持計(jì)時(shí)器設(shè)定的值加倍和復(fù)位,直到這個(gè)值增大到門限值( 通常是60秒 )為
止。在這以后,發(fā)送端每隔60秒就發(fā)送一個(gè)探測(cè)報(bào)文段,直到窗口重新打開(kāi)。
3.保活計(jì)時(shí)器
保活計(jì)時(shí)器使用在某些實(shí)現(xiàn)中,用來(lái)防止在兩個(gè)TCP之間的連接出現(xiàn)長(zhǎng)時(shí)期的空閑。假定客戶打開(kāi)了到服務(wù)器的連接,傳送了
一些數(shù)據(jù),然后就保持靜默了。也許這個(gè)客戶出故障了。在這種情況下,這個(gè)連接將永遠(yuǎn)地處理為打開(kāi)狀態(tài)。
要解決這種問(wèn)題,在大多數(shù)的實(shí)現(xiàn)中都是使服務(wù)器設(shè)置保活計(jì)時(shí)器。每當(dāng)服務(wù)器收到客戶的信息,就將計(jì)時(shí)器復(fù)位。保活計(jì)時(shí)
器 通常設(shè)置為2小時(shí) 。若服務(wù)器過(guò)了2小時(shí)還沒(méi)有收到客戶的信息,它就發(fā)送探測(cè)報(bào)文段。若發(fā)送了10個(gè)探測(cè)報(bào)文段(每一個(gè)相隔
75秒)還沒(méi)有響應(yīng),就假定客戶出了故障,因而就終止該連接。
4.時(shí)間等待計(jì)時(shí)器
時(shí)間等待計(jì)時(shí)器是在連接終止期間使用的 。當(dāng)TCP關(guān)閉一個(gè)連接時(shí),它并不認(rèn)為這個(gè)連接馬上就真正地關(guān)閉了。在時(shí)間等待期
間中,連接還處于一種中間過(guò)渡狀態(tài)。這就可以使重復(fù)的FIN報(bào)文段(如果有的話)可以到達(dá)目的站因而可將其丟棄。這個(gè)計(jì)時(shí)器
的值 通常設(shè)置為一個(gè)報(bào)文段的壽命期待值的兩倍,也就是2倍的MSL。
擴(kuò)展
往返時(shí)延RTT只是對(duì)傳輸層的TCP協(xié)議才很重要,因?yàn)門CP要根據(jù)平均往返時(shí)延RTT的值來(lái)設(shè)置超時(shí)計(jì)時(shí)器的超時(shí)時(shí)間;
UDP沒(méi)有確認(rèn)和重傳機(jī)制,因此RTT對(duì)UDP沒(méi)有什么意義。因此,不能笼統(tǒng)的說(shuō):往返時(shí)延RTT對(duì)傳輸層來(lái)說(shuō)很重要,因?yàn)橹挥?/strong>
TCP才需要計(jì)算RTT,而UDP不需要計(jì)算RTT.
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注