TCP的拥塞控制

1. 网络拥塞

1.1. 拥塞控制的原理

概念:在某段时间,若对网络中的某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变化,这种情况叫做拥塞。
网络拥塞往往是由许多因素引起的,简单的提高节点处理机的速度或者扩大结点缓存的存储空间并不能解决拥塞问题。例如当某个结点缓存容量扩展到非常大,于是凡到达该结点的分组均可在结点的缓存队列中排队,不受任何限制。由于输出链路的容量和处理机的速度并未提高,因此在这队列中的绝大多数的分组在排队等待时间会大大增加,结果上层软件只好把他们进行重传。

因此,问题的是指往往是整个系统的各个部分不匹配,只有各个部分平衡了,问题才会得到解决。

1.2. 拥塞控制和流量控制的差别

所谓拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提,就是网络能承受现有的网络负荷。

流量控制往往指的是点对点通信量的控制,是个端到端的问题。流量控制所要做的就是控制发送端发送数据的速率,以便使接收端来得及接受。

2. 拥塞控制方法

因特网建议标准RFC2581定义了进行拥塞控制的四种算法,即慢开始(Slow-start)、拥塞避免(Congestion Avoidance)、快重传(Fast Restrangsmit)和快回复(Fast Recovery)。我们假定

1)数据是单方向传送,而另外一个方向只传送确认
2)接收方总是有足够大的缓存空间,因为发送窗口的大小由网络的拥塞程度来决定。 

2.1  慢开始和拥塞避免

发送报文段速率的确定,既要根据接收端的接收能力,又要从全局考虑不要使网络发生拥塞,这由接收窗口和拥塞窗口两个状态量确定。接收端窗口(Reciver Window)又称通知窗口(Advertised Window),是接收端根据目前的接收缓存大小所许诺的最新窗口值,是来自接收端的流量控制。拥塞窗口cwnd(Congestion Window)是发送端根据自己估计的网络拥塞程度而设置的窗口值,是来自发送端的流量控制。
2.1.1 慢启动原理:
1)当主机开始发送数据时,如果立即将较大的发送窗口的全部数据字节都注入到网络中,那么由于不清楚网络的情况,有可能引其网络拥塞
2)比较好的方法是试探一下,即从小到达逐渐增大发送端的拥塞控制窗口数值
3)通常在刚刚开始发送报文段时可先将拥塞窗口cwnd设置为一个最大报文段的MSS的数值。在每收到一个对新报文段确认后,将拥塞窗口增加至多一个MSS的数值,当rwind足够大的时候,为了防止拥塞窗口cwind的增长引起网络拥塞,还需要另外一个变量---慢开始门限ssthresh

2.1.2 拥塞控制具体过程为
1)TCP连接初始化,将拥塞窗口设置为1
2)执行慢开始算法,cwind按指数规律增长,知道cwind == ssthress开始执行拥塞避免算法,cwnd按线性规律增长
3)当网络发生拥塞,把ssthresh值更新为拥塞前ssthresh值的一半,cwnd重新设置为1,按照步骤(2)执行。

2.2 快重传和快恢复

一条TCP连接有时会因等待重传计时器的超时而空闲较长的时间,慢开始和拥塞避免无法很好的解决这类问题,因此提出了快重传和快恢复的拥塞控制方法。
快重传算法并非取消了重传机制,只是在某些情况下更早的重传丢失的报文段(如果当发送端接收到三个重复的确认ACK时,则断定分组丢失,立即重传丢失的报文段,而不必等待重传计时器超时)。慢开始算法只是在TCP建立时才使用
快恢复算法有以下两个要点:
1)当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把慢开始门限减半,这是为了预防网络发生拥塞。
2)由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,而是把cwnd值设置为慢开始门限减半后的值,然后开始执行拥塞避免算法,是拥塞窗口的线性增大。

### 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(); // 判断是否有丢包发生 }; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值