章节七:TCP的拥塞控制


在上一章节 面向连接的传输:TCP中介绍了TCP的报文结构、连接管理和流量控制等内容,接下来来了解下TCP拥塞控制的原理相关内容。

1 TCP拥塞控制的状态

首先我们来了解下什么是拥塞。数据从主机A发送到主机B,中间可能会经过多个路由器,每个路由器都有缓存,当发送方发送的速率大于路由器将数据发送到下一节点的速率,那么数据会在路由器的缓存中排队等待发送,当路由器缓存达到最大值时,则会丢弃分组,从而导致数据丢失,相应的会引起数据的重传,这种情况出现,很明显会导致网络利用率降低,因为有数据丢失导致重传,因为 重传使用功能的分组可以用来传输新的数据。同时呢,会增加数据传输的时延,因为当缓存中数据积累,导致分组需要排很长的队才能发送,无形中增加了时延。TCP的拥塞控制就是监测到网络出现拥塞时,从而降低发送端的发送速率,那么是如何通过控制发送速率的呢?同时TCP是如何检测到网络中出现拥塞的呢?以及出现拥塞后使用什么手段降低发送端的发送速率呢?

首先来说一下发送端的发送速率,假设两个主机之前的往返时间为RTT,而且TCP使用的是流水线协议发送数据,使用滑动窗口来控制批量发送的数据,就像接收窗口一样,那么可以定义一个拥塞窗口(cwnd)来控制一次往返时间能发送的数据量,那么发送端的发送速率为:cwnd / RTT,那么在TCP发送端维护一个cwnd从而可以实现控制发送端的速率。

接下来讨论下发送方是如何感知网络是否拥塞的,发送端通过检测是否发生丢包事件,而丢包事件最直接的表现就是超时或者冗余ACK,TCP将此作为网络拥塞的依据。

TCP是用慢启动、拥塞避免和快速恢复从而实现了TCP发送端的拥塞避免。通过在三个状态的切换,从而实现TCP不断探测发送端的峰值,然后进行不断的调整。

TCP的拥塞避免三个状态如下:

在这里插入图片描述

2 慢启动

在连接起始阶段,首先将cwnd设置为一个MSS(最大报文长度)。并且将ssthresh(慢启动阀值)设置为64kb。在慢启动阶段针对没收到一个新的ACK,那么cwnd新增一个MSS。那么在每一个RTT内,则窗口长度会新增一倍。这里需要注意的是针对每个ACK会新增一个MSS,也就是说如果在一次传输过程中发送了8个报文,那么当8个报文的ACK到达后增cwnd变为16,所以在慢启动阶段拥塞窗口是以指数增长的。那么什么是否结束慢启动呢?有以下几个转变:

  1. 当由超时引起的丢包事件,那么会将ssthresh设置为cwnd的一半,同时将cwnd设 置为1个MSS,从新开始慢启动。
  2. 当cwmd达到ssthresh时,此时cwnd已经达到第一步的拥塞时窗口的一半,那么离 拥塞不远了,所以不能再以指数增长了,所以转换为拥塞避免状态,变为线性增长。
  3. 当由于冗余ACK引起的丢包事件,那么会将ssthresh设置为cwnd的一半,并且将 cwnd设置为原先的cwnd的一半并且加上3个MSS。

3 拥塞避免

当进入拥塞避免状态后,cwnd的增长速度变低,变为线性增长。所以对于每一个ACK不再是增长一个MSS,而是增长MSS*(MSS/cwnd),假如一次发送了8个报文段,那么这8个报文段的总长度就是cwnd,那么每个ACK增长一个MSS*(MSS/cwnd),当8个ACK到达后则整个增长了一个MSS。

4 快速恢复

快速恢复不是TCP拥塞避免的一个必须组件,快速恢复状态主要就是进行快速重传,将丢失的报文尽可能的恢复,所以进入此状态均是将窗口变小,主要是减小窗口,尽量避免拥塞,然后重传冗余ACK的报文。

TCP的拥塞避免的整个算法机制就是TCP不断的通过增长cwnd从而增加发送方的发送速率,通过这种方法探测网络中允许的发送速率,当到达峰值后折半然后再次增加,如此反复。当然慢启动阶段是很短的,应为其是线性增长的。那么总体来看,TCP的拥塞避免如下:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值