网络 TCP拥塞控制详解.md
本文最后更新于:2024年5月10日 下午
TCP的拥塞控制是TCP中最重要的部分之一,因此值得好好学习,记录下知识点以便回顾!
复习到运输层TCP就是重中之重了,而TCP的拥塞控制又是TCP中最重要的部分之一,因此值得好好学习,记录下知识点以便回顾!
按照概念、原理、方法,结合课本与ppt简单整理出我的理解
拥塞的概念
计算机网络中的链路容量(带宽)、交换节点中的缓存和处理机等,都是网络的资源。在某段时间若对某一资源的需求超过了该资源所能提供的可用部分,网络性能就会变坏,这种情况就叫拥塞( 即 ∑对资源需求 >可用资源 ),拥塞会使得整个网络的吞吐量随输入负荷增大而下降。
一般可能的想到处理方法是:1.加大节点缓存空间;2.提高链路速率。然而由于网络拥塞往往是多种因素引起的复杂问题,上面的方法可能会适得其反
- 增大结点缓存:此时由于链路的容量和处理及速度并未提升,因此在队列中的绝大多数分组的排队等待时间会大大增加,引起大量的超时重传
- 提高处理速率:往往会将瓶颈转移到其他部分
拥塞常常趋于恶化
如果一个路由器没有足够的缓存空间,它就会丢弃一些新到的分组,但当分组被丢弃时,发送这一分组的源点就会重传这一分组,甚至可能还要重传多次。这样会引起更多的分组流入网络和被网络中的路由器丢弃,可见拥塞引起的重传并不会缓解网络的拥塞,反而会加剧网络的拥塞。
拥塞控制和流量控制的区别
拥塞控制:就是防止过多的数据注入到网络中,使网络中的路由器或链路不致过载,拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。
流量控制:往往指点对点通信量的控制,是个端到端的问题(接收端控制发送端),流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
拥塞控制原理
拥塞控制的作用
图中横坐标是提供的负载,代表单位时间内输入到网络的分组数,纵坐标是网络吞吐量。
实际网络中随提供负载的增大,网络吞吐量会减缓增长直至开始下降,当负载增大到某一数值时吞吐量将为0,此时网络无法工作,这就是死锁。

开环&闭环控制
开环控制:方法就是在设计网络时事先将有关发生拥塞的因素考虑周到,力求网络在工作时不产生拥塞。
闭环控制:是基于反馈环路的概念。属于闭环控制的有以下几种措施:
- 监测网络系统以便检测到拥塞在何时、何处发生。
- 将拥塞发生的信息传送到可采取行动的地方。
- 调整网络系统的运行以解决出现的问题。
监测指标
主要指标有:
- 由于缺少缓存空间而被丢弃的分组的百分数;
- 平均队列长度;
- 超时重传的分组数;
- 平均分组时延;
- 分组时延的标准差等等
上述这些指标的上升都标志着拥塞的增长。
拥塞控制的原则
只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便把更多的分组发送出去,这样就可以提高网络的利用率;但只要网络出现拥塞或有可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入到网络中的分组数,以便缓解网络出现的拥塞。
TCP的拥塞控制算法
TCP进行拥塞控制的方法有四种,即慢开始 (slow-start)、拥塞避免(congestion avoidance)、快重传 (fast retransmit)、快恢复 (fast recovery)
TCP采用基于窗口的方法进行拥塞控制。该方法属于闭环控制方法。
TCP发送方维持一个拥塞窗口 CWND (Congestion Window)
拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。
发送端利用拥塞窗口根据网络的拥塞情况调整发送的数据量。
所以,发送窗口大小不仅取决于接收方公告的接收窗口,还取决于网络的拥塞状况,所以真正的发送窗口值为:
1
真正的发送窗口值 = Min(公告窗口值,拥塞窗口值)
慢开始
用于确定网络负载能力。基本思路:采用探测的思想,由小到大逐渐增加拥塞窗口数值。
初始拥塞窗口cwnd设置:
- 旧的规定:刚开始时将cwnd设置为1到2个发送方的最大报文段SMSS(Sender Maximum Segment Size)的数值
- 新的RFC 5681把初始拥塞窗口cwnd设置为不超过2到4个SMSS的值
慢开始门限**ssthresh(状态变量)**:防止拥塞窗口cwnd增长过大引起网络拥塞/
拥塞窗口cwnd控制方法:在每收到一个对新的报文段的确认后,可以把拥塞窗口增加最多一个SMSS的数值:
1 |
|
其中N是原先未被确认的、但现在被刚收到的确认报文段所确认的字节数。不难看出,当 N<SMSS 时,拥塞窗口每次的增加量要小于SMSS,用这样的方法逐步增大发送方的拥塞窗口cwnd,可以使分组注入到网络的速率更加合理。

注:此处的传输轮次是指——从cwnd所允许的报文段都发送 到 接收到对应的确认。例如拥塞窗口 cwnd= 4,这时的往返时间 RTT 就是发送方连续发送4个报文段,并收到这 4个报文段的确认,总共经历的时间。
慢开始门限ssthresh用法:
- 当cwnd<ssthresh时,采用慢开始
- 当cwnd>ssthresh时,采用拥塞避免算法
- 当cwnd<ssthresh时,既可慢开始也可拥塞避免
拥塞避免算法
让拥塞窗口cwnd缓慢增长,即每经过一个RTT就把cwnd+1,而不是加倍,在拥塞避免阶段加法增大
无论在慢开始还是拥塞避免阶段,只要发送方判断网络出现拥塞:
1 |
|
这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。
注:拥塞避免并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。拥塞避免是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。

- TCP连接初始化时,拥塞窗口cwnd设置为1,图中的窗口单位不使用字节而使用报文段。慢开始门限的初始值设置为 16 个报文段,即 ssthresh = 16。
- 发送端的发送窗口不能超过拥塞窗口 cwnd 和接收端窗口 rwnd 中的最小值。我们假定接收端窗口足够大,因此现在发送窗口的数值等于拥塞窗口的数值。
- 发送方每收到一个对新报文段的确认 ACK,就把拥塞窗口值加 1,然后开始下一轮的传输(请注意,横坐标是传输轮次,不是时间)。因此拥塞窗口 cwnd 随着传输轮次按指数规律增长。
- 当拥塞窗口 cwnd 增长到慢开始门限值ssthresh 时(图中的点1,此时拥塞窗口cwnd = 16),就改为执行拥塞避免算法,拥塞窗口按线性规律增长。
- 当拥塞窗口 cwnd = 24 时,网络出现了超时(图中的点2),发送方判断为网络拥塞。于是调整门限值 ssthresh = cwnd / 2 = 12,同时设置拥塞窗口 cwnd = 1,进入慢开始阶段。
- 按照慢开始算法,发送方每收到一个对新报文段的确认ACK,就把拥塞窗口值加1。当拥塞窗口cwnd = ssthresh = 12时(图中的点3,这是新的ssthresh值),改为执行拥塞避免算法,拥塞窗口按线性规律增大。
- 当拥塞窗口cwnd = 16时(图中的点4),出现了一个新的情况,就是发送方一连收到 3 个对同一个报文段的重复确认(图中记为3-ACK)。发送方改为执行快重传和快恢复算法。
- 在图的点4,发送方知道现在只是丢失了个别的报文段。于是不启动慢开始,而是执行快恢复算法。这时,发送方调整门限值ssthresh = cwnd / 2 = 8,同时设置拥塞窗口cwnd = ssthresh = 8(见图中的点5),并开始执行拥塞避免算法。
快重传
采用快重传FR(Fast Retransmission)算法可以让发送方尽早知道发生了个别报文段的丢失。快重传算法首先要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认
发送方只要一连收到三个重复确认,就知道接收方确实没有收到报文段,因而应当立即进行重传(即“快重传”),这样就不会出现超时,发送方也不就会误认为出现了网络拥塞。使用快重传可以使整个网络的吞吐量提高约20%
快恢复
当发送端收到连续三个重复的确认时,由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,而是执行快恢复算法 FR (Fast Recovery) 算法:
(1) 慢开始门限 ssthresh = 当前拥塞窗口 cwnd / 2 ;
(2) 新拥塞窗口 cwnd = 慢开始门限 ssthresh ;
(3) 开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。
加法增大,乘法减小(AIMD)
可以看出,在拥塞避免阶段,拥塞窗口是按照线性规律增大的。这常称为加法增大 AI(Additive Increase)
当出现超时或3个重复的确认时,就要把门限值设置为当前拥塞窗口值的一半,并大大减小拥塞窗口的数值。这常称为乘法减小MD (Multiplicative Decrease)
二者合在一起就是所谓的AIMD算法
