TCP流量控制与拥塞控制
字数 1779 2025-11-02 08:11:07

TCP流量控制与拥塞控制

题目描述
TCP的流量控制(Flow Control)和拥塞控制(Congestion Control)是保证网络可靠性和稳定性的核心机制,但两者解决的问题不同。面试中常要求解释它们的区别、工作原理及具体算法。


一、流量控制:解决接收方处理能力不足的问题

目标:确保发送方不会发送过多数据导致接收方缓冲区溢出。
核心机制:滑动窗口协议(Sliding Window),通过接收方的通告窗口(Advertised Window)动态调整发送窗口。

步骤分解:

  1. 接收方通告窗口大小

    • 接收方在每次发送ACK报文时,通过TCP首部的window字段告知发送方当前剩余缓冲区大小(即接收窗口rwnd)。
    • 例如:接收方缓冲区剩余100字节,则发送rwnd=100。
  2. 发送方根据rwnd限制发送数据量

    • 发送方需保证:已发送但未确认的数据量 ≤ min(拥塞窗口cwnd, 接收窗口rwnd)
    • 若rwnd=0,发送方会暂停发送,并启动持续计时器(Persist Timer)定期探测接收方窗口是否恢复。
  3. 避免死锁(零窗口处理)

    • 当接收方缓冲区满时,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个阶段)

  1. 慢启动(Slow Start)

    • 初始cwnd=1 MSS(最大报文段长度),每收到一个ACK,cwnd翻倍(指数增长)。
    • 目的:快速探测可用带宽。
    • 终止条件:
      • 达到慢启动阈值(ssthresh);
      • 发生拥塞(超时或重复ACK)。
  2. 拥塞避免(Congestion Avoidance)

    • 当cwnd ≥ ssthresh时,进入线性增长阶段:每RTT(往返时间)增加1 MSS(每ACK增加1/cwnd)。
    • 目的:谨慎接近网络容量上限。
  3. 快重传(Fast Retransmit)

    • 收到3个重复ACK时,立即重传丢失报文,无需等待超时。
    • 说明:部分数据到达接收方,网络仍有容量,无需剧烈降速。
  4. 快恢复(Fast Recovery)

    • 触发快重传后,将ssthresh设为当前cwnd的一半,cwnd = ssthresh + 3 MSS(因3个重复ACK代表3个数据包已离开网络)。
    • 此后进入拥塞避免阶段(线性增长)。

完整流程示例:

  1. 初始cwnd=1 MSS,ssthresh=16 MSS。
  2. 慢启动:cwnd指数增长至16 MSS。
  3. 拥塞避免:cwnd线性增长至20 MSS时,收到3个重复ACK(表示丢包)。
  4. 快重传与快恢复:重传丢失包,ssthresh=10 MSS,cwnd=13 MSS,进入拥塞避免。

三、流量控制与拥塞控制的协作

  • 发送窗口实际大小 = min(rwnd, cwnd)。
  • 流量控制依赖接收方能力,拥塞控制依赖网络状态,两者共同约束发送行为。

关键区别

维度 流量控制 拥塞控制
关注点 接收方缓冲区 网络承载能力
调控信号 接收方通告窗口(rwnd) 拥塞窗口(cwnd)
触发条件 缓冲区满 丢包或延迟增加

通过以上机制,TCP在保证可靠传输的同时,兼顾公平性与网络效率。

TCP流量控制与拥塞控制 题目描述 TCP的流量控制(Flow Control)和拥塞控制(Congestion Control)是保证网络可靠性和稳定性的核心机制,但两者解决的问题不同。面试中常要求解释它们的区别、工作原理及具体算法。 一、流量控制:解决接收方处理能力不足的问题 目标 :确保发送方不会发送过多数据导致接收方缓冲区溢出。 核心机制 :滑动窗口协议(Sliding Window),通过接收方的 通告窗口(Advertised Window) 动态调整发送窗口。 步骤分解: 接收方通告窗口大小 接收方在每次发送ACK报文时,通过TCP首部的 window 字段告知发送方当前剩余缓冲区大小(即接收窗口rwnd)。 例如:接收方缓冲区剩余100字节,则发送rwnd=100。 发送方根据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在保证可靠传输的同时,兼顾公平性与网络效率。