1. 程式人生 > >計算機網路——傳輸層(一)

計算機網路——傳輸層(一)

可靠資料傳輸原理(reliable data transfer protocol, rdt)

rdt 1.0
rdt1.0比較簡單,上層應用呼叫rdt_send(data)向傳送端傳入資料,傳送端呼叫packet = make_pkt(data)方法產生分組,然後再通過udt_send(packet)方法向網路傳輸資料(udt代表不可靠資料傳輸)。
接收端呼叫rdt_rcv(packet)接受來自網路的資料,再從中提取資料extract(packet, data),然後再向上層應用傳遞資料deliver_data(data).
rdt 1.0是建立在可靠的通道傳輸上的協議,也就說在網路上的資料傳輸不會出現任何問題。
在這裡插入圖片描述

rdt 2.0
2.0是建立在只存在分組受損的情況下,在這個協議下增加了反饋資訊ACK和NAK。傳送端傳送完資料後等待接收端的反饋訊號,如果是ACK則表示當前分組成功傳送,傳送端準備傳送下一個分組;如果是NAK則表示當前分組傳送失敗,此時傳送端會重新發現當前分組,然後再次等待接收端的反饋訊號。我們稱傳送端等待反饋訊號的這個狀態為停等狀態
在這裡插入圖片描述
但rdt 2.0會產生一個問題,就是當傳送端收到反饋訊號NAK,並再次傳輸原來的分組時,接收端怎麼分辨這是重發的分組還是新的一個分組呢?所有就產生了 rdt 2.1協議解決這個。
rdt 2.1
在2.1中我們引入新和舊的概念,因為這僅僅只是2種不同的狀態,所有在計算機中我們可以用一個bit來表示,也就是用0和1。若之前一個的分組被標記為0,則如果當前分組的標記為1,當前分組就是新的分組;如果當前分組的標記為0,當前分組就是重傳的分組。所有在正常傳輸時,分組的標記是在0和1之間不斷變化的,這在rdt 3.0中可以得到體現。
在這裡插入圖片描述


傳送端和接收端用NAK0 和NAK1 來檢查新分組和重新分組。然後我們發現可以直接用ACK就能表示這種關係,如果你傳送了分組1,若反饋是ACK 1就表示成功接收了分組1。如果反饋是ACK 0就表示未成功接收分組1,而是等待接收之前的分組0。由此我們引入了rdt 2.2協議。

rdt 2.2
在這裡插入圖片描述

rdt 3.0
2.0是建立在分組或反饋資訊受損的情況下,而3.0則是建立在分組或反饋資訊可能會直接丟失的情況下。

所以在傳送端引入時延的概念,就是在一定時間內沒有收到反饋資訊,則預設意味著分組丟失或反饋資訊丟失。這時候傳送端會自動重新發送分組。這個時延至少應該包括:傳送端和接收端之間的往返時延和接收端的處理時延。

但也存在這樣一種情況,就是分組和反饋資訊並沒有丟失,只不過在路上的時間太長了導致超過了傳送端的判斷時延,這時候傳送端也依然會重新發送分組。不過沒有關係,因為在協議2.0中就已經引入了新和舊的概念,接收端可以判斷當前分組是新的還是舊的,如果由於傳送端的錯誤判斷而傳來一箇舊的分組,接收端有能力自動處理這個分組,而不會引起整個資料包的錯誤。我們稱這種舊的分組為冗餘分組

這是正常情況下的順序流:
在這裡插入圖片描述
簡單說明下上圖的意思:傳送端首先發送分組0,接收端收到分組0,然後給出反饋ACK0,表示已經成功接收分組0,。傳送端收到反饋後傳送新的分組,為了表示這是新的分組,將其標記為分組1,然後傳送給接收端,以此不斷迴圈往復。

這是分組丟失情況下順序流:
在這裡插入圖片描述
反饋資訊ACK丟失的情況跟上圖差不多,我就不畫了。