TCP如何實現可靠性

2021-07-15 10:06:04 字數 3814 閱讀 2489

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> 能夠處理接收端資料亂序到達問題。

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

TCP如何實現可靠性

一 綜述 1 確認和重傳 接收方收到報文就會確認,傳送方傳送一段時間後沒有收到確認就重傳。2 資料校驗 3 資料合理分片和排序 udp ip資料報大於1500位元組,大於mtu.這個時候傳送方ip層就需要分片 fragmentation 把資料報分成若干片,使每一片都小於mtu.而接收方ip層則需要...

TCP如何保證可靠性

重傳機制 針對資料報丟失或者出現定時器超時 確認應答 停止等待協議,傳送之後等待收到應答。序列號 針對資料報到達接收端主機順序亂掉 流量控制 針對避免網路擁堵時候 針對高效傳輸資料報的流動視窗的控制 擁塞控制 針對剛開始啟動的時候避免一下子傳送大量資料報而導致網路癱瘓的慢啟動演算法和擁塞控制。校驗和...

TCP 如何保證可靠性

1.校驗和 校驗範圍包括tcp首部和資料部分。在傳送方將整個報文段分為多個16位的段,然後將所有段進行反碼相加,將結果存放在校驗和字段中,接收方用相同的方法進行計算,若最終結果為校驗字段所有位是全1則正確 udp中為0是正確 否則出現錯誤。若校驗出包有錯,則丟棄報文段並且不給出響應,這時tcp傳送資...