TCP協(xié)議可靠性及重傳策略實(shí)現(xiàn)
可靠性TCP提供一種面向連接的、可靠的字節(jié)流服務(wù)。面向連接意味著兩個(gè)使用TCP的應(yīng)用(通常是一個(gè)客戶和一個(gè)服務(wù)器)在彼此交換數(shù)據(jù)包之前必須先建立一個(gè)TCP連接。這一過程與打電話很相似,先撥號振鈴,等待對方摘機(jī)說“喂”,然后才說明是誰。在一個(gè)TCP連接中,僅有兩方進(jìn)行彼此通信。廣播和多播不能用于TCP。
TCP通過下列方式來提供可靠性:
1.應(yīng)用數(shù)據(jù)被分割成TCP認(rèn)為最適合發(fā)送的數(shù)據(jù)塊。這和UDP完全不同,應(yīng)用程序產(chǎn)生的數(shù)據(jù)長度將保持不變。由TCP傳遞給IP的信息單位稱為報(bào)文段或段(segment)。2.當(dāng)TCP發(fā)出一個(gè)段后,它啟動一個(gè)定時(shí)器,等待目的端確認(rèn)收到這個(gè)報(bào)文段。如果不能及時(shí)收到一個(gè)確認(rèn),將重發(fā)這個(gè)報(bào)文段。當(dāng)TCP收到發(fā)自TCP連接另一端的數(shù)據(jù),它將發(fā)送一個(gè)確認(rèn)。TCP有延遲確認(rèn)的功能,在此功能沒有打開,則是立即確認(rèn)。功能打開,則由定時(shí)器觸發(fā)確認(rèn)時(shí)間點(diǎn)。3.TCP將保持它首部和數(shù)據(jù)的檢驗(yàn)和。這是一個(gè)端到端的檢驗(yàn)和,目的是檢測數(shù)據(jù)在傳輸過程中的任何變化。如果收到段的檢驗(yàn)和有差錯(cuò),TCP將丟棄這個(gè)報(bào)文段和不確認(rèn)收到此報(bào)文段(希望發(fā)端超時(shí)并重發(fā))。4.既然TCP報(bào)文段作為IP數(shù)據(jù)報(bào)來傳輸,而IP數(shù)據(jù)報(bào)的到達(dá)可能會失序,因此TCP報(bào)文段的到達(dá)也可能會失序。如果必要,TCP將對收到的數(shù)據(jù)進(jìn)行重新排序,將收到的數(shù)據(jù)以正確的順序交給應(yīng)用層。5.既然IP數(shù)據(jù)報(bào)會發(fā)生重復(fù),TCP的接收端必須丟棄重復(fù)的數(shù)據(jù)。6.TCP還能提供流量控制。TCP連接的每一方都有固定大小的緩沖空間。TCP的接收端只允許另一端發(fā)送接收端緩沖區(qū)所能接納的數(shù)據(jù)。這將防止較快主機(jī)致使較慢主機(jī)的緩沖區(qū)溢出。兩個(gè)應(yīng)用程序通過TCP連接交換8bit字節(jié)構(gòu)成的字節(jié)流。TCP不在字節(jié)流中插入記錄標(biāo)識符。我們將這稱為字節(jié)流服務(wù)(bytestreamservice)。如果一方的應(yīng)用程序先傳10字節(jié),又傳20字節(jié),再傳50字節(jié),連接的另一方將無法了解發(fā)方每次發(fā)送了多少字節(jié)。只要自己的接收緩存沒有塞滿,TCP 接收方將有多少就收多少。一端將字節(jié)流放到TCP連接上,同樣的字節(jié)流將出現(xiàn)在TCP連接的另一端。另外,TCP對字節(jié)流的內(nèi)容不作任何解釋。TCP不知道傳輸?shù)臄?shù)據(jù)字節(jié)流是二進(jìn)制數(shù)據(jù),還是ASCⅡ字符、EBCDIC字符或者其他類型數(shù)據(jù)。對字節(jié)流的解釋由TCP連接雙方的應(yīng)用層解釋。
這種對字節(jié)流的處理方式與Unix操作系統(tǒng)對文件的處理方式很相似。Unix的內(nèi)核對一個(gè)應(yīng)用讀或?qū)懙膬?nèi)容不作任何解釋,而是交給應(yīng)用程序處理。對Unix的內(nèi)核來說,它無法區(qū)分一個(gè)二進(jìn)制文件與一個(gè)文本文件。
重傳策略TCP協(xié)議用于控制數(shù)據(jù)段是否需要重傳的依據(jù)是設(shè)立重發(fā)定時(shí)器。在發(fā)送一個(gè)數(shù)據(jù)段的同時(shí)啟動一個(gè)重傳,如果在重傳超時(shí)前收到確認(rèn)(Acknowlegement)就關(guān)閉該重傳,如果重傳超時(shí)前沒有收到確認(rèn),則重傳該數(shù)據(jù)段。在選擇重發(fā)時(shí)間的過程中,TCP必須具有自適應(yīng)性。它需要根據(jù)互聯(lián)網(wǎng)當(dāng)時(shí)的通信情況,給出合適的重發(fā)時(shí)間。這種重傳策略的關(guān)鍵是對定時(shí)器初值的設(shè)定。采用較多的算法是Jacobson于1988年提出的一種不斷調(diào)整超時(shí)時(shí)間間隔的動態(tài)算法。其工作原理是:對每條連接TCP都保持一個(gè)變量RTT(Round Trip Time),用于存放當(dāng)前到目的端往返所需要時(shí)間最接近的估計(jì)值。當(dāng)發(fā)送一個(gè)數(shù)據(jù)段時(shí),同時(shí)啟動連接的定時(shí)器,如果在定時(shí)器超時(shí)前確認(rèn)到達(dá),則記錄所需要的時(shí)間(M),并修正RTT的值,如果定時(shí)器超時(shí)前沒有收到確認(rèn),則將RTT的值增加1倍。通過測量一系列的RTT(往返時(shí)間)值,TCP協(xié)議可以估算數(shù)據(jù)包重發(fā)前需要等待的時(shí)間。在估計(jì)該連接所需的當(dāng)前延遲時(shí)通常利用一些統(tǒng)計(jì)學(xué)的原理和算法(如Karn算法),從而得到TCP重發(fā)之前需要等待的時(shí)間值。