【计算机网络】TCP面试知识(5)拥塞控制

1、为什么要有拥塞控制呀,不是有流量控制了吗?

前⾯的流量控制是避免「发送⽅」的数据填满「接收⽅」的缓存,但是并不知道⽹络的中发⽣了什么。

⼀般来说,计算机⽹络都处在⼀个共享的环境。因此也有可能会因为其他主机之间的通信使得⽹络拥堵。

在⽹络出现拥堵时,如果继续发送⼤量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是⼀重传就会导致⽹络的负担更重,于是会导致更⼤的延迟以及更多的丢包,这个情况就会进⼊恶性循环被不断地放⼤…

所以,TCP 不能忽略⽹络上发⽣的事,它被设计成⼀个⽆私的协议,当⽹络发送拥塞时,TCP 会⾃我牺牲,降低发送的数据量。

于是,就有了拥塞控制,控制的⽬的就是避免「发送⽅」的数据填满整个⽹络。
为了在「发送⽅」调节所要发送数据的量,定义了⼀个叫做「拥塞窗⼝」的概念。

2、什么是拥塞窗口?和发送窗⼝有什么关系呢?

拥塞窗⼝ cwnd是发送⽅维护的⼀个的状态变ᰁ,它会根据⽹络的拥塞程度动态变化的。

发送窗⼝ swnd 和接收窗⼝ rwnd 是约等于的关系,那么由于加⼊了拥塞窗⼝的概念后,此
时发送窗⼝的值是swnd = min(cwnd, rwnd),也就是拥塞窗⼝和接收窗⼝中的最⼩值。

拥塞窗⼝ cwnd 变化的规则:

  • 只要⽹络中没有出现拥塞, cwnd 就会增⼤;
  • 一旦⽹络中出现了拥塞, cwnd 就减少;

那么怎么知道当前⽹络是否出现了拥塞呢?

其实只要「发送⽅」没有在规定时间内接收到 ACK 应答报⽂,也就是发⽣了超时重传,就会认为⽹络出现了⽤拥塞。

3、拥塞控制有哪些控制算法?

拥塞控制主要是四个算法:

  • 慢启动
  • 拥塞避免
  • 拥塞发⽣
  • 快速恢复

(1)慢启动

TCP 在刚建⽴连接完成后,⾸先是有个慢启动的过程,这个慢启动的意思就是⼀点⼀点的提⾼发送数据包的数量,
如果⼀上来就发⼤量的数据,这不是给⽹络添堵吗?

慢启动的算法记住⼀个规则就⾏:当发送⽅每收到⼀个 ACK,拥塞窗⼝ cwnd 的⼤⼩就会加 1。

假定拥塞窗⼝ cwnd 和发送窗⼝ swnd 相等,举例说明:

  • 连接建⽴完成后,⼀开始初始化 cwnd = 1 ,表示可以传⼀个 MSS ⼤⼩的数据。
  • 当收到⼀个 ACK 确认应答后,cwnd 增加 1,于是⼀次能够发送 2 个
  • 当收到 2 个的 ACK 确认应答后, cwnd 增加 2,于是就可以⽐之前多发2 个,所以这⼀次能够发送 4 个
  • 当这 4 个的 ACK 确认到来的时候,每个确认 cwnd 增加 1, 4 个确认 cwnd 增加 4,于是就可以⽐之前多发4 个,所以这⼀次能够发送 8 个。

在这里插入图片描述

可以看出慢启动算法,发包的个数是指数性的增⻓。

【那慢启动涨到什么时候是个头呢?】

有⼀个叫慢启动⻔限 ssthresh (slow start threshold)状态变量。

  • 当 cwnd < ssthresh 时,使⽤慢启动算法。
  • 当 cwnd >= ssthresh 时,就会使⽤「拥塞避免算法」。

(2)拥塞避免算法

当拥塞窗⼝ cwnd 「超过」慢启动⻔限 ssthresh 就会进⼊拥塞避免算法。

⼀般来说 ssthresh 的⼤⼩是 65535 字节。

那么进⼊拥塞避免算法后,它的规则是:每当收到⼀个 ACK 时,cwnd 增加 1/cwnd。

接上前⾯的慢启动的栗⼦,现假定 ssthresh 为 8 :

  • 当 8 个 ACK 应答确认到来时,每个确认增加 1/8,8 个 ACK 确认 cwnd ⼀共增加 1,于是这⼀次能够发送 9个 MSS ⼤⼩的数据,变成了线性增⻓。

在这里插入图片描述

所以,我们可以发现,拥塞避免算法就是将原本慢启动算法的指数增⻓变成了线性增⻓,还是增⻓阶段,但是增⻓速度缓慢了⼀些。

就这么⼀直增⻓着后,⽹络就会慢慢进⼊了拥塞的状况了,于是就会出现丢包现象,这时就需要对丢失的数据包进⾏重传。

当触发了重传机制,也就进⼊了「拥塞发⽣算法」。

(3)拥塞发⽣

当⽹络出现拥塞,也就是会发⽣数据包重传,重传机制主要有两种:

  • 超时重传
  • 快速重传
①发⽣超时重传的拥塞发⽣算法

当发⽣了「超时重传」,则就会使⽤拥塞发⽣算法。

这个时候,ssthresh 和 cwnd 的值会发⽣变化:

  • ssthresh 设为 cwnd/2 ,
  • cwnd 重置为 1

在这里插入图片描述

接着,就重新开始慢启动,慢启动是会突然减少数据流的。这真是⼀旦「超时重传」,⻢上回到解放前。但是这种⽅式太激进了,反应也很强烈,会造成⽹络卡顿。

②发⽣快速重传的拥塞发⽣算法

还有更好的⽅式,前⾯我们讲过「快速᯿传算法」。当接收⽅发现丢了⼀个中间包的时候,发送三次前⼀个包的ACK,于是发送端就会快速地᯿传,不必等待超时再᯿传。

TCP 认为这种情况不严重,因为⼤部分没丢,只丢了⼀⼩部分,则 ssthresh 和 cwnd 变化如下:

  • cwnd = cwnd/2 ,也就是设置为原来的⼀半;
  • ssthresh = cwnd ;
  • 进⼊快速恢复算法

(4)快速恢复

快速重传和快速恢复算法⼀般同时使⽤,快速恢复算法是认为,你还能收到 3 个重复 ACK 说明⽹络也不那么糟糕,所以没有必要像 RTO 超时那么强烈。

正如前⾯所说,进⼊快速恢复之前, cwnd 和 ssthresh 已被更新了:

  • cwnd = cwnd/2 ,也就是设置为原来的⼀半;
  • ssthresh = cwnd ;

然后,进⼊快速恢复算法如下:

  • 拥塞窗⼝ cwnd = ssthresh + 3 ( 3 的意思是确认有 3 个数据包被收到了);
  • 重传丢失的数据包;
  • 如果再收到重复的 ACK,那么 cwnd 增加 1;
  • 如果收到新数据的 ACK 后,把 cwnd 设置为第⼀步中的 ssthresh 的值,原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进⼊拥塞避免状态;

在这里插入图片描述

也就是没有像「超时重传」⼀夜回到解放前,⽽是还在⽐较⾼的值,后续呈线性增⻓。

4、拥塞算法示意图

在这里插入图片描述

整理自小林coding所著的《图解网络》,仅做学习用,侵删

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值