说明
TCP的拥塞机制,包含慢启动、拥塞避免、快速重传、快速恢复、拥塞通知等一系列的方法。
常规操作手段
原理
默认,TCP连接,都是慢启动,也可以关闭。因为还不了解网络的带宽,不了解服务器能接受的最大窗口。所以,第一个数据包,一般是1个或者2个MSS那么大,这也就是CWND,拥塞窗口的大小。如果发过去,收到了一个ACK的确认包,发送方就以指数来增长CWND,如果上一次是1次,那下一次就是2的1次方。又收到了ACK,那下一次就是2的2次方,这样来增长CWND。
正常的停止:如果达到预设的慢启动阈值(ssthresh)了,那就不再增长CWND。进入拥塞避免阶段。发送方不再使用指数增长,而是进行线性增长,每个RTT周期,我就增加一个MSS,这样又可以继续缓慢试探对方能承受的数据大小,也不至于一下子拥塞了网络。如果在这个阶段还发生了超时(超过RTO),或者其他拥塞的指示(比如收到ECN),就会进入慢启动阶段。否则会一直停留在拥塞避免阶段;
非正常的停止:
如果在慢启动过程中,检测到网络拥塞了(连续3次收到重复的ACK),进入快速重传阶段。ssthresh会设置为当前CWND的一半,CWND也将重置为ssthresh + 3个MSS(最大报文段)。此时进入快速恢复阶段。之后发送方每收到一个重复的ACK(接收方不断发送自己已经收到了哪些数据包的确认包。你可以理解为,一共发了1,2,3,4,5。这时候3丢了,接收方就不断给发送方发ACK(2),代表1,2我收到了,快点给我3。只要接收方还在不断收到4,5这些包,它就会继续重复发ACK(2),有点催单的意思),就将cwnd增加1个MSS。如果收到了丢失包的ACK确认包,cwnd = ssthresh,会重新进入拥塞避免阶段。如果在这个阶段还发生了超时(超过RTO)就会进入慢启动阶段;
如果在慢启动过程中,是因为RTO超时了。那么发送方会进入重传阶段。通常会将cwnd重置为初始值(通常是一个或两个MSS),ssthresh改为cwnd的一半,然后进入慢启动阶段。
优点
1)避免网络一开始就会拥塞;
2)动态适应网络的变化,逐步增加 、减慢发送速度。
缺点
1)一开始增长比较慢,可能会导致传输延迟;
2)在高带宽、低延迟网络中,慢启动可能会使得访问变慢。
提前规避手段
原理
显式拥塞通知(ECN,Explicit Congestion Notification),和ECN配套使用的,通常有CWR标志(Congestion Window Reduced),这通常是在发送方已经收到了ECN后,自己需要减少发送速率(通常通过减小拥塞窗口cwnd),那会在发送方发送下一个数据包的TCP头部设置CWR标志,表示它已经处理了拥塞信号并减少了发送速率。进入慢启动阶段。他俩最好是配合使用,这样可以增加双方通信的同步性。假如,发送方就是不用CWR,但是还是会减小发送速率,这时候,接收方会继续不断发送带有ECE标志的数据包给发送方,这也会增加不必要的开销。ECN和CWR也是需要在握手过程中协商的,确认双方都支持,才可以使用。具体为:发送方设置SYN包中的ECE和CWR标志,表示支持ECN。接收方在SYN-ACK包中设置ECE标志,表示支持ECN。
IP头部标志位:
ECN标志位使用IPv4头部的ToS字节(IPv6的Traffic Class字节)中的两位。
00
:非ECN功能
01
:ECN可用,但未发生拥塞
10
:ECN功能有效,拥塞发生(ECN-Capable Transport, ECT(0))
11
:拥塞发生,发送方应减小发送速率(Congestion Experienced, CE)
ECN和CWR具体使用示例如下:
目的:在网络中发生拥塞前通知发送方,以避免丢包。
机制:路由器检测到即将发生拥塞时,在IP头部设置的ECN字段中设置CE(Congestion Experienced)标志。接收方收到带有CE设置的数据包后,就在回复给发送方的TCP ACK确认包中,设置ECE标志,通知发送方前方有拥塞。这样发送方就会减小发送速率,进入拥塞避免或者其他的控制状态。同时,发送方发送的下一个数据包,CWR会置位。
其他拥塞控制手段
TCP拥塞控制算法不断发展,以下是一些常用的,改进的算法,进一步优化了不同网络环境中的传输性能:
TCP Reno:包括基本的慢启动、拥塞避免、快速重传和快速恢复。
TCP New Reno:改进了TCP Reno的快速恢复机制,对多个丢包的处理更有效。
TCP Tahoe:最早的TCP拥塞控制算法,包括慢启动和拥塞避免,但每次丢包后都会进入慢启动阶段。
TCP Vegas:基于延迟的拥塞控制算法,通过RTT测量估计网络拥塞程度。
TCP Cubic:适用于高带宽-延迟产品(BDP)网络,使用立方增长函数来调整cwnd。
BBR(Bottleneck Bandwidth and RTT):Google开发的一种拥塞控制算法,通过估计瓶颈带宽和最小RTT来动态调整发送速率。