【计算机网络】TCP的拥塞控制

原文链接:https://blog.csdn.net/m0_37962600/article/details/79993310
仅做个人学习自用,不做商用

拥塞基本知识

1 概念

在某段时间内,如果对网络中的某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变化,这种情况叫拥塞

2 拥塞控制

防止过多的数据注入到网络当中,这样可以使网络中的路由器或链路不致过载(通过拥塞窗口处理网络拥塞现象的一种机制)

  • a. 前提 :网络能够承受现有的网络负荷
  • b.拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素。
  • c. 与流量控制的区别:流量控制往往是指点对点通信量的控制,是个端到端的问题。流量控制所要做的就是控制发送端发送数据的速率,以便使接收端来得及接收。
  • d. 代价:需要获得网络内部流量分布的信息。在实施拥塞控制之前,还需要在结点之间交换信息和各种命令,以便选择控制的策略和实施控制。这样就产生了额外的开销。拥塞控制还需要将一些资源分配给各个用户单独使用,使得网络资源能更好的实现共享。

3 拥塞控制的几种方法

慢开始 拥塞避免 快重传 快恢复

拥塞控制方法详解

1 慢启动

  • a.算法原理:

当主机开始发送数据时,如果立即将大量数据字节注入到网络,那么就有可能因为不清楚当前网络的负荷情况而引起网络阻塞。所以最好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。
通常在刚刚发送报文段时,先把拥塞窗口cwnd设置为一个最大报文段MSS的数值。而在每收到一个新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值。用这样的方法逐步增大发送方的拥塞窗口cwnd,可以使分组注入到网络的速率更加合理。(慢开始当中的“慢”并不是指cwnd的增长速率慢,而是在TCP开始发送报文段时先设置cwnd = 1,使得发送方在开始时只发送一一个报文段)
当rwnd足够大的时候,为了防止拥塞窗口cwnd的增长引起网络阻塞,还需要另外一个变量------慢开始门限ssthresh.

i.当cwnd < ssthresh时,使用上述慢启动算法;

ii.当cwnd >ssthresh时,停止使用慢启动算法,改用拥塞避免算法;

b.慢开始的局限性

i.需要获得网络内部流量分布的信息,浪费可用的网络容量,额外开销;

ii.估算合理的ssthresh值并不容易,可能耗时较长

2 拥塞避免

a. 算法思路
让拥塞窗口cwnd缓慢的增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,这样拥塞窗口cwnd按线性规律缓慢的增长,比慢开始算法的拥塞窗口的增长速率缓慢的多。

无论是慢启动算法还是拥塞避免算法,只要判断网络出现阻塞,就要把慢启动开始门限(ssthresh)设置为发送窗口的一半(>= 2),cwnd设置为1,然后再使用慢启动算法,这样做的目的能迅速的减少网络当中的数据传输,使发生拥塞的路由器能够把队列中堆积的分组处理完毕。拥塞窗口使按照线性的规律增长。

b. 控制过程

TCP连接初始化,将拥塞窗口cwnd设置为1个报文段,即cwnd = 1
执行慢开始算法,cwnd按指数规律增长,直到cwnd == ssthresh时,开始执行拥塞避免算法,cwnd开始按照线性规律增长
当网络发生拥塞,把ssthresh更新为拥塞前ssthresh值的一半,cwnd重新设置为1,再按照2执行

例如:
a. 在TCP 连接进行初始化的时候,cwnd = 1, ssthresh = 16
b. 在慢启动算法开始时,cwnd初始值是1,每次发送方收到一个ACK阻塞窗口就增加1,当cwnd == ssthresh时,启动拥塞控制算法,拥塞窗口按照线性规律增长
c. 当cwnd = 24时,网络出现超时,发送方收不到确认ACK,此时设置ssthresh = 12,设置cwnd = 1,然后开始慢启动算法,当cwnd == ssthresh = 12,慢启动算法变为拥塞控制算法,cwnd按照线性速度增长

在这里插入图片描述

AIMD(加法增大乘法减小)
a.乘法减小:无论在慢启动阶段还是在拥塞控制阶段,只要网络出现超时,就是将cwnd置为1,ssthresh置为cwnd的一半,然后开始执行慢启动算法
b. 加法增大:当网络频发出现超时情况时,ssthresh就下降的很快,为了减少注入到网络当中的分组数,而加法增大是执行拥塞避免算法后,使拥塞窗口缓慢的增大,以防止网络过早出现拥塞

这两个结合起来就是AIMD算法,是使用最广泛的算法。 拥塞避免算法不能够完全的避免网络拥塞,通过控制拥塞窗口的大小只能使网络不易出现拥塞

3 快重传

一条TCP连接有时会因为等待重传计时的超时而空闲较长时间,慢开始和拥塞避免无法解决这类问题,因此提出了快重传和快恢复的拥塞控制方法。

  • a. 算法过程
    快重传算法要求在接收方收到一个失序的报文段后立即发出重复确认,而不要等待自己发送数据时才进行捎带确认
    在这里插入图片描述
    在上图中,接收方成功的接受了发送方发来的M1,M2并且分别发送了ACK,现在接收方没有收到M3,而收到了M4,显然接收方不能确认M4,因为M4是失序的报文段。
    如果根据可靠性传输原理接收方什么都不做,但是按照快速重传算法,在收到M4, M5等报文段的时候,不断重复的向发送方发送M2的ACK,如果接收方一连收到三个重复的ACK,就应当立即重传对方尚未收到的报文段,而不必等待重传计时器到期。

4 快恢复

a. 当发送方连续收到三个重复确认时,执行“乘法减小” 算法,慢启动门限减(为了预防网络发生阻塞)

b. 由于发送方现在认为网络很可能没有发生阻塞,因此现在不执行慢启动算法,而是把cwnd值设置为慢启动门限减半后的值,然后开始执行拥塞避免算法,拥塞窗口cwnd值线性增大

在这里插入图片描述

原文链接:https://blog.csdn.net/m0_37962600/article/details/79993310

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值