TCP協(xié)議是一個(gè)可靠的協(xié)議夏志。它通過(guò)重新發(fā)送(retransmission)來(lái)實(shí)現(xiàn)TCP片段傳輸?shù)目煽啃浴:?jiǎn)單的說(shuō),TCP會(huì)不斷重復(fù)發(fā)送TCP片段,直到片段被正確接收领追。
TCP片段丟失
接收方(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)槐瑞。
發(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è)空洞培漏。
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é)議詳解(6) ICMP協(xié)議
TCP-IP協(xié)議詳解(8) TCP協(xié)議與流通信
TCP-IP協(xié)議詳解(13) DNS協(xié)議