跳转到内容

TCP流量控制与拥塞控制

来自代码酷

模板:编程学习导航

概述[编辑 | 编辑源代码]

TCP流量控制(Flow Control)拥塞控制(Congestion Control)是TCP协议中保证网络高效可靠传输的核心机制。

  • **流量控制**:通过滑动窗口机制协调发送方与接收方的数据处理速度,避免接收方缓冲区溢出。
  • **拥塞控制**:通过动态调整发送速率避免网络过载,包含慢启动、拥塞避免、快速重传等算法。

TCP流量控制[编辑 | 编辑源代码]

滑动窗口机制[编辑 | 编辑源代码]

接收方通过通告窗口(Advertised Window, RWND)告知发送方可接收的数据量。发送方根据RWND调整发送窗口大小。

sequenceDiagram participant Sender participant Receiver Sender->>Receiver: 发送数据(Seq=1, Len=100, RWND=300) Receiver-->>Sender: ACK=101, RWND=200(剩余缓冲区200字节) Sender->>Receiver: 发送数据(Seq=101, Len=200, RWND=200)

零窗口问题与持续计时器[编辑 | 编辑源代码]

若接收方缓冲区满(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)**:重传后直接进入拥塞避免阶段。

graph LR A[慢启动: CWND指数增长] -->|CWND ≥ ssthresh| B[拥塞避免: CWND线性增长] B -->|收到3个重复ACK| C[快速重传与恢复] C --> B B -->|超时| D[重置CWND=1, ssthresh=CWND/2] D --> A

数学模型[编辑 | 编辑源代码]

拥塞窗口(CWND)在慢启动阶段增长公式: CWND=CWND+1 per ACKCWND2n per RTT

实际案例[编辑 | 编辑源代码]

视频流传输[编辑 | 编辑源代码]

当网络拥塞时,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通过流量控制与拥塞控制的协同工作,实现了高效可靠的数据传输。理解这些机制有助于优化网络应用开发与调试。