TCP 重傳、滑動窗⼝、流量控制、擁塞控制

重傳機制

TCP 會在以下兩種情況發⽣超時重傳:

  • 數據包丟失
  • 確認應答丟失

重傳超時

重傳超時是TCP協議保證數據可靠性的另一個重要機制,其原理是在發送某一個數據以後就開啟一個計時器,在一定時間內如果沒有得到發送的數據報的ACK報文,那麼就重新發送數據,直到發送成功為止。

RTT 是數據從⽹絡⼀端傳送到另⼀端所需的時間,也就是包的往返時間。

RTO (Retransmission Timeout 超時重傳時間)。

如果超時重發的數據,再次超時的時候,⼜需要重傳的時候,TCP 的策略是超時間隔加倍。

超時重傳時間 RTO 的值應該略⼤於報⽂往返 RTT 的值:

快速重傳

快速重傳和恢復(fast retransmit and recovery,FRR)是一種擁塞控制算法,它能快速恢復丟失的數據包。

它不以時間為驅動,⽽是以數據驅動重傳。

Seq 2 丟失,於是後面返回都是ACK 2。收到三個ACk 2之後,在定時器到期之前,重傳Seq 2。

快速重傳的⼯作⽅式是當收到三個相同的 ACK 報⽂時,會在定時器過期之前,重傳丟失的報⽂段。

新的問題?

就是重傳的時候,是重傳之前的⼀個,還是重傳所有。於是提出了SACK方法(Selective Acknowledgment 選擇性確認)。

這種⽅式需要在 TCP 頭部「選項」字段⾥加⼀個 SACK 的東⻄,它可以將緩存的地圖發送給發送⽅,這樣發送
⽅就可以知道哪些數據收到了,哪些數據沒收到,知道了這些信息,就可以只重傳丟失的數據。

如果要⽀持 SACK ,必須雙⽅都要⽀持。在 Linux 下,可以通過 net.ipv4.tcp_sack 參數打開這個功能(Linux
2.4 後默認打開)

滑動窗口

由於大家不知道網絡擁塞狀況,同時發送數據,導致中間節點阻塞掉包,誰也發不了數據,

所以就有了滑動窗口機制來解決此問題。

有了窗⼝,就可以指定窗⼝⼤⼩,窗⼝⼤⼩就是指⽆需等待確認應答,⽽可以繼續發送數據的最⼤值。

窗⼝的實現實際上是操作系統開闢的⼀個緩存空間,發送⽅主機在等到確認應答返回之前,必須在緩衝區中保留已

發送的數據。如果按期收到確認應答,此時數據就可以從緩存區清除。

詳細見圖示:

TCP 滑動窗⼝⽅案使⽤三個指針來跟蹤在四個傳輸類別中的每⼀個類別中的位元組。其中兩個指針是絕對指針(指特定的序列號),⼀個是相對指針(需要做偏移)。

接收窗⼝和發送窗⼝的⼤⼩並不是完全相等,接收窗⼝的⼤⼩是約等於發送窗⼝的⼤⼩的。滑動窗⼝的大小也是根據實際情況不斷變化的。

流量控制

TCP 提供⼀種機制可以讓「發送⽅」根據「接收⽅」的實際接收能⼒控制發送的數據量,這就是所謂的流量控制。

利用上述的滑動窗口與操作系統的緩存結合來控制流量。

大致設計倆個大問題:

  • 滑動窗口怎麼逐漸變小
  • 滑動窗口怎麼關閉

減小的過程應該遵循:先收縮窗⼝,過段時間再減少緩存,這樣就可以避免了丟包情況。

窗口的關閉:窗⼝⼤⼩為 0 時,就會阻⽌發送⽅給接收⽅傳遞數據,直到窗⼝變為⾮ 0 為⽌,這就是窗⼝關閉。

潛在的危險-死鎖

解決很簡單-加定時器,TCP 為每個連接設有⼀個持續定時器,只要 TCP 連接⼀⽅收到對⽅的零窗⼝通知,就啟動持續計時器。

如果持續計時器超時,就會發送窗⼝探測 ( Window probe ) 報⽂,⽽對⽅在確認這個探測報⽂時,給出⾃⼰現在的接收窗⼝⼤⼩。

擁塞控制

擁塞現象是指到達通信子網中某一部分的分組數量過多,使得該部分網絡來不及處理,以致引起這部分乃至整個網絡性能下降的現象,嚴重時甚至會導致網絡通信業務陷入停頓,即出現死鎖現象。

這種現象跟公路網中經常所見的交通擁擠一樣,當節假日公路網中車輛大量增加時,各種走向的車流相互干擾,使每輛車到達目的地的時間都相對增加(即延遲增加),甚至有時在某段公路上車輛因堵塞而無法開動(即發生局部死鎖)。

發送窗⼝ swnd

接收窗⼝ rwnd

擁塞控制主要是四個算法:

  • 慢啟動
  • 擁塞避免
  • 擁塞發⽣
  • 快速恢復

慢啟動

有⼀個叫慢啟動⻔限 ssthresh (slow start threshold)狀態變量。

  • 當 cwnd < ssthresh 時,使⽤慢啟動算法。
  • 當 cwnd >= ssthresh 時,就會使⽤「擁塞避免算法」。

擁塞避免

擁塞避免是線性增長,當觸發了重傳機制,也就進⼊了「擁塞發⽣算法」。

擁塞發⽣算法

重傳機制主要有兩種:

  • 重傳超時
  • 快速重傳

重傳超時:

  • ssthresh 設為 cwnd/2 ,
  • cwnd 重置為 1


快速重傳:

  • cwnd = cwnd/2 ,也就是設置為原來的⼀半
  • ssthresh = cwnd

參考

  • 圖解網絡-HTTP
  • 中國軟件測評中心聯合網康推出首個《上網行為管理產品評測標準》
  • 羅萬明, 林闖, 閻保平. TCP/IP擁塞控制研究[J]. 計算機學報, 2001, 24(1):1-18.
  • 任豐原, 林闖, 劉衛東. IP網絡中的擁塞控制[J]. 計算機學報, 2003, 26(9):2-11.
  • 孫利民, 李波, 周新運. 無線傳感器網絡的擁塞控制技術[J]. 計算機研究與發展, 2008, 45(1):63-72.
  • 汪小帆, 孫金生, 王執銓. 控制理論在Internet擁塞控制中的應用[J]. 控制與決策, 2002, 17(2):129-134.
  • 趣談⽹絡協議專欄.劉超.極客時間
  • Web協議詳解與抓包實戰專欄.陶輝.極客時間
  • TCP/IP詳解 卷1:協議.范建華 譯.機械⼯業出版社
  • 圖解TCP/IP.⽵下隆史.⼈⺠郵電出版社
  • The TCP/IP Guide.Charles M. Kozierok.
  • TCP那些事(上).陳皓.酷殼博客.//coolshell.cn/articles/11564.html
  • TCP那些事(下).陳皓.酷殼博客.//coolshell.cn/articles/11609.html