什么是拥塞?如何解决拥塞?
拥塞 :网络中某资源资源的需求超过了该资源所能提供的可用部分
为什么增加资源不能解决拥塞?
简单来说,出现拥塞就是:需求 > 供给
那么增大供给量,不就可以解决拥塞了吗?答案是否定的
因为网络是一个复杂的系统,如果出现拥塞,只增加资源是不能解决问题的,还有可能会使网络性能更坏
例如:
- 当出现网络拥塞,然后不断增加资源,那么路由器的缓存空间就会不足,从而丢弃一些分组,然后不断重传
- 那么再增大路由器的缓存空间呢?还也只是可以解决此问题,但还会有更多的新问题产生
- 所以,单单增加资源,这并不能重根本上解决网络拥塞问题
如何控制拥塞?
TCP采用基于拥塞窗口的方法进行拥塞控制,该方法属于闭环控制方法
- 开环控制:在设计网络时,事先将所有可能的发生拥塞的情况都考虑到,力求不产生拥塞
- 闭环控制:动态监测网络系统,检测拥塞并进行反馈、调整,以解决问题
拥塞窗口可以简单理解为一个窗口,每次发送数据的大小都限制在这个窗口的范围之内
控制拥塞窗口的原则
- 只要网络没有出现拥塞,拥塞窗口就可以再增大一些
- 只要网络出现拥塞或有可能出现拥塞,就将拥塞窗口减小一些
如何判断出现了拥塞?
- 重传定时器超时
- 收到三个重复的ACK
TCP拥塞控制算法
- 慢开始
- 拥塞避免
- 快重传
- 快恢复
慢开始
由小到大逐渐增大拥塞窗口数值
- 拥塞窗口cwnd初始值:1
- 每经过一个传输轮次(往返时间),拥塞窗口cwnd就加倍(指数增长)
- 当增加到慢开始门限ssthresh时(cwnd > ssthresh),改为拥塞避免算法
(当cwnd = ssthresh时,既可以用慢开始算法,也可疑用拥塞避免算法)
拥塞避免
让拥塞窗口按线性规律缓慢的增大
- 每经过一个传输轮次,拥塞窗口cwnd加 1(慢开始算法是加倍)
直到网络出现拥塞,当拥塞原因为
- 超时:使 ssthresh = max(cwnd/2, 2)(在两者之间取最大值),cwnd = 1,执行慢开始算法
- 收到三个重复的ACK:ssthresh = 当前拥塞窗口cwnd / 2,新拥塞窗口cwnd = 慢开始门限 ssthresh,执行拥塞避免算法
快重传
当发送方收到连续三个重复的ACK时,就知道接收方确实没有收到报文段,应立即进行快重传算法,这样就不会出现超时,发送方也就不会误认为出现了网络拥塞
快恢复
当发送方收到连续三个重复的ACK时,执行快恢复算法
- 将慢开始门限ssthresh = 当前拥塞窗口cwnd / 2
- 新拥塞窗口cwnd = 慢开始门限ssthresh
- 然后执行拥塞避免算法
TCP拥塞控制流程图
例题
1、试画出拥塞窗口与传输轮次的关系曲线。
(此曲线采用python-matplotlib绘制)
2、指明TCP工作在慢开始阶段的时间间隔。
- 【1-6】和【23-26】
3、指明TCP工作在拥塞避免阶段的时间间隔。
- 【6-16】和【17-22】
4、在第16轮次和第22轮次之后发送方是通过收到三个重复的确认还是通过超时检测到丢失了报文段?。
- 第16轮次收到的是三个重复的确认,因为随后执行的是快恢复,慢开始门限ssthresh = 当前拥塞窗口cwnd / 2,新拥塞窗口cwnd = 慢开始门限ssthresh,开始执行拥塞避免算法
- 第22轮次收到的是超时,因为随后拥塞窗口cwnd恢复到1
5、在第1轮次、第18轮次和第24轮次发送时,门限ssthresh分别被设置为多大?。
- 第1轮次,门限值:32
- 第18轮次,门限值:21,(发生拥塞时的一半)
- 第24轮次,门限值:13(发送拥塞时的一半)
6、在第几轮次发送出第70个报文段?。
- 在第7轮次发送出第70个报文段
7、假定在第26轮次之后收到了三个重复的确认,因而检测出了报文段的丢失,那么拥塞窗口cwnd和门限ssthresh应设置为多大?。
- 拥塞窗口cwnd和门限ssthresh应设置为:4,(因为26轮次的拥塞值为8,且收到三个重复的ACK,所以下一次设置为一半)
拥塞控制与流量控制的区别
- 拥塞控制:全局性的过程,涉及所有主机、路由器,以及与降低网络传输性能有关的所有因素,防止过多的数据注入到网络中,使网络的路由器或链路不致过载
- 流量控制:往往指点对点通信量的控制,是端到端的问题,所要做的就是抑制发送端发送数据的速率,以便使接收端来的及接收
加法增大、乘法减小
- 在拥塞避免阶段,拥塞窗口是按照线性规律增大的,称为“加法增大”(AI)
- 当出现超时或连续三个重复的ACK时,就要把门限值设置为当前拥塞窗口的一半,并大大减少拥塞窗口的数值,称为“乘法减小”(MD)
- 两个合在一起就是AIMD算法
拥塞控制所起的作用
总结
拥塞控制是非常难设计的,因为它是一个动态的问题
拥塞控制并不能完全解决拥塞问题,只是降低了拥塞的程度
真正的发送窗口值 = Min{接收方窗口值,拥塞窗口值}