TCP-IP協(xié)議詳解(11) TCP重傳

TCP協(xié)議是一個(gè)可靠的協(xié)議夏志。它通過(guò)重新發(fā)送(retransmission)來(lái)實(shí)現(xiàn)TCP片段傳輸?shù)目煽啃浴:?jiǎn)單的說(shuō),TCP會(huì)不斷重復(fù)發(fā)送TCP片段,直到片段被正確接收领追。

TCP片段丟失

TCP頭部的checksum


接收方(receiver)可以通過(guò)校驗(yàn)TCP片段頭部中checksum區(qū)域來(lái)檢驗(yàn)TCP片段是否出錯(cuò)。我們已經(jīng)接觸過(guò)了IP協(xié)議詳解的checksum算法响逢。TCP片段的checksum算法與之類(lèi)似绒窑。IP協(xié)議的checksum只校驗(yàn)頭部,TCP片段頭部的checksum會(huì)校驗(yàn)包括IP頭部舔亭、TCP頭部和TCP數(shù)據(jù)在內(nèi)的整個(gè)序列些膨,確保IP地址、端口號(hào)和其他相關(guān)信息正確钦铺。如果TCP片段出錯(cuò)订雾,接收方可以簡(jiǎn)單的丟棄改TCP片段,也就相當(dāng)于TCP片段丟失矛洞。

TCP片段包裹在一個(gè)IP包中傳輸洼哎。IP包可能在網(wǎng)絡(luò)中丟失。導(dǎo)致IP包丟失的原因可能有很多缚甩,比如IP包經(jīng)過(guò)太多的路由器接力谱净,達(dá)到hop limit;比如路由器太過(guò)擁擠擅威,導(dǎo)致一些IP包被丟棄壕探;再比如路由表(routing table)沒(méi)有及時(shí)更新,導(dǎo)致IP包無(wú)法送達(dá)目的地郊丛。

下面我們要介紹兩種重新發(fā)送TCP片段的機(jī)制:超時(shí)重新發(fā)送和快速重新發(fā)送李请。

超時(shí)重新發(fā)送

我們之前已經(jīng)簡(jiǎn)單介紹過(guò)重新發(fā)送的機(jī)制:當(dāng)發(fā)送方送出一個(gè)TCP片段后,將開(kāi)始計(jì)時(shí)厉熟,等待該TCP片段的ACK回復(fù)导盅。如果接收方正確接收到符合次序的片段,接收方會(huì)利用ACK片段回復(fù)發(fā)送方揍瑟。發(fā)送方得到ACK回復(fù)后白翻,繼續(xù)移動(dòng)窗口,發(fā)送接下來(lái)的TCP片段。如果直到計(jì)時(shí)完成滤馍,發(fā)送方還是沒(méi)有收到ACK回復(fù)岛琼,那么發(fā)送方推斷之前發(fā)送的TCP片段丟失,因此重新發(fā)送之前的TCP片段巢株。這個(gè)計(jì)時(shí)等待的時(shí)間叫做重新發(fā)送超時(shí)時(shí)間(RTO, retransmission timeout)槐瑞。

RTO:沙漏中沙子的多少


發(fā)送方應(yīng)該在等待多長(zhǎng)時(shí)間之后重新發(fā)送呢?這是重新發(fā)送的核心問(wèn)題阁苞。上述過(guò)程實(shí)際上有往返兩個(gè)方向:1. 發(fā)送片段從發(fā)送方到接收方的傳輸困檩,2. ACK片段從接收方到發(fā)送方的傳輸。整個(gè)過(guò)程實(shí)際耗費(fèi)的時(shí)間稱做往返時(shí)間(RTT, round trip time)那槽。如果RTT是固定的悼沿,比如1秒,那么我們可以讓RTO等于RTT倦炒。但實(shí)際上显沈,RTT的上下浮動(dòng)很大。比如某個(gè)時(shí)刻逢唤,網(wǎng)絡(luò)中有許多交通拉讯,那么RTT就增加。在RTT浮動(dòng)的情況下鳖藕,如果我們?cè)O(shè)置了過(guò)小的RTO魔慷,那么TCP會(huì)等待很短的時(shí)間之后重新發(fā)送,而實(shí)際上之前發(fā)送的片段并沒(méi)有丟失著恩,只是傳輸速度比較慢而已院尔,這樣,網(wǎng)絡(luò)中就被重復(fù)注入TCP片段喉誊,從而浪費(fèi)網(wǎng)絡(luò)傳輸資源邀摆。另一方面,如果RTO時(shí)間過(guò)長(zhǎng)伍茄,那么當(dāng)TCP片段已經(jīng)實(shí)際丟失的情況下栋盹,發(fā)送方不能及時(shí)重新發(fā)送,會(huì)造成網(wǎng)絡(luò)資源的閑置敷矫。所以例获,RTO必須符合當(dāng)前網(wǎng)絡(luò)的使用狀況。網(wǎng)絡(luò)狀況越好曹仗,RTO應(yīng)該越短榨汤;網(wǎng)絡(luò)狀況越差,RTO應(yīng)該越長(zhǎng)怎茫。

RTT: 往返時(shí)間

TCP協(xié)議通過(guò)統(tǒng)計(jì)RTT收壕,來(lái)決定合理的RTO。發(fā)送方可以測(cè)量每一次TCP傳輸?shù)腞TT (從發(fā)送出數(shù)據(jù)片段開(kāi)始,到接收到ACK片段為止)啼器,這樣的每次測(cè)量得到的往返時(shí)間旬渠,叫做采樣RTT(srtt, sampling round trip time)。建立連接之后端壳,每次的srtt作為采樣樣本,計(jì)算平均值(mean)和標(biāo)準(zhǔn)差(standard deviation)枪蘑,并讓RTO等于srtt平均值加上四倍的srtt標(biāo)準(zhǔn)差损谦。

RTO = mean + 4 std

(上述算法有多個(gè)變種,根據(jù)平臺(tái)不同有所變化)

平均值反映了平均意義上的RTT岳颇,平均往返時(shí)間越大照捡,RTO越大。另一方面话侧,標(biāo)準(zhǔn)差越大也會(huì)影響RTO栗精。標(biāo)準(zhǔn)差代表了RTT樣本的離散程度。如果RTT上下劇烈浮動(dòng)瞻鹏,標(biāo)準(zhǔn)差比較大悲立。RTT浮動(dòng)大,說(shuō)明當(dāng)前網(wǎng)絡(luò)狀況相對(duì)不穩(wěn)定新博。因此要設(shè)置更長(zhǎng)的RTO薪夕,以應(yīng)對(duì)不穩(wěn)定的網(wǎng)絡(luò)狀況。

快速重新發(fā)送

我們剛才介紹了超時(shí)重新發(fā)送的機(jī)制:發(fā)送方送出一個(gè)TCP片段赫悄,然后開(kāi)始等待并計(jì)時(shí)原献,如果RTO時(shí)間之后還沒(méi)有收到ACK回復(fù),發(fā)送方則重新發(fā)送埂淮。TCP協(xié)議有可能在計(jì)時(shí)完成之前啟動(dòng)重新發(fā)送姑隅,也就是利用快速重新發(fā)送(fast-retransmission)【笞玻快速發(fā)送機(jī)制如果被啟動(dòng)讲仰,將打斷計(jì)時(shí)器的等待,直接重新發(fā)送TCP片段误窖。

由于IP包的傳輸是無(wú)序的叮盘,所以接收方有可能先收到后發(fā)出的片段,也就是亂序(out-of-order)片段霹俺。亂序片段的序號(hào)并不等于最近發(fā)出的ACK回復(fù)號(hào)柔吼。已接收的文本流和亂序片段之間將出現(xiàn)空洞(hole),也就是等待接收的空位丙唧。比如已經(jīng)接收了正常片段5,6,7愈魏,此時(shí)又接收亂序片段9。這時(shí)片段8依然空缺,片段8的位置就是一個(gè)空洞培漏。

補(bǔ)上空洞


TCP協(xié)議規(guī)定溪厘,當(dāng)接收方收到亂序片段的時(shí)候,需要重復(fù)發(fā)送ACK牌柄。比如接收到亂序片段9的時(shí)候畸悬,接收方需要回復(fù)ACK∩河叮回復(fù)號(hào)為8 (7+1)蹋宦。此后接收方如果繼續(xù)收到亂序片段(序號(hào)不是8的片段),將再次重復(fù)發(fā)送ACK=8咒锻。當(dāng)發(fā)送方收到3個(gè)ACK=8的回復(fù)時(shí)冷冗,發(fā)送方推斷片段8丟失。即使此時(shí)片段8的計(jì)時(shí)器還沒(méi)有超時(shí)惑艇,發(fā)送方會(huì)打斷計(jì)時(shí)蒿辙,直接重新發(fā)送片段8,這就是快速重新發(fā)送機(jī)制(fast-retransmission)滨巴。

快速重新發(fā)送機(jī)制利用重復(fù)的ACK來(lái)提示空洞的存在思灌。當(dāng)重復(fù)次數(shù)達(dá)到閾值時(shí),認(rèn)為空洞對(duì)應(yīng)的片段在網(wǎng)絡(luò)中丟失兢卵∠肮澹快速重新發(fā)送機(jī)制提高了檢測(cè)丟失片段的效率,往往可以在超時(shí)之前探測(cè)到丟失片段秽荤,并重復(fù)發(fā)送丟失的片段甜奄。

總結(jié)

鳳凰浴火重生。而TCP協(xié)議利用重新發(fā)送(retransmission)來(lái)實(shí)現(xiàn)TCP傳輸?shù)目煽啃郧钥睢V匦掳l(fā)送的基本形式是超時(shí)重新發(fā)送课兄,根據(jù)統(tǒng)計(jì)的往返時(shí)間來(lái)設(shè)置超時(shí)標(biāo)準(zhǔn);如果超時(shí)晨继,則重新發(fā)送TCP片段烟阐。另一方面,快速重新發(fā)送則通過(guò)亂序片段的ACK來(lái)更早的推斷出片段的丟失紊扬。


【TCP/IP詳解】系列教程

互聯(lián)網(wǎng)協(xié)議入門(mén) 1

互聯(lián)網(wǎng)協(xié)議入門(mén) 2

TCP-IP協(xié)議詳解(1)網(wǎng)絡(luò)協(xié)議概觀

TCP-IP協(xié)議詳解(2) 以太網(wǎng)與WiFi協(xié)議

TCP-IP協(xié)議詳解(3) IP/ARP/RIP/BGP協(xié)議

TCP-IP協(xié)議詳解(4)IPv4與IPv6地址

TCP-IP協(xié)議詳解(5)IP協(xié)議詳解

TCP-IP協(xié)議詳解(6) ICMP協(xié)議

TCP-IP協(xié)議詳解(7) UDP協(xié)議

TCP-IP協(xié)議詳解(8) TCP協(xié)議與流通信

TCP-IP協(xié)議詳解(9) TCP連接

TCP-IP協(xié)議詳解(10) TCP滑窗管理

TCP-IP協(xié)議詳解(11) TCP重傳

TCP-IP協(xié)議詳解(12) TCP堵塞控制

TCP-IP協(xié)議詳解(13) DNS協(xié)議

TCP-IP協(xié)議詳解(14) CIDR與NAT

TCP-IP協(xié)議詳解(15) HTTP協(xié)議概覽

圖解TCP-IP協(xié)議

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜒茄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子餐屎,更是在濱河造成了極大的恐慌檀葛,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腹缩,死亡現(xiàn)場(chǎng)離奇詭異屿聋,居然都是意外死亡空扎,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)润讥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)转锈,“玉大人,你說(shuō)我怎么就攤上這事楚殿〈榭” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵勒魔,是天一觀的道長(zhǎng)甫煞。 經(jīng)常有香客問(wèn)我,道長(zhǎng)冠绢,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任常潮,我火速辦了婚禮弟胀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘喊式。我一直安慰自己孵户,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布岔留。 她就那樣靜靜地躺著夏哭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪献联。 梳的紋絲不亂的頭發(fā)上竖配,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音里逆,去河邊找鬼进胯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛原押,可吹牛的內(nèi)容都是我干的胁镐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼诸衔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼盯漂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起笨农,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤就缆,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后磁餐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體违崇,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡阿弃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了羞延。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渣淳。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖伴箩,靈堂內(nèi)的尸體忽然破棺而出入愧,到底是詐尸還是另有隱情,我是刑警寧澤嗤谚,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布棺蛛,位于F島的核電站,受9級(jí)特大地震影響巩步,放射性物質(zhì)發(fā)生泄漏旁赊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一椅野、第九天 我趴在偏房一處隱蔽的房頂上張望终畅。 院中可真熱鬧,春花似錦竟闪、人聲如沸离福。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)妖爷。三九已至,卻和暖如春理朋,著一層夾襖步出監(jiān)牢的瞬間絮识,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工暗挑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留笋除,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓炸裆,卻偏偏與公主長(zhǎng)得像垃它,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子烹看,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1.這篇文章不是本人原創(chuàng)的国拇,只是個(gè)人為了對(duì)這部分知識(shí)做一個(gè)整理和系統(tǒng)的輸出而編輯成的,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,068評(píng)論 6 174
  • 21.1 引言 TCP提供可靠的運(yùn)輸層惯殊。它使用的方法之一就是確認(rèn)從另一端收到的數(shù)據(jù)酱吝。但數(shù)據(jù)和確認(rèn)都有可能會(huì)丟失。T...
    張芳濤閱讀 3,005評(píng)論 0 8
  • 個(gè)人認(rèn)為土思,Goodboy1881先生的TCP /IP 協(xié)議詳解學(xué)習(xí)博客系列博客是一部非常精彩的學(xué)習(xí)筆記务热,這雖然只是...
    貳零壹柒_fc10閱讀 5,054評(píng)論 0 8
  • 前言 這篇文章是整個(gè)讀書(shū)總結(jié)系列的最后一篇忆嗜,有關(guān)TCP我想總結(jié)的內(nèi)容都會(huì)在這篇文章結(jié)束。當(dāng)然這并不是TCP的全部崎岂,...
    Noskthing閱讀 2,071評(píng)論 1 27
  • 計(jì)算機(jī)網(wǎng)絡(luò)七層模型中捆毫,傳輸層有兩個(gè)重要的協(xié)議:(1)用戶數(shù)據(jù)報(bào)協(xié)議UDP (User Datagram Proto...
    Q南南南Q閱讀 1,714評(píng)論 0 3