TCP中的計(jì)時(shí)器你都了解嗎?

最近復(fù)習(xí)計(jì)算機(jī)網(wǎng)絡(luò),發(fā)現(xiàn)TCP協(xié)議中的幾個(gè)計(jì)時(shí)器不是很了解,寫一篇文章供自己查閱理解

TCP中有四種計(jì)時(shí)器(Timer),分別為:

  1. 重傳計(jì)時(shí)器:Retransmission Timer
  2. 堅(jiān)持計(jì)時(shí)器:Persistent Timer
  3. ?;钣?jì)時(shí)器:Keeplive Timer
  4. 時(shí)間等待計(jì)時(shí)器:Timer_Wait Timer

重傳計(jì)時(shí)器(Retransmission Timer)

TCP的可靠傳輸是通過帶確認(rèn)的重傳機(jī)制實(shí)現(xiàn)的。在滑動(dòng)窗口中,接受窗口會(huì)在連續(xù)收到的包的最后一個(gè)序列發(fā)送一個(gè)ACK,但是在發(fā)生網(wǎng)絡(luò)擁塞的時(shí)候,數(shù)據(jù)包和ACK有可能丟失。TCP為了防止這種情況發(fā)生,規(guī)定在重傳的“時(shí)間片”到了以后。如果還沒有收到客戶端的ACK,就重發(fā)此包,以免陷入無限長的等待,也就是“死鎖”狀態(tài)中

  • 目的:為了控制丟失的報(bào)文段或者丟棄的報(bào)文段。這段時(shí)間為對報(bào)文段的等待確認(rèn)時(shí)間。

  • 創(chuàng)建時(shí)間:在TCP發(fā)送報(bào)文段時(shí),會(huì)創(chuàng)建對次特定報(bào)文段的重傳計(jì)時(shí)器。

  • 可能發(fā)生的兩種情況:

      1. 在截止時(shí)間(通常為60秒)到之前,已經(jīng)收到了對此特定報(bào)文段的確認(rèn),則撤銷計(jì)時(shí)器;
      1. 在截止時(shí)間到了,但未收到對此特定報(bào)文段的確認(rèn),則重傳報(bào)文段,并且將計(jì)時(shí)器復(fù)位。
  • 重傳時(shí)間:2*RTT(Round Trip Time,為往返時(shí)間)通常是設(shè)置為2小時(shí)

堅(jiān)持計(jì)時(shí)器(Persistent Timer)

在滑動(dòng)窗口技術(shù)中,如果接收端的接受窗口滿了,就會(huì)告訴發(fā)送端接受窗口滿了,停止發(fā)送,這個(gè)時(shí)候,發(fā)送端和接收端的窗口都是置為0,這個(gè)狀態(tài)稱為“零窗口”狀態(tài)。直到接受窗口收到了非零窗口大小的通知,但是這個(gè)通知有可能會(huì)丟失,如果丟失了,發(fā)送端會(huì)認(rèn)為自己發(fā)送了調(diào)整接受窗口的通知,就等待接收端發(fā)來確認(rèn),兩者由會(huì)永遠(yuǎn)等待對方。

  • 解決方案:為了解決零窗口問題引起的死鎖問題,TCP為每一個(gè)連接設(shè)置了堅(jiān)持計(jì)時(shí)器。

  • 目的:主要解決零窗口大小通知可能導(dǎo)致的死鎖問題

  • 工作原理:當(dāng)發(fā)送端TCP收到接收端發(fā)來的零窗口通知時(shí),就會(huì)啟動(dòng)堅(jiān)持計(jì)時(shí)器。當(dāng)計(jì)時(shí)器的期限到達(dá)時(shí),發(fā)送端就會(huì)主動(dòng)發(fā)送一個(gè)叫做探測報(bào)文段的特殊的報(bào)文段,這個(gè)報(bào)文段只有一個(gè)字節(jié)的數(shù)據(jù)。測報(bào)文段有一個(gè)序號(hào),但它的序號(hào)永遠(yuǎn)不需要確認(rèn);甚至在計(jì)算機(jī)對其他部分的數(shù)據(jù)的確認(rèn)時(shí)該序號(hào)也被忽略。探測報(bào)文段提醒接受TCP:確認(rèn)已丟失,必須重傳

  • 堅(jiān)持計(jì)時(shí)器值的設(shè)置:設(shè)置為重傳時(shí)間的值。但如果沒有收到接收端的響應(yīng),則會(huì)發(fā)送另一個(gè)探測報(bào)文段,并將計(jì)時(shí)器的值加倍并復(fù)位,直到大于門限值(一般為60秒)。在此之后,發(fā)送端會(huì)每隔60秒發(fā)送一個(gè)探測報(bào)文段,直到窗口重新打開。

?;钣?jì)時(shí)器(Keeplive Timer)

如果客戶打開了到服務(wù)器的連接,傳送了一些數(shù)據(jù),然后就保持靜默了。也許這個(gè)客戶出故障了。在這種情況下,這個(gè)連接將永遠(yuǎn)的處理打開狀態(tài)。這個(gè)時(shí)候就要用到?;钣?jì)時(shí)器

  • 目的:主要是為了防止兩個(gè)TCP連接出現(xiàn)長時(shí)間的空閑。

  • 工作原理:每當(dāng)服務(wù)器端收到客戶端的數(shù)據(jù)時(shí),都將保活計(jì)時(shí)器重新設(shè)置(通常設(shè)置為2小時(shí))。過了2小時(shí)后,服務(wù)器端如果沒有收到客戶端的數(shù)據(jù),會(huì)發(fā)送探測報(bào)文段給客戶端,并且每隔75秒發(fā)送一個(gè),當(dāng)連續(xù)發(fā)送10次以后,仍沒有收到對端的來信,則服務(wù)器端認(rèn)為客戶端出現(xiàn)故障,并會(huì)終止連接。

時(shí)間等待計(jì)時(shí)器(Timer_Wait Timer)

時(shí)間等待計(jì)時(shí)器是在四次揮手的時(shí)候使用的。
在第四次揮手的時(shí)候,客戶端還要等待2MSL(MSL=maxinum segment lifetime最長報(bào)文生存時(shí)間,2MSL就是兩倍的MSL)才能真正的關(guān)閉連接。

TCP的四次揮手
  • MSL(Maximum Segment Lifetime)即報(bào)文段最大生存時(shí)間

  • 等待2MAL時(shí)間的目的:如果服務(wù)器端沒有收到最后一個(gè)ACK字段,則會(huì)在超時(shí)后重發(fā)第三次揮手的FIN字段,主動(dòng)關(guān)閉方接到重傳的FIN字段會(huì)重新發(fā)送ACK。

  • 處在TIME_WAIT狀態(tài)的兩端端口都不能使用,等到2MSL時(shí)間結(jié)束后才能繼續(xù)使用。

  • 當(dāng)連接處于2MSL等待階段時(shí),有兩個(gè)好處:一是任何遲到的報(bào)文段將會(huì)被丟棄。二是會(huì)有更大的機(jī)會(huì)讓丟失的ACK字段再次被發(fā)送出去,讓“四次揮手”更加可靠。

  • 該狀態(tài)設(shè)計(jì)在主動(dòng)關(guān)閉方的理由:由主動(dòng)關(guān)閉方發(fā)送最后一次ACK字段;只要由一方保持TIME_WAIT(時(shí)間等待)狀態(tài),就能起到避免連接在2MSL內(nèi)重新建立,不需要雙方都有

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容