深入理解 TCP:重传机制、滑动窗口、流量控制与拥塞控制

TCP(Transmission Control Protocol)是一个面向连接、可靠传输的协议,支撑着绝大多数互联网通信。在实现可靠性的背后,TCP 引入了多个关键机制:重传机制滑动窗口流量控制拥塞控制。这些机制共同协作,确保了网络传输的稳定性、高效性和公平性。

本文将从这四大模块出发,逐层剖析其工作原理及内部联系。


一、TCP 重传机制

1.1 超时重传

当 TCP 发送方发出一个数据段后,如果在预定时间内没有收到 ACK(确认),就会触发超时重传。这个时间称为 重传超时时间 RTO(Retransmission Timeout)

RTO 的计算通常使用 RTT(往返时间)预测算法,结合抖动值进行加权调整。

作用:解决数据包丢失或 ACK 丢失问题。

1.2 快速重传

快速重传避免了等待 RTO 超时时间。当接收方连续收到三个相同的 ACK(称为 Duplicate ACK)时,发送方立刻重传对应的段,认为该段可能丢失。

好处:显著缩短丢包检测时间,提高吞吐量。

1.3 SACK 方法(Selective Acknowledgment)

SACK(选择性确认)机制允许接收方告诉发送方:我收到了哪些数据段,即便这些段是不连续的。

例如,收到段 #1、#2、#4、#5,丢了 #3,那么接收方会告诉发送方:我收到了 #1-#2 和 #4-#5。发送方据此只需重发 #3,而不是整个窗口。

对比快速重传:SACK 更细粒度、效率更高。

1.4 Duplicate SACK

一种对 SACK 的增强,用于进一步标明哪些段被重复收到了,有助于快速判断拥塞与丢包状态。

ack包丢失:

网络延时:


二、滑动窗口机制

2.1 滑动窗口定义

滑动窗口是 TCP 中的核心机制之一,用于控制发送方可以连续发送多少字节而无需等待 ACK。其大小取决于接收方通告窗口(rwnd)和拥塞窗口(cwnd)中较小的值。

我们都知道 TCP 是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个,这个模式就有点像我和你面对面聊天,你一句我一句。但这种方式的缺点是效率比较低的。

一发一ack:

为解决这个问题,TCP 引入了窗口这个概念。即使在往返时间较长的情况下,它也不会降低网络通信的效率

2.2 工作原理

  • 每次发送新的数据后,窗口向右滑动;

  • 收到 ACK 后,窗口继续向右滑动;

  • 丢包或拥塞时,窗口收缩。

作用:保持网络“流水线式”的高效传输。


三、流量控制

3.1 基本思想

流量控制主要是为了防止发送方“发太快”,而接收方“接不过来”。这依赖于接收方通告窗口(rwnd),它告诉发送方“我还能接收多少数据”。

3.2 缓冲区与窗口的关系

接收方在操作系统内核中分配一段 缓冲区 存储 TCP 数据。rwnd 就是这个缓冲区剩余大小的反映。

⚠️ 若发送数据快于应用层消费速度,缓冲区满,rwnd=0,发送方必须暂停发送。

可能出现的情况:

为了防止这种情况发生,TCP 规定是不允许同时减少缓存又收缩窗口的,而是采用先收缩窗口,过段时间再减少缓存,这样就可以避免了丢包情况

3.3 窗口关闭

当 rwnd=0 时,TCP 会暂时关闭窗口,不再发送数据。发送方会周期性发送“窗口探测包”(Zero Window Probe)询问接收方缓冲是否已空。

3.4 糊涂窗口综合症(Silly Window Syndrome)

当接收方的缓冲区空闲很少就通告窗口,或发送方每次只发一点点数据,这会导致网络效率极低。这种现象称为“糊涂窗口综合症”。

解决方式:
  • 接收方策略:不通告过小窗口;

  • 发送方策略(Nagle算法):累积数据后再发送。


四、拥塞控制

拥塞控制目标是防止发送方过快发送数据导致网络拥塞。TCP 通过以下机制动态调节发送速率:

4.1 慢启动(Slow Start)

初始时 cwnd 很小(1 MSS),每收到一个 ACK 就将 cwnd 加倍(指数增长)。直到达到阈值(ssthresh)或出现丢包为止。

✅ 作用:逐步探测网络能力,防止突发冲击。

4.2 拥塞避免(Congestion Avoidance)

当 cwnd > ssthresh 后,进入线性增长阶段,即每个 RTT 只增长 1 MSS,避免过快增大窗口。

4.3 拥塞发生(例如快速重传触发)

  • cwnd 减半(乘法减小);

  • ssthresh 设置为一半;

  • 重回慢启动或进入快速恢复。

4.4 快速恢复

当触发快速重传时,不进入慢启动,而是认为网络并未严重拥塞,因此采用 快速恢复算法

  • 将 cwnd 设置为 ssthresh;

  • 继续进入拥塞避免阶段。


五、四大机制的联系与整体架构

我们将四部分的核心关系梳理如下:

模块控制目标核心机制所需信息
重传机制保证可靠传输超时重传、快速重传、SACKACK、RTT
滑动窗口提升效率流水线式传输发送窗口
流量控制防止接收方被压垮接收窗口控制 rwnd缓冲区
拥塞控制保持网络稳定慢启动、拥塞避免、快速恢复丢包信号、ACK 统计

总结一句话
TCP 通过滑动窗口提高吞吐,通过流量控制保护接收端,通过拥塞控制避免网络瘫痪,而重传机制是保证可靠性基石。

参考:4.2 TCP 重传、滑动窗口、流量控制、拥塞控制 | 小林coding

### TCP拥塞控制原理 TCP拥塞控制旨在防止过多的数据涌入网络,从而避免因过度负载而导致性能下降或失败的情况。为了达到这一目标,TCP通过调整发送方的发送速率来响应网络状况的变化。 在网络通信过程中,默认情况下TCP认为丢包是由网络拥塞引起的[^3]。因此,一旦检测到丢包事件(通常由超时重传RTO或者接收到三个重复确认ACK触发),就会采取措施减少流量以缓解潜在的拥塞问题[^4]。 ### 主要算法及其工作方式 #### AIMD (加性增加/乘法减小) 这是最经典的TCP拥塞控制策略之一,在TCP Reno版本中被广泛采用。该方法允许窗口大小线性增长直到遇到第一个丢包指示;之后则会急剧收缩窗口尺寸以便迅速降低传输速度并等待一段时间后再逐步恢复正常的增长率[^2]。 #### 快速重传快速恢复 当接收端连续三次向同一位置发出相同的ACK报文时,这表明中间有未到达目的地的数据段丢失了。此时不必等到定时器溢出才重新传送这些遗失的信息,而是立即执行所谓的“快速重传”。随后进入“快速恢复”阶段,它不同于慢启动之处在于不会完全回到初始状态,而是保持较高的吞吐量尝试继续前进而不是退回到更保守的状态。 #### BBR (Bottleneck Bandwidth and Round-trip propagation time) BBR是一种较新的拥塞控制方案,其核心理念是估计瓶颈带宽以及往返传播时间,并据此动态调节发送速率。相比传统的基于丢包反馈的方法,这种方法试图主动探测可用资源而非被动应对突发情况。尽管存在一些局限性和挑战,但它代表了一个重要的发展方向[^5]。 ### C++实现概览 使用C++编写TCP拥塞控制逻辑涉及多个方面的工作,包括但不限于建立可靠的套接字连接、处理各种类型的ICMP消息用于监测路径特性变化、维护必要的统计信息支持决策过程等等。具体来说,开发者可能需要定义结构体保存有关当前流状态的关键参数(比如cwnd, ssthresh等),并通过函数模拟不同场景下的行为模式[^1]。 ```cpp // 定义一个简单的类表示TCP连接中的重要变量 class TcpConnection { public: int cwnd; // 当前拥塞窗口大小 int ssthresh; // 慢启动阈值 void handleTimeout() { /* 处理超时 */ } void handleAck(bool isDup) { /* 应对正常或重复应答 */ } private: bool checkLoss(); // 判断是否有丢包发生 }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值