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:擁塞窗口
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 步中設置的值)。