介绍tcp的滑动窗口和拥塞控制
滑动窗口和拥塞控制是 TCP(传输控制协议)确保可靠传输和网络效率的核心机制: - 滑动窗口:用于流量控制,通过动态调整窗口大小,控制发送方发送数据的速率,避免接收方缓冲区溢出。 - 拥塞控制:用于网络拥塞管理,通过算法(如慢启动、拥塞避免)调节发送速率,防止网络过载。
1. 滑动窗口
是什么
滑动窗口是 TCP 的流量控制机制,基于接收方的缓冲区容量,动态调整发送方可连续发送的数据量(窗口大小),无需等待每次确认。
工作原理
- 窗口大小:
- 由接收方在 TCP 报头中声明(
Window
字段,单位字节)。 - 表示接收方当前可接受的数据量。
- 滑动过程:
- 当发送方发送窗口内的数据后,会等待接收方对这些数据进行确认。
- 接收方收到数据后,会发送 ACK 消息,同时在 ACK 中告知下一个期望的序号。
- 收到 ACK 后,发送方将窗口右移,视为数据已被成功接收,并可以在空出的窗口中发送新数据。
- 关键点:
- 发送窗口 ≤ 接收窗口。
- 窗口为 0 时,发送方暂停(零窗口探测)。
示例
- 接收窗口 = 4000 字节,发送方发送 1000 字节:
- 窗口剩余 3000。
- 接收方 ACK 后,窗口滑动,恢复 4000。
特点
- 高效:连续发送,减少等待。
- 动态:随接收方能力调整。
2. 拥塞控制
是什么
拥塞控制是 TCP 防止网络过载的机制,通过动态调整拥塞窗口(Congestion Window, cwnd),控制发送速率,避免数据包丢失和网络拥堵。
工作原理
- 核心变量:
- cwnd:拥塞窗口,限制发送方未确认数据量。
- ssthresh:慢启动阈值,决定算法切换。
- 实际窗口:
- 发送窗口 = min(接收窗口, 拥塞窗口)。
- 四个阶段:
- 慢启动(Slow Start):
- cwnd 从 1 MSS(最大报文段)开始,每收到 ACK 翻倍(指数增长)。
- 直到 cwnd ≥ ssthresh。
- 拥塞避免(Congestion Avoidance):
- cwnd 线性增长(每轮次 +1 MSS)。
- 预防拥塞。
- 快速重传(Fast Retransmit):
- 收到 3 个重复 ACK,立即重传丢失包。
- cwnd 减半,ssthresh = cwnd。
- 快速恢复(Fast Recovery):
- cwnd = ssthresh + 3,线性增长至稳定。
示例
- 初始:cwnd = 1 MSS,ssthresh = 16 MSS。
- 慢启动:1 -> 2 -> 4 -> 8 -> 16(达 ssthresh)。
- 拥塞避免:16 -> 17 -> 18。
- 丢包:cwnd 减半(如 9),ssthresh = 9,进入快速恢复。
算法实现
- 丢包检测:
- 超时(RTO):cwnd 回退到 1,慢启动。
- 3 个重复 ACK:快速重传 + 恢复。
滑动窗口与拥塞控制的关系
- 区别:
- 滑动窗口:端到端流量控制,关注接收方能力。
- 拥塞控制:网络层控制,关注网络状态。
- 联系:
- 实际发送速率受两者共同限制:
min(接收窗口, 拥塞窗口)
。 - 滑动窗口保证接收不溢出,拥塞控制保证网络不拥堵。
延伸与面试角度
- 滑动窗口优化:
- 窗口缩放:TCP 选项扩展窗口(大于 64KB)。
- 零窗口探测:发送 1 字节探测接收方。
- 拥塞控制变种:
- TCP Tahoe:丢包后慢启动。
- TCP Reno:快速重传 + 恢复。
- TCP Cubic:Linux 默认,窗口增长更平滑。
- 实际应用:
- HTTP 下载:滑动窗口控制速率,拥塞控制避免丢包。
- 面试点:
- 问“滑动窗口”时,提流量控制和 ACK。
- 问“拥塞控制”时,提慢启动和快速重传。
总结
滑动窗口通过接收方窗口实现流量控制,拥塞控制通过 cwnd 和算法(如慢启动、拥塞避免)管理网络负载。二者协同确保 TCP 高效可靠。面试时,可画窗口图或提 TCP Reno,展示理解深度。