计算机网络-- TCP 滑动窗口与拥塞控制
一、滑动窗口机制(Sliding Window)📤
💡 目的:实现 流量控制(Flow Control)
1. 基本概念
滑动窗口是一种 接收端控制发送端速度 的机制。
每个 TCP 报文头中有一个
Window Size
字段,表示接收方还能接收的字节数。2. 工作原理
发送方可以发送的数据量 ≤ 接收方通告的窗口大小。
随着接收方处理并确认(ACK)数据,窗口向前滑动,允许发送更多数据。
3. 示例图解:
这个窗口如何动的可以去看
当 A 不断发送数据包时,已发送的最后一个序号就往右移动,直到碰到了窗口的上边界,此时 A 就无法继续发包,达到了流量控制。
但是当 A 不断发包的同时,A 也会收到来自 B 的确认包,此时整个窗口会往右移动,因此上边界也往右移动,A 就能发更多的数据包了。
以上都是在窗口大小不变的情况下,而 B 在发给 A 的 ACK 包中,每一个都可以重新设置一个新的窗口大小,如果 A 收到了一个新的窗口大小值,A 会随之调整。
如果 A 收到了比原窗口值更大的窗口大小,比如 win = 6,则 A 会直接将窗口上边界向右移动 1 个单位。
如果 A 收到了比原窗口值小的窗口大小,比如 win = 4,则 A 暂时不会改变窗口大小,更不会将窗口上边界向左移动,而是等着 ACK 的到来,不断将左边界向右移动,直到窗口大小值收缩到新大小为止。
OK,终于将流量控制问题解决得差不多了,你看着上面一个个小动图,给这个窗口起了一个更生动的名字,滑动窗口。
4. 特点
🌐 是端到端的流控机制;
📥 防止接收端被“灌爆”;
📉 接收方处理慢时,窗口会减小,甚至为0,暂停发送。
二、拥塞控制机制(Congestion Control)🌐
💡 目的:防止过多数据注入网络导致拥塞
1. 拥塞窗口(Congestion Window, cwnd)
是发送端维护的一个窗口大小,用于限制注入网络的数据量。
每次发送数据时,允许的数据量 ≤
min(滑动窗口, 拥塞窗口)
。
2. 四种核心算法
(1)慢启动(Slow Start)
初始
cwnd = 1 MSS
,每收到一个 ACK,就将cwnd
增加 1 MSS。指数增长(1→2→4→8...)直到达到慢启动阈值
ssthresh
。(2)拥塞避免(Congestion Avoidance)
达到
ssthresh
后,进入线性增长阶段。每个 RTT 增加 1 MSS(变为 加法增长)。
(3)快重传(Fast Retransmit)
接收方收到重复的 ACK(例如重复 3 次 ACK n),意味着丢包了。
不等超时,立刻重传该数据段。
(4)快恢复(Fast Recovery)
不回到慢启动阶段,而是调整:
ssthresh = cwnd / 2
;
cwnd = ssthresh
;然后进入拥塞避免阶段。
3. 拥塞窗口图解(经典 TCP Tahoe & Reno 行为):
cwnd▲Reno:| /''''''''\| / \| / \| / \__+----------------------------→ 时间↖慢启动 ↖拥塞避免 ↖丢包快速重传
三、滑动窗口 vs 拥塞窗口 对比表
项目 滑动窗口 拥塞窗口 控制目的 控制接收方处理能力 控制网络拥堵状况 控制方 由 接收端控制 由 发送端自己控制 存储在哪 报文的 Window Size
字段发送方内存中的变量 动态调整方式 接收方 ACK 通告新窗口大小 根据网络 ACK/丢包动态调整 极限值 接收方缓存限制 网络状况决定的带宽上限
四、TCP 发送窗口 = min(滑动窗口, 拥塞窗口)
在实际发送过程中,TCP 的发送窗口大小取决于:
实际窗口 = min(接收端窗口, 拥塞窗口)
五、其他术语
MSS(Maximum Segment Size):TCP 一次发送的最大数据段大小,不包括 TCP 头部。
RTT(Round-Trip Time):往返时延,影响 cwnd 增长速率。
Zero Window:如果接收端通告窗口为 0,发送端需定时发送窗口探测包。