基於IP的可靠數據傳輸堆棧實現技術點

衆所周知,TCP是可靠數據傳輸協議,其是基於不可靠的IP層傳輸之上,建立自身的數據傳輸控制協議,由控制算法實現了可靠的數據傳輸。參照TCP協議以及若干版本的TCP堆棧實現過程,我們可以實現任意基於IP的可靠數據傳輸堆棧。實現可靠以及高效的可靠數據傳輸,主要涉及到邏輯端口、滑動窗口、慢啓動、RTT、快速重傳、delay ack以及亂序丟包處理。

一、           邏輯端口

數據傳輸端口是傳輸建立對應關係的鍵值,其是網絡數據傳輸堆棧的邏輯數據,而並不是物理存在的單元。爲了提高由端口查找對應邏輯數據控制塊的效率,一般實現方法是建立二叉樹結構保存端口和邏輯數據控制塊,同時爲了接近二叉樹最高的查找效率,端口分配一般是採用遞增迴繞的分配方式。

二、           滑動窗口

對於發送方在發送IP數據包的過程中,如何使傳輸既能高效,同時又不會因爲發送過快導致接收方處理慢而使接收緩衝區溢出丟失後面的數據,tcp堆棧採用滑動窗口的機制。窗口大小由接收方通告發送方,發送方發送數據後右移可用窗口左邊框減少滑動窗口大小,接收方收到數據包發送確認,發送方收到確認後,首先提取窗口大小並更新,然後右移可用窗口右邊框增大滑動窗口大小。當接收方收到發送方發送的數據,會在確認的同時把數據放入接收緩衝區,當緩衝區可用空間大小小於窗口大小時,會更新窗口大小。當上層從接收緩衝區取出數據,緩衝區可用空間增大時,也會更新窗口大小。

三、           慢啓動

在實際的可靠網絡傳輸中,並不是數據傳輸雙方建立可靠連接後,發送方就直接發送接收方通告窗口大小的數據,這是爲了避免在廣域網的多級路由環境下路由緩存限製造成的丟包問題。發送方增加一個窗口,稱爲擁塞窗口,發送方發送數據時窗口大小會取通告窗口大小和擁塞窗口大小的最小值。當連接建立時,擁塞窗口大小初始化爲一個報文段的大小,在傳輸過程中,每收到一個確認數據包,擁塞窗口大小會增加一個報文段大小,需要說明的是有些堆棧是指數級增加。

四、           超時時間rtt

發送端向接收端發送數據包之後,會把未確認的數據包放入未確認隊列,等待接收端的確認,如果數據包在鏈路中被丟失,發送端在收不到確認的情況下,需要進行重發。進行重發的條件爲一個閥值時間內沒有收到確認,則重發。這個閥值時間我們成爲RTT。發送一個數據包時,取當前時鐘的值,當該數據包的確認返回時,再取時鐘值,兩次時鐘偏差爲本次的RTT, 記爲M。傳輸模型爲了處理真實環境變化起伏較大的情況,引入均值和方差來計算RTT

Err =    M – A

A  <-   A + gErr

D  <-   D + h(| Err| - D)

RTT = A + 4D

其中A 爲均值 D 爲方差    Jacob模型中g = 1/8   h = 1/4

 

五、           快速重傳

在實際傳輸環境中,發送方向接收方連續發送了nn< 滑動窗口大小)個IP包,由於網絡原因,接收方有可能收到n – 1個包,其中第j個包沒有收到,當接收方收到第j+1, j + 2 , ..n個包後,立即返回確認(ack), ackno爲第j – 1 個包的確認號。

發送方收到重複ackno的確認後,記錄該確認號的重複次數,當達到閥值後,則進入快速重傳流程。由於重新排序處理只可能產生1-2個重複的ACK,所以這個閥值設定爲3。快速重傳的流程爲:

1、  重傳第j個數據包,把擁塞窗口設置爲當前擁塞窗口的一半加3個報文段大小。

2、  後面每收到一個重複的確認,則把擁塞窗口大小加一個報文段大小,併發送一個數據包。

3、  當收到正常的確認,即 Jj + 包的確認,再把擁塞窗口大小設置爲之前的一半,進入正常的傳輸流程。

快速重傳恢復算法是處理正常快速的網絡環境中,網絡設備偶然發生的丟包亂序現象,因爲網絡環境並沒有惡化,所以沒有必要走慢啓動流程,而只是把發送速度減半,進行快速恢復。

六、           Delay ack

在高速網絡中,發送方發送數據包,接收方發送ack進行確認,但是如果對每個數據包都進行確認,即存在效率問題,又浪費了網絡帶寬。在一般TCP實現堆棧中,是使用200毫秒定時器進行時延確認。具體流程爲:

1、  接收方收到數據包,取出seqno,更新ackno.

2、  確認定時器溢出,根據ackno發送ack包。

但是這種方法會造成發送方可用滑動窗口小於一個報文段時,接收方沒有即時確認更新窗口而造成效率浪費。所以在改進實現中,可以設立一個標識,該標識爲緊急確認標識,當接收方收到該標識的報文,則立即確認。

七、           丟包以及亂序處理

可靠傳輸的雙端數據在經過中間網絡設備時,由於設備緩存限制、路由路徑的不一致或其他原因,很有可能發生亂序或丟包情況。如果發生亂序以及偶然丟包(符合快速重傳條件的丟包),則由處理邏輯發送端進行快速重傳。而有些情況是發送端發送了n個包,由於中間一臺路由器緩存達到上限,從第j (j < n)個包開始所有的包都被丟失, 接收端只收到了前j – 1個包,並確認前j – 1個包,發送端遲遲收不到後繼包的確認,等待RTT超時之後,進入超時重傳流程,發送端把慢啓動窗口大小置爲一個報文段大小,並且發送第j個報文段。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章