TCP流量控制与拥塞控制
外观
概述[编辑 | 编辑源代码]
TCP流量控制(Flow Control)与拥塞控制(Congestion Control)是TCP协议中保证网络高效可靠传输的核心机制。
- **流量控制**:通过滑动窗口机制协调发送方与接收方的数据处理速度,避免接收方缓冲区溢出。
- **拥塞控制**:通过动态调整发送速率避免网络过载,包含慢启动、拥塞避免、快速重传等算法。
TCP流量控制[编辑 | 编辑源代码]
滑动窗口机制[编辑 | 编辑源代码]
接收方通过通告窗口(Advertised Window, RWND)告知发送方可接收的数据量。发送方根据RWND调整发送窗口大小。
零窗口问题与持续计时器[编辑 | 编辑源代码]
若接收方缓冲区满(RWND=0),发送方暂停发送并启动持续计时器(Persist Timer),定期探测窗口状态。
# 模拟零窗口处理(伪代码)
def handle_zero_window():
while receiver_window == 0:
start_persist_timer()
if timer_expired:
send_window_probe()
if ack_received and receiver_window > 0:
resume_transmission()
TCP拥塞控制[编辑 | 编辑源代码]
核心算法[编辑 | 编辑源代码]
1. **慢启动(Slow Start)**:窗口从1个MSS(最大报文段)开始,每RTT指数增长。 2. **拥塞避免(Congestion Avoidance)**:窗口超过慢启动阈值(ssthresh)后,每RTT线性增长。 3. **快速重传(Fast Retransmit)**:收到3个重复ACK时立即重传丢失报文。 4. **快速恢复(Fast Recovery)**:重传后直接进入拥塞避免阶段。
数学模型[编辑 | 编辑源代码]
拥塞窗口(CWND)在慢启动阶段增长公式:
实际案例[编辑 | 编辑源代码]
视频流传输[编辑 | 编辑源代码]
当网络拥塞时,YouTube通过TCP拥塞控制动态降低视频码率,避免卡顿。例如: 1. 初始阶段快速提升传输速率(慢启动)。 2. 检测到丢包后,触发快速重传并降低发送速率(拥塞避免)。
代码示例:模拟拥塞控制[编辑 | 编辑源代码]
# 简化版拥塞控制模拟
cwnd = 1
ssthresh = 64
in_fast_recovery = False
def on_packet_loss():
global cwnd, ssthresh, in_fast_recovery
ssthresh = max(cwnd // 2, 1)
cwnd = 1 if not in_fast_recovery else ssthresh
in_fast_recovery = False
def on_ack_received():
global cwnd, ssthresh
if cwnd < ssthresh:
cwnd *= 2 # 慢启动
else:
cwnd += 1 # 拥塞避免
常见问题[编辑 | 编辑源代码]
流量控制与拥塞控制的区别[编辑 | 编辑源代码]
特性 | 流量控制 | 拥塞控制 |
---|---|---|
目标 | 防止接收方过载 | 防止网络过载 |
机制 | 滑动窗口(RWND) | 拥塞窗口(CWND) |
触发信号 | 接收方窗口通告 | 丢包或延迟增加 |
总结[编辑 | 编辑源代码]
TCP通过流量控制与拥塞控制的协同工作,实现了高效可靠的数据传输。理解这些机制有助于优化网络应用开发与调试。