TCP 可靠傳輸的實現-02超時重傳時間的選擇/03選擇確認 SACK

dengjili發表於2020-10-12

02超時重傳時間的選擇

  • TCP 每傳送一個報文段,就對這個報文段設定一次計時器。
  • 只要計時器設定的重傳時間到但還沒有收到確認,就要重傳這一報文段。

由於TCP的下層是網際網路環境,傳送的報文段可能只經過一個高速率的區域網,也可能經過多個低速率的網路,並且每個IP資料包所選擇的路由還可能不同。如果把超時重傳時間設定得太短,就會引起很多報文段的不必要的重傳,使網路負荷增大。但若把超時重傳時間設定得過長,則又使網路的空閒時間增大,降低了傳輸效率。

在這裡插入圖片描述

TCP 採用了一種自適應演算法,它記錄一個報文段發出的時間,以及收到相應的確認的時間。這兩個時間之差就是報文段的往返時間 RTT。
在這裡插入圖片描述

超時重傳時間 RTO介紹
在這裡插入圖片描述

往返時間 (RTT) 的測量
在這裡插入圖片描述

如何判定此確認報文段是對原來的報文段 1 的確認,還是對重傳的報文段 2 的確認?

Karn 演算法

  • 在計算平均往返時間 RTT 時,只要報文段重傳了,就不採用其往返時間樣本。
  • 這樣得出的加權平均平均往返時間 RTTS 和超時重傳時間 RTO 就較準確。
  • 但是,這又引起新的問題。當報文段的時延突然增大了很多時,在原來得出的重傳時間內,不會收到確認報文段。於是就重傳報文段。但根據Karn演算法,不考慮重傳的報文段的往返時間樣本。這樣,超時重傳時間就無法更新。

修正的 Karn 演算法
在這裡插入圖片描述

03選擇確認 SACK

問題:若收到的報文段無差錯,只是未按序號,中間還缺少一些序號的資料,那麼能否設法只傳送缺少的資料而不重傳已經正確到達接收方的資料?
答案是可以的。選擇確認 SACK (Selective ACK) 就是一種可行的處理方法。
在這裡插入圖片描述

RFC 2018 的規定

  • 如果要使用選擇確認,那麼在建立 TCP 連線時,就要在 TCP 首部的選項中加上“允許 SACK”的選項,而雙方必須都事先商定好。
  • 如果使用選擇確認,那麼原來首部中的“確認號欄位”的用法仍然不變。只是以後在 TCP 報文段的首部中都增加了 SACK 選項,以便報告收到的不連續的位元組塊的邊界。
  • 由於首部選項的長度最多隻有 40 位元組,而指明一個邊界就要用掉 4 位元組,因此在選項中最多隻能指明 4 個位元組塊的邊界資訊。另外還需要兩個位元組。一個位元組用來指明是SACK選項,另一個位元組是指明這個選項要佔用多少位元組。如果要報告五個位元組塊的邊界資訊,那麼至少需要42個位元組。

相關文章