1. 程式人生 > >TCP如何實現可靠性

TCP如何實現可靠性

TCP傳輸控制協議
TCP 協議是一種面向連線的,為不同主機程序間提供可靠資料傳輸的協議。TCP 協議假定其所使用的網路棧下層協議(如IP 協議)是非可靠的,其自身提供機制保證資料的可靠性傳輸。在目前的網路棧協議族中,在需要提供可靠性資料傳輸的應用中,TCP 協議是首選的,有時也是唯一的選擇。TCP協議使用的是網路層協議(如IP協議)提供的服務。
網路層協議主要完成對上層協議的資料的傳遞,但是不提供資料的可靠性傳遞,可靠性主要由上層協議(如TCP協議提供,但是UDP協議不提供可靠性)。

TCP實現可靠性傳輸的底層實現機制主要包括:1> 使用序列號對傳輸的資料進行編號,     2>資料超時重傳,    3>資料確認應答!

網路層協議主要完成的工作是
(1)實現不同網路(主機)間的資料包路由傳遞。

(2) 在傳送端(或中轉站)提供資料包分片功能以使資料包大小滿足 PMTU(路徑MTU(最大尺寸))。

(3) 在接收端提供資料包分片重組功能。

(4) 負責資料包優先順序,安全性等問題。

傳輸層協議(主要是TCP協議)的工作
1> 提供多路複用。

2> 實現資料基本傳輸功能。

3> 建立通訊通道。

4> 提供流量控制。

5> 提供資料可靠性傳輸保證。

資料可靠性傳輸包括的內容

1> 能夠處理資料傳輸過程中被破壞問題。

2> 能夠處理重複資料接收問題。

3> 能夠發現數據丟失以及對此進行有效解決。

4> 能夠處理接收端資料亂序到達問題。

TCP 協議可靠性資料傳輸實現基本原理

TCP 協議必須提供對所有這些問題的解決方案方可保證其所聲稱的資料可靠性傳輸。TCP協議規範和當前絕大多數TCP 協議實現程式碼均採用資料重傳和資料確認應答機制來完成TCP 協議的可靠性資料傳輸。資料超時重傳和資料應答機制的基本前提是對每個傳輸的位元組進行編號,即我們通常所說的序列號。資料超時重傳是傳送端在某個資料包傳送出去,在一段固定時間後如果沒有收到對該資料包的確認應答,則(假定該資料包在傳輸過程中丟失)重新發送該資料包。而資料確認應答是指接收端在成功接收到一個有效資料包後,傳送一個確認應答資料包給傳送端主機,該確認應答資料包中所包含的應答序列號即指已接收到的資料中最後一個位元組的序列號加1,加1 的目的在於指出此時接收端期望接收的下一個資料包中第一個位元組的序列號。資料超時重傳和資料確認應答以及對每個傳輸的位元組分配序列號是TCP 協議提供可靠性資料傳輸的核心本質。

1)資料確認應答資料包中應答序列號的含義

應答序列號並非其表面上所顯示的意義,其實際上是指接收端希望接收的下一個位元組的序列號。所以接收端在成功接收到部分資料後,其傳送的應答資料包中應答序列號被設定為這些資料中最後一個位元組的序列號加一。所以從其含義上來說,應答序列號稱為請求序列號有時更為合適。應答序列號在TCP 首部中應答序列號欄位中被設定。而TCP 首部中序列號欄位表示包含該TCP 首部的資料包中所包含資料的第一個位元組的序列號(令為N)。如果接收端成功接收該資料包,之前又無丟失資料包,則接收端傳送的應答資料包中的應答序列號應該為:N+LEN。其中LEN 為接收的資料包的資料長度。該應答序列號也是傳送端將要傳送的下一個資料包中第一個位元組的序列號(由此亦可看出上文中將應答序列號稱為請求序列號的原因所在)。

2)資料確認應答中的累積效應

TCP 協議中接收端對所接收資料的應答是累積的。累積的含義有二:

1>應答序列號是逐漸遞增的,這與傳送端資料編號是遞增的相吻合。

2>不可進行跨越式資料應答。

所謂不可進行跨越式資料應答,可以以資料包亂序到達為例進行說明。如果由於傳送端所選擇傳輸路徑的不同,較後傳送的序列號較大的資料包先到達接收端,而先發送的序列號較小的資料包由於線路問題(或路由器故障)被暫時延遲在網路中,此時接收端不可對這些序列號較大的資料進行應答。如果接收端需要傳送一個應答資料包,則應答序列號仍然應該設定成對序列號較小的資料包的請求(注意應答序列號指的是接收端希望接收的下一個位元組的序列號,故在資料傳輸過程中將應答資料包稱為資料請求資料包更為合適)。舉例來說,如果接收端目前的應答序列號為201,表示接收端正在等待發送端傳送從201 開始編號的資料,之後傳送端連續傳送了兩個資料包,第一個資料包中資料序列號範圍為201-300,第二個資料包中資料序列號範圍為301-400。如果由於選擇了不同的傳輸路徑造成第二個資料包最先到達接收端,而第一個資料包在網路中延遲了一段時間,則接收端不可對第二個資料包進行應答,即不可傳送應答序列號為401 的確認應答資料包,而是不斷髮送應答序列號為201的應答資料包直到該序列號的資料到達。我們通常所說的快速重傳機制即傳送端在連續接收到3 個相同序列號的應答資料包後需要立刻重傳應答序列號所表示的資料。因為此時表示極有可能出現了資料包丟失的情況,如上例中第一個資料包如果丟失在網路中並且傳送端重傳的相同資料包由於選擇相同的線路也未能到達接收端,則接收端將不斷髮送應答序列號為201 的應答資料包而不會將應答序列號設定為401。注意此時接收端已接收到序列號從301-400 的資料。

3)重傳應答機制與序列號結合:

1> 能夠處理資料在傳輸過程中被破壞的問題。

首先通過對所接收資料包的校驗,確認該資料包中資料是否存在錯誤。如果有,則簡單丟棄或者傳送一個應答資料包重新對這些資料進行請求。傳送端在等待一段時間後,則會重新發送這些資料。本質上,資料傳輸錯誤的解決是通過資料重傳機制完成的。

2> 能夠處理接收重複資料問題。

首先利用序列號可以發現數據重複問題。因為每個傳輸的資料均被賦予一個唯一的序列號,如果到達的兩份資料具有重疊的序列號(如由傳送端資料包重傳造成),則表示出現資料重複問題,此時只須丟棄其中一份保留另一份即可。多個數據包中資料重疊的情況解決方式類似。本質上,資料重複問題的解決是通過檢查序列號完成的。

3> 能夠發現數據丟失以及進行有效解決。

首先必須說明,此處資料包丟失的概念是指在一段合理時間內,應該到達的資料包沒有到達,而非我們平常所理解的永遠不到達。所以資料包丟失與資料包亂序到達有時在判斷上和軟體處理上很難區分。資料丟失的判斷是猜測性的,我們無法確定一個數據包一定丟失在傳輸過程中,大多是被延遲在網路中,即實質的問題只是資料包亂序到達。將二者區分開來的一個主要依據是在合理的時間內,由這個可能丟失的資料包所造成的序列號“空洞“是否能夠被填補上。可能的資料丟失一個顯然的結果是在接收端接收的資料出現序列號不連續現象。如接收端只接收到序列號從1 到100 的資料包,之後又接收到序列號從200 到300 的資料包,而且在一段合理的

時間內(由此基本排除亂序問題),序列號從101 到199 的資料一直未到達,則表示包含序列號從101 到199 的資料包在傳輸過程中很可能丟失(或者有極不正常的延遲)。對資料包是否丟失判斷的另外一個干擾因素是傳送端的重傳機制,如果一個序列號較前的資料包在網路中丟失,造成序列號較後的資料包提前到達接收端,也會暫時造成序列號不連續,但由於傳送端在沒有接收到確認應答時,會重新發送序列號較前的那個資料包,如果此後接收端接收到一個重傳的資料包,則僅僅只會在接收端造成資料包亂序到達的表象。無論實質如何,如果軟體實現判斷出資料包丟失,則接收端將通過不斷髮送對這些丟失的資料的請求資料包(也即應答資料包,見前文中對資料應答資料包和資料應答累積效應的說明)來迫使傳送端重新發送這些資料。通常傳送端自身會自發的重傳這些未得到對方確認的資料,但由於重傳機制採用指數退避演算法,每次重傳的間隔時間均會加倍,所以通過傳送方主動重傳機制恢復的時間較長,而接收端通過不斷髮送對這些丟失資料的請求,傳送端在接收到三個這樣的請求資料包後(三個請求資料包中具有同一個請求序列號–也即前文中所說的應答序列號),會立刻觸發對這些資料的重新發送,這稱為快速恢復或者快速重傳機制。本質上,對於資料丟失問題的解決是通過資料重傳機制完成的。在此過程中序列號和資料確認應答起著關鍵的作用。

4> 能夠處理接收端資料亂序到達問題。

如果通訊雙方存在多條傳輸路徑, 則有可能出現數據亂序問題,即序列號較大的資料先於序列號較小的資料到達,而傳送端確實是按序列號由小到大的順序傳送的。資料亂序的本質是資料都成功到達了,但到達的順序不盡如人意。對這個問題的解決相對比較簡單,只需對這些資料進行重新排序即可。本質上,對資料亂序問題的解決是通過排序資料序列號完成的。