理解 TCP 擁塞控制

原文作者:sixsixfly

原文地址:https://segmentfault.com/a/1190000024573031


理解 TCP 擁塞控制


TCP Congestion Control

TCP 通過減小發送窗口大小來處理擁塞,發送窗口的大小由以下兩個因素共同決定:

  1. 接收窗口大小(Receiver window)

  2. 擁塞窗口大小(Congestion window)

接收窗口大小

接收窗口大小是一種告知:用來說明接收者總計能接收多少字節未確認數據

  • 發送端發送的數據量不得大於接收窗口大小,否則會存在 TCP 報文丟失進而導致 TCP 重傳(TCP Retransmission)

  • 發送端發送的數據量應小於等於接收窗口大小,發送者通過 TCP 頭(TCP Header)得知接收者接收窗口大小

擁塞窗口

  • 發送端發送的未確認數據不得大於擁塞窗口大小,否則會使得 TCP 報文段丟棄進而導致 TCP 重傳

  • 發送者發送的未確認數據應小於等於擁塞窗口大小,擁塞窗口的概念只存在於發送端

發送窗口的大小取接收窗口和擁塞窗口的最小值

Sender window size = Minimum (Receiver window size, Congestion window size)

擁塞策略

TCP 擁塞控制策略由三階段組成:慢啟動(Slow Start),擁塞避免(Congestion Avoidance)和擁塞感知(Congestion Detection)

慢啟動階段

一開始發送端設置擁塞窗口等於一個最大報文段(1 MSS)。在接收到確認 ACK 後,發送端把擁塞窗口增加 1 MSS,整個過程中擁塞窗口按照預期增大

Congestion window size = Congestion window size + Maximum segment size

理解 TCP 擁塞控制

一輪 ACK 過後,擁塞窗口 = $(2)^1$ = 2 MSS

二輪 ACK 過後,擁塞窗口 = $(2)^2$ = 4 MSS

三輪 ACK 過後,擁塞窗口 = $(2)^3$ = 8 MSS

......

整個過程一直持續到擁塞窗口大小達到慢啟動閾值

<code>Threshold = Maximum number of TCP segments that receiver window can accommodate / 2
= (Receiver window size / Maximum Segment Size) / 2/<code>

擁塞避免階段

TCP Congestion Control

TCP 通過減小發送窗口大小來處理擁塞,發送窗口的大小由以下兩個因素共同決定:

  1. 接收窗口大小(Receiver window)

  2. 擁塞窗口大小(Congestion window)

接收窗口大小

接收窗口大小是一種告知:用來說明接收者總計能接收多少字節未確認數據

  • 發送端發送的數據量不得大於接收窗口大小,否則會存在 TCP 報文丟失進而導致 TCP 重傳(TCP Retransmission)

  • 發送端發送的數據量應小於等於接收窗口大小,發送者通過 TCP 頭(TCP Header)得知接收者接收窗口大小

擁塞窗口

  • 發送端發送的未確認數據不得大於擁塞窗口大小,否則會使得 TCP 報文段丟棄進而導致 TCP 重傳

  • 發送者發送的未確認數據應小於等於擁塞窗口大小,擁塞窗口的概念只存在於發送端

發送窗口的大小取接收窗口和擁塞窗口的最小值

Sender window size = Minimum (Receiver window size, Congestion window size)

擁塞策略

TCP 擁塞控制策略由三階段組成:慢啟動(Slow Start),擁塞避免(Congestion Avoidance)和擁塞感知(Congestion Detection)

慢啟動階段

一開始發送端設置擁塞窗口等於一個最大報文段(1 MSS)。在接收到確認 ACK 後,發送端把擁塞窗口增加 1 MSS,整個過程中擁塞窗口按照預期增大

Congestion window size = Congestion window size + Maximum segment size

理解 TCP 擁塞控制

一輪 ACK 過後,擁塞窗口 = $(2)^1$ = 2 MSS

二輪 ACK 過後,擁塞窗口 = $(2)^2$ = 4 MSS

三輪 ACK 過後,擁塞窗口 = $(2)^3$ = 8 MSS

......

整個過程一直持續到擁塞窗口大小達到慢啟動閾值

<code>Threshold = Maximum number of TCP segments that receiver window can accommodate / 2
= (Receiver window size / Maximum Segment Size) / 2/<code>

擁塞避免階段

發送端檢測到報文丟失時,根據不同方式感知到的報文丟失會採取不同的策略來處理

方式一:通過超時探知擁塞(Time Out)

接收者經歷超時時間後卻沒收到報文確認 ACK,說明有大概率存在網絡擁塞,這時報文段可能已經丟失

發送端的應對策略:

設置慢啟動閾值(slow start threshold)為當前擁塞窗口大小的一半

設置擁塞窗口大小為 1 MSS

恢復到慢啟動階段

方式二:收到三個重複 ACK 探知擁塞

發送端接收到三個重複的 ACK 說明存在小概率網絡擁塞,

雖然報文存在丟失的可能,但接下來發送的報文應該可以順利到達

發送端的應對策略:

設置慢啟動閾值為當前擁塞窗口大小的一半

擁塞窗口減小到慢啟動閾值

恢復到擁塞避免階段


原文作者:sixsixfly

原文地址:https://segmentfault.com/a/1190000024573031


分享到:


相關文章: