Rdt(Reliable Data Transfer)可靠數據傳輸

數據傳輸引擎涉及到的rdt(可靠數據傳輸),所以學習一下

在TCP網絡傳輸中,數據都是通過網絡上可靠的通道來傳輸。但實際存在許多狀況,如資料位元錯誤、封包遺失,造車資料不可靠,所以必須建立有效的傳輸協定。

1.rdt1.0
rdt的模型主要是用FSM(Finite State Machine-有限狀態機)來定義狀態與操作方式。

rdt1.0是假設使用最可靠的通道情況。主要有傳輸端與接收端兩個部分,資料傳輸方式很單純,傳輸端等待上層傳資料進來,收到上面的資料以後裝成封包送出去。

接收端收到封包以後,將封包解開,把訊息往上送。

2.rdt2.0

2.0考慮到了資料錯誤的情形,當接收端收到資料,會有ACK(相當於OK)NAK(相當於Send Again)兩種訊息,當資料接收到以後確認無誤,會送ACK給來源已確定資料無誤。當偵測到錯誤時 會傳回NAK通知來源端再送一次。

3.rdt2.1

2.1新增了sequence number,同樣使用ACKNAK來確認訊息,封包的號碼可以用來確認是否重新傳輸封包。例如接收端在等待編號0的封包,結果收到封包1,此時會回傳ACK1給來源端,而正在等候ACK0的來源端收ACK1 表示封包0可能遺失,所以會再重送封包0.

4.rdt2.2

一次使用兩種確認訊息 處理起來比較費力,因此2.2中移除NAK的訊息,在ACK中加入編號 就可以達到確認與否認的效果。

5.rdt3.0

3.0同時考慮到封包遺失與資料錯誤的情形,除了使用ACK機制,另外在傳送端多了倒數計時器,封包送出去如果超過時間仍未收到ACK或是收到不正確編號的ACK,則再送出封包一次。

6.Stop-and_Wait與Pipelined Protocol

rdt3.0雖然確保了資料的可靠性,可是它採用Stop-and-Wait機制,效能方面無法讓人接受,因爲送出封包後必須等待對方迴應才能繼續傳送,假如連線Delay太長,整體效率會嚴重低落。

爲解決這問題,後來發展出 Pipelined Protocol,可以讓傳送端同時傳送多個封包不需等待確認相對的,傳輸端與接收端都必須增加封包的暫存空間與序列號碼。當其中的封包出現錯誤時有不同的回覆方法,主要有Go-Back-N(GBN)Selective Repeat(SR)兩種方法。

Go-Back-N(GBN)

傳輸多個封包 必須有個暫存的區域,暫存的區域中存在着窗格大小(Window Size) N,存放着各種封包(已確認、已送出但未收到ACK、未送出的封包等等)

接收端也會開啓窗格來接收封包,會記着目前收到封包的編號,假設收到順序不對的封包N+1(等待接收第N個,下一個傳來的卻是第N+1),會將N以後的封包全部丟棄,此時傳送端一直沒收到ACK(N),會把N號以後的封包全部重新傳送出去。

Selective Repear(SR)

GBN的傳送方法往往會造成不必要的重複,因此SR的傳送方法就是隻針對未收到的封包做重新傳輸的動作。首先規劃出大小爲N的窗格來限制大小,窗格的基底會停留在最近一個尚未收到ACK的封包區域,當封包時間逾時會重新送出封包,直到收到該封包的ACK 窗格基底纔會往前移動。

7.Flow Control(流量控制)

雖然TCP接收端有緩衝區,但有時候應用程序讀取訊息的速度小於傳輸端傳送訊息的速度,假如緩衝區滿了還繼續傳資料過來,會造成緩衝區溢位的情況,爲避免此狀況,設了一個"receive window(接收窗格簡寫rcvWindow)"變量,用來記錄緩衝區剩餘的空間有多少。

當接收端收到訊息後,會回傳給傳送端rcvWindow的數值,如果rcvWindow=0,傳送端會停止傳輸資料但這個方法會造成問題,假設停止後 接收端一直沒訊息通知傳送端,此時傳送端不會運作,而接收緩衝區也是空的,資料傳輸停止。

因此當接收端rcvWindow=0時,傳送端會持續傳送一個1byte的區段給接收端 以確認緩衝區可否繼續接收資料。




發佈了42 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章