《TCP-IP詳解卷一:協議》第21章——TCP的超時與重傳(讀後筆記)

21.1 引言

(複習建議先看小結,中間講的順序略亂,筆記也亂)

數據和確認都可能丟失,TCP 通過定時器解決,超時則重傳數據。

接下來問題是,超時和重傳的策略,超時時間間隔和重傳頻率。

TCP 管理四個不同的定時器

  • 重傳定時器
  • 堅持定時器
  • 保活定時器
  • 2MSL定時器

21.2 超時與重傳的簡單例子

在這個例子中,超時重傳時間間隔從 1.5 秒,一直翻倍到 64 秒,並在 9 分鐘後放棄併發送 RST 信號。

其中倍數關係被稱爲『指數退避』

21.3 往返時間測量

往返時間(RTT)經常發生變化,TCP 跟蹤這些變化並修改超時時間。

這一段我覺得不適合我。

21.4 往返時間RTT的例子

21.4.1 往返時間RTT的測量

這個例子中,有一個 TCP 定時器一次滴答 500 ms。

一個 550 ms RTT 可能被當成 1 或 2 個 TCP 時鐘滴答。計算方式可以這麼看,經過計時器結束和開始分界線數量來算時鐘滴答。

21.4.2 RTT估計器的計算

我選擇放棄

21.4.3 慢啓動

20.6 節已經介紹

21.5 擁塞舉例

舉了一個 TCP 丟失重傳的例子

快速重傳算法:伯克利的 TCP 實現,對收到的重複 ACK 進行計數,當收到第3個時就假定那個序號的報文段已經丟失。

接收方對於收到失序的 TCP,將保存數據並返回期望的 ACK(這個重複 ACK 不應該被時延)。

21.6 擁塞避免算法

擁塞避免算法:一種處理丟失分組的方法,算法假定分組受到損壞引起的丟失是非常少的。

兩種分組丟失的指示:

  • 超時
  • 接收到重複的確認

擁塞避免算法和慢啓動算法需要維持兩個變量:一個擁塞窗口 cwnd 和一個慢啓動門限 ssthresh

(21.12 總結總體過程,如何進行擁塞控制)

算法流程如下:(這是大概的擁塞控制)

  • 對一個給定的連接,初始化 cwnd 爲 1 個報文段,ssthresh 爲 65535 個字節
  • TCP 發送方的輸出不能超過 cwnd 和接收方通告窗口的大小
  • 當擁塞發生時(超時或收到重複確認),ssthresh 被設置爲當前窗口大小的一半(cwnd 和接收方通告窗口大小的最小值,最少爲 2個報文段) 。
    • 如果是超時引發的擁塞,還將 cwnd 被設置爲 1 個報文段(因爲超時更嚴重吧)
    • 重複 ACK cwnd 被置爲原來窗口大小 1/2,書上沒看到這句。如果收到重複 ACK 如果只執行 ssthresh 減半,有什麼意義?之後如果超時引起擁塞,ssthresh 又被更新前面操作也不會有任何意義。可能是我沒看見或者理解有問題。
      下面一節是講這個問題。。不想刪了這段思考過程

擁塞避免(窗口)是發送方使用的流量控制,發送方感受到的網絡擁塞的估計。

通告窗口則是接收方進行的流量控制,接收方在該連接上的可用緩存大小有關。

慢啓動算法:每收到一個確認,cwnd 增加 1。這樣窗口大小會指數增長。

擁塞避免算法:每收到一個確認 cwnd 增加 1/cwnd(21.8 節有具體細節)。這樣窗口大小是線性增長。

21.7 快速重傳與快速恢復算法

收到三個重複 ACK 執行快速恢復算法流程如下:

  • 當收到 3 個以上重複的 ACK 時

    • 如果是第三次收到 ssthresh 設置爲當前擁塞窗口 cwnd 的一半。
    • cwnd 被置爲當前 ssthresh 加上所收到的重複的 ACK 數乘以報文段大小,然後發送重傳數據。
  • 當下一個確認『新』數據的 ACK 到達時,設置 cwnd 爲 ssthresh(在第 1 步中設置的值)。

每收到一個 ACK,說明一個報文段被接收

這裏收到三個以上重複 ack,cwnd 設置的細節是通過 21.8 節例子補充,可能有誤。

21.8 擁塞舉例(續)

這裏擁塞避免 cwnd 的增加算法是

cwnd=cwnd+segsizesegsizecwnd+segsize8cwnd = cwnd + \frac{segsize*segsize}{cwnd}+\frac{segsize}{8}

cwnd:擁塞窗口

segsize:單個報文段大小

前面提到增加的是 1/cwnd,應該指的是近似值。

21.9 按每條路由進行度量

路由表項中保存着度量 RTT 的數據。建立連接時,如果該連接將要使用的路由表項已經有這些度量的值,則用這些度量來對相應的變量進行初始化。

21.10 ICMP的差錯

沒看 ICMP 那章略過。

21.11 重新分組

當 TCP 超時並重傳時,不一定要重傳同樣的報文段。TCP 允許進行重新分組發送一個較大的報文段,有助於提高性能

21.12 小結

主要講了如下幾個

慢啓動:擁塞窗口指數的增長

擁塞避免:擁塞窗口線性的增長

快速重傳:收到三個重複 ACK 進入重傳

快速恢復:快速重傳觸發的算法

我的擁塞控制總結

cwnd:擁塞窗口

ssthresh:慢啓動門限,當作閾值

擁塞控制流程如下:

  • 對一個給定的連接,初始化(大概是) cwnd 爲 1 個報文段,ssthresh 爲 65535 個字節
  • TCP 發送方的輸出不能超過 cwnd 和接收方通告窗口的大小
    • 超時引發擁塞,ssthresh 被設置爲當前窗口大小的一半(cwnd 和接收方通告窗口大小的最小值,最少爲 2個報文段),cwnd 被設置爲 1 個報文段。
    • 收到重複ACK引發擁塞,啓動快速恢復算法。
  • 『新』的數據被確認時,增加 cwnd,增加的方法通過判斷 cwnd 是否小於或等於 ssthresh,是則慢啓動,否則擁塞避免

快速恢復算法如下:

  • 當收到 3 個以上重複的 ACK 時

    • 如果是第三次收到 ssthresh 設置爲當前擁塞窗口 cwnd 的一半。
    • cwnd 被置爲當前 ssthresh 加上所收到的重複的 ACK 數乘以報文段大小,然後發送重傳數據。
  • 當下一個確認『新』數據的 ACK 到達時,設置 cwnd 爲 ssthresh(在第 1 步中設置的值)。

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