TCP流量控制与拥塞控制
字数 1779 2025-11-02 08:11:07
TCP流量控制与拥塞控制
题目描述
TCP的流量控制(Flow Control)和拥塞控制(Congestion Control)是保证网络可靠性和稳定性的核心机制,但两者解决的问题不同。面试中常要求解释它们的区别、工作原理及具体算法。
一、流量控制:解决接收方处理能力不足的问题
目标:确保发送方不会发送过多数据导致接收方缓冲区溢出。
核心机制:滑动窗口协议(Sliding Window),通过接收方的通告窗口(Advertised Window)动态调整发送窗口。
步骤分解:
-
接收方通告窗口大小
- 接收方在每次发送ACK报文时,通过TCP首部的
window字段告知发送方当前剩余缓冲区大小(即接收窗口rwnd)。 - 例如:接收方缓冲区剩余100字节,则发送rwnd=100。
- 接收方在每次发送ACK报文时,通过TCP首部的
-
发送方根据rwnd限制发送数据量
- 发送方需保证:已发送但未确认的数据量 ≤ min(拥塞窗口cwnd, 接收窗口rwnd)。
- 若rwnd=0,发送方会暂停发送,并启动持续计时器(Persist Timer)定期探测接收方窗口是否恢复。
-
避免死锁(零窗口处理)
- 当接收方缓冲区满时,rwnd=0,发送方停止发送。
- 后续接收方缓冲区空出后,会发送rwnd更新的ACK,但若该ACK丢失,双方会陷入等待。
- 解决方案:发送方收到rwnd=0后,启动持续计时器,超时后发送1字节探测报文,触发接收方回复最新rwnd。
示例:
- 发送方窗口初始为300字节,接收方rwnd=100。
- 发送方最多发送100字节,等待ACK;接收方处理50字节后,回复ACK且rwnd=50,发送方再发送50字节。
二、拥塞控制:解决网络过载问题
目标:避免发送方过度占用网络资源导致路由器缓存溢出(拥塞崩溃)。
核心机制:通过拥塞窗口(Congestion Window, cwnd) 动态调整发送速率,采用多种算法阶段式探索可用带宽。
经典算法:TCP Reno(包含4个阶段)
-
慢启动(Slow Start)
- 初始cwnd=1 MSS(最大报文段长度),每收到一个ACK,cwnd翻倍(指数增长)。
- 目的:快速探测可用带宽。
- 终止条件:
- 达到慢启动阈值(ssthresh);
- 发生拥塞(超时或重复ACK)。
-
拥塞避免(Congestion Avoidance)
- 当cwnd ≥ ssthresh时,进入线性增长阶段:每RTT(往返时间)增加1 MSS(每ACK增加1/cwnd)。
- 目的:谨慎接近网络容量上限。
-
快重传(Fast Retransmit)
- 收到3个重复ACK时,立即重传丢失报文,无需等待超时。
- 说明:部分数据到达接收方,网络仍有容量,无需剧烈降速。
-
快恢复(Fast Recovery)
- 触发快重传后,将ssthresh设为当前cwnd的一半,cwnd = ssthresh + 3 MSS(因3个重复ACK代表3个数据包已离开网络)。
- 此后进入拥塞避免阶段(线性增长)。
完整流程示例:
- 初始cwnd=1 MSS,ssthresh=16 MSS。
- 慢启动:cwnd指数增长至16 MSS。
- 拥塞避免:cwnd线性增长至20 MSS时,收到3个重复ACK(表示丢包)。
- 快重传与快恢复:重传丢失包,ssthresh=10 MSS,cwnd=13 MSS,进入拥塞避免。
三、流量控制与拥塞控制的协作
- 发送窗口实际大小 = min(rwnd, cwnd)。
- 流量控制依赖接收方能力,拥塞控制依赖网络状态,两者共同约束发送行为。
关键区别:
| 维度 | 流量控制 | 拥塞控制 |
|---|---|---|
| 关注点 | 接收方缓冲区 | 网络承载能力 |
| 调控信号 | 接收方通告窗口(rwnd) | 拥塞窗口(cwnd) |
| 触发条件 | 缓冲区满 | 丢包或延迟增加 |
通过以上机制,TCP在保证可靠传输的同时,兼顾公平性与网络效率。