原文作者:sixsixfly
原文地址:https://segmentfault.com/a/1190000024573031
TCP Congestion Control
TCP 通過減小發送窗口大小來處理擁塞,發送窗口的大小由以下兩個因素共同決定:
接收窗口大小(Receiver window)
擁塞窗口大小(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
一輪 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 通過減小發送窗口大小來處理擁塞,發送窗口的大小由以下兩個因素共同決定:
接收窗口大小(Receiver window)
擁塞窗口大小(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
一輪 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