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

貝貝子發表於2022-03-31

重傳機制

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那些事(上).陳皓.酷殼部落格.https://coolshell.cn/articles/11564.html
  • TCP那些事(下).陳皓.酷殼部落格.https://coolshell.cn/articles/11609.html

相關文章