可靠數據傳輸

可靠數據傳輸是指:數據可以通過一條可靠信道來傳輸。傳輸的數據不會受到損失或者丟失,而且所有數據都是按照其發送順序進行交付。

我們都知道 IP 層是不可靠傳輸的,而 TCP 是可靠傳輸的,但是 TCP 是傳輸層的協議,這就要求設計一個合理的協議機制,當底層丟失的時候,需要如何處理。下面一步步構造可靠數據傳輸協議。稱之爲 rdt 協議。

在 rdt1.0 中,我們先考慮一個最簡單的情況,即底層信道是完全可靠的。

正如我們日常生活中一樣,數據錯誤的時候需要重新發送,在 rdt2.0 中採用的是自動重傳協議(ARQ),一旦出現錯誤,那麼可靠數據傳輸協議就會自動重傳數據。當然,我們需要確定什麼時候需要重傳,如何告訴發送方,重傳。因此,rdt2.0 相比於 1.0 版本而言,增加了一下機制:

  1. 差錯檢測 2. 接收方反饋 3. 重傳

差錯檢測可以使用檢驗和,接收方反饋的情況無非就是 “肯定確認”(ACK)和 “否定確認”(NAK)。當發送方接收到接收方反饋回來的 NAK 消息時,發送方重傳該分組。

如果反饋的是 ACK,那麼說明數據無誤,進入等待上層數據狀態;如果反饋消息是 NAK,那麼重發分組,並且繼續等待接收方的反饋消息,直到等到 ACK 消息,才進入等待上層數據狀態。需要注意,在這種情形下,不能在等待 ACK 和 NAK 的時候從上層獲取數據。稱之爲 “停等” 協議。

那麼在 rdt3.0 中存在的新問題就是如何解決丟失的數據的重傳問題,其他的問題在 rdt2.0 中就已經解決了。

我們的解決方案是 “發送方在一個合理的時間內等待 ACK”。如果一旦超出這個時間還沒有收到 ACK,那麼發送方就重傳;

已經有一個可靠數據傳輸的基本協議——rdt3.0 了。這個協議的致命問題是 “效率太低了”。如果想讓 rdt3.0 能夠使用,我們就必須解決“停等” 這個問題。直觀的方式就是“允許發送方一次性發送多個分組”。這樣就能大大提高物理鏈路的利用率。

GBN 協議(回退 N 步),它允許發送多個分組而不需要等待確認。但它受限制於窗口的大小 N。

GBN 協議也常被成爲滑動窗口協議。在 GBN 協議中,發送方首先檢查窗口大小是否是滿的,如果沒有滿,那麼就產生一個分組並將其發送,並且同時更新變量。如果窗口已經滿了,那麼發送方給上層指出已滿。然後上層會等一會再來試。發送方收到 ACK 應答的方式是 “累計確認”。這表明接收方已經正確接受到序列爲 N 的以前的所有分組。當超時事件發生的時候,GBN 協議是“回退 N 步” 來進行處理的。它將已經確認收到之後所有已發送但未確認的分組重傳。這樣能夠保證分組的順序。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/w7rT7BJ15J4_Ih9EmfS3Dw