tcp协议-拥塞控制

tcp协议-拥塞控制

前言

目的:为了避免发送方无节制地发送数据,从而造成网络拥堵。
流量控制和拥塞控制的区别:
流量控制是作用于接收者的,控制发送者的发送速度从而使接收者来得及接收,防止分组丢失。
拥塞控制是作用于网络的,防止过多的数据注入到网络中,避免网络负载过大。

基础

拥塞现象:

当网络负载较小时,吞吐量基本上随着负载的增长而增长,呈线性相关,响应时间增长缓慢。当负载达到网络容量时,吞吐量呈现出缓慢增长,而响应时间急剧增加,称为Knee。假如负载继续增加,路由器开始丢包,当负载超过一定量时,吞吐量开始急剧下降,称为Cliff。

在这里插入图片描述

原因:

网络能够提供的资源不足以满足用户的需求,包括缓存空间、链路带宽容量和中间节点的处理能力…

解决方向:

拥塞虽然是由于网络资源的稀缺引起的,但单纯增加资源并不能避免拥塞的发生。拥塞本身是一个动态问题,它不可能只靠静态的方案来解决,而需要协议能够在网络出现拥塞时保护网络的正常运行。

拥塞控制机制

拥塞控制机制实际上包含拥塞避免和拥塞控制两种策略。前者的目的是使网络运行在Knee四周,避免拥塞的发生;而后者则是使得网络运行在Cliff的左侧区域。前者是一种“预防”措施,维持网络的高吞吐量、低延迟状态,避免进入拥塞;后者是一种“恢复”措施,使网络从拥塞中恢复过来,进入正常的运行状态。

拥塞控制算法

慢开始、拥塞避免、快重传、快恢复。整体过程大约如下:

  1. 在 TCP 连接建立完毕后,会先使用慢开始算法,指数级逐渐增大拥塞窗口(+1 +2 +4 +8…)。
  2. 当拥塞窗口达到慢启动门限 ssthresh时,会使用“拥塞避免算法”,线性逐渐增大拥塞窗口。(+1 +1 +1…)
  3. 当发生超时重传或快速重传时
    1. 发生超时重传,将 ssthresh 设为 cwnd/2,将 cwnd 设为初始值,然后会再次使用慢开始算法。
    2. 发生快重传,使用快恢复算法,然后进入拥塞避免阶段。
慢开始

TCP 在刚建立连接完成后,首先是有个慢开始的过程,其体现就是一点一点的提高发送数据包的数量,当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1。慢开始算法过程中数据大传输呈指数性增长。
指数性增长就体现在开始增长速率慢,所以叫慢开始。但指数性增长后期增长速率极快,为防止增长过快引起,有一个状态变量慢启动门限 ssthresh (slow start threshold)控制其何时停止慢开始算法。
当 cwnd < ssthresh 时,使用慢启“开始算法”。
当 cwnd >= ssthresh 时,使用“拥塞避免算法”。

拥塞避免

规则:每当收到一个 ACK 时,cwnd 增加 1。
拥塞避免算法就是将原本慢开始算法的指数增长变成了线性增长。就这么一直增长着后,防止网络突然进入拥塞。当触发了重传机制,也就进入了“拥塞发生算法”。

拥塞发生

当触发 TCP 重传机制时,就视为拥塞发生。TCP 的重传包括“超时重传”和“快速重传”,两种重传表示两种不同的网络情况,对应的也有两种拥塞控制手段。

超时重传

当发送方未在规定时间内接收到 ACK 确认包时,就会超时重传。每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境差,不宜频繁反复发送。
当发生“超时重传”,就会使用拥塞发生算法,重新进入慢启动阶段。
这个时候,ssthresh 和 cwnd 的值会发生变化:
ssthresh 设为 cwnd/2;
cwnd 重置为初始值;

快速重传

快速重传不以时间为驱动,而是以数据驱动重传。如果接收方收到一个失序的报文段,就即回送一个 ACK 给发送方。快速重传就是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。
当发生“快速重传”,TCP 认为这种情况不严重,就会启动快恢复算法,ssthresh 和 cwnd 也会发生变化
cwnd = cwnd/2 ;
ssthresh = cwnd;
进入“快恢复算法”;

快恢复

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

补充

快恢复是拥塞发生后慢启动的优化,其首要目的仍然是降低 cwnd 来减缓拥塞,所以必然会出现 cwnd 从大到小的改变。
快恢复算法会重传丢失的数据包,但如果此时再次发生“快重传”,就不会再使用“快恢复算法”,而会直接进入“慢开始”阶段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值