TCP的拥塞控制

拥塞处理可以认为是TCP最重要的网络功能,拥塞的实现算法对TCP整体效率(吞吐量、传输速率等)有很大的影响。TCP拥塞实现算法是针对各种复杂的网络环境,从这点上看,一个UDP的应用采用简化了的TCP拥塞算法,在相对简单的网络环境下能得到对TCP更好的传输效率。

 

拥塞发生判定条件

1. 数据段(segment)发送超时

       数据段发送超时,说明这个数据段或该数据段的ACK在传输的过程中丢失了;网络状况不理想,产生拥塞了。

 

2. 收到重复的ACK

       看下面的一个数据段丢失的情形:

 

           Sender                           Receiver

               |                                       |

               |-------- segment1-------> |

               |<-------ACK1--------------- |

               |                                       |

               |-----segment2-----X-----> |

               |                                       |

               |---------segment3-------> |

               |<---------ACK1------------- |

 

        segment2在传输的过程中丢失了,TCP是基于流机制确认的,它还是返回ACK1,发送方就收到了一个重复的ACK。这里的一个重点是,当数据段乱序时,发送方也会收到重复的ACK。怎么判断是数据包丢失还是乱序?如果同时收到3或3个以上的重复ACK,就认为数据包丢失了,认为网络发生拥塞。

 

拥塞控制方法

当发送数据段产生超时时,说明网络已经产生拥塞,TCP会执行慢启动,快速地减少数据段的传送。如果收到3个或以上的重复ACK,认为某个数据段丢失了,这个时候,TCP一般会采用快速恢复的拥塞策略来控制发送数据流量:即马上重发丢失的数据段,然后采用快速恢复算法。某些TCP实现这个时候也会慢启动的算法来控制流量,这样很多时候会降低网络的传输的效率。因为,发送方有收到ACK,说数据在网络两端还是流动的,拥塞程度还不是很严重,应该用更高效的策略。

1. 慢启动

       除了一个滑动窗口大小外,引入一个拥塞窗口大小,记为cwnd。前者是接收方可接受的最大数据的大小,后者是发送方允许的最大发送数据大小。对于发送方来说,最大可发送的数据的大小应该是两者之间的较小值。开始发送数据时,cwnd=1个数据段(大小事SYN中对方通告的MSS), 接下来每收到一个ACK,cwnd就以2^n方增长。慢启动,其实不慢。

 

2. 快速恢复

      引入ssthresh, ssthresh = cwnd / 2, 重传丢失的数据段,cwnd重新设为,cwnd = ssthresh + 3 * MSS.

      每收到一个重复ACK,cwnd增加一个分组大小,重传一个数据段。

      收到新的ACK,设置cwnd为ssthresh,其实就是原来的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(); // 判断是否有丢包发生 }; ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值