以下三种算法,严格来说并不能算是拥塞控制算法。因为我们认为的拥塞控制算法通常是传输层进行的拥塞控制。

互联网TCP拥塞控制算法的基本设计理念是必须端端执行。这个网络被认为是一个“黑匣子”。TCP源无法从网络中接收到任何显式的拥塞反馈。当一个拥塞控制算法不需要任何来自下层的支持,我们会认为他严格遵循层分离和模块化原则。

因此,为了确定它可以传输的速率,源必须通过逐步增加输入负载(通过缓慢的启动和拥塞避免阶段)来探测路径,直到隐式反馈,如超时或重复确认,即已达到网络容量的信号。或者有些算法通过ACK数量、RTT估计、带宽估计等来进行探测。

八、SACK

SACK针对NewReno算法的一些问题进行了改进。

New Reno算法每个RTT只能恢复一个丢失段,虽然相比于Reno他能够恢复,但是恢复的效率慢。

拥塞控制的wireshark流程_tcp/ip


拥塞控制的wireshark流程_tcp/ip_02


为了实现告诉发送方乱序到底的段,SACK在选项中加入了多个TCP options。每个TCP option表示一个乱序到达的区间,长度为10。共标注了乱序到达的左边界和右边界加一。发送方收到后,会维持一个计分板(scoreBoard),标注这些乱序到达的段,并重发没有到达的段。

拥塞控制的wireshark流程_网络_03

除此之外,发送方会维护一个pipe,来动态维护管道中的outstanding的数量平衡,即与拥塞窗口的大小相等。

拥塞控制的wireshark流程_网络_04

发送方考虑以下五种情况:

  1. 收到冗余ACK且无SACK选项
  2. 收到冗余ACK且有SACK选项
  3. 收到PACK且无SACK选项:处于拥塞避免阶段,新段被确认,说明该段和该段被重传的段,都从管道中走出,所以pipe-2
  4. 收到PACK且有SACK选项
  5. 收到RACK

拥塞控制的wireshark流程_拥塞控制_05


以下是SACK基本原理:

拥塞控制的wireshark流程_tcp/ip_06


缺点:部署SACK的代价。

九、ECN

参考链接:ECN算法视频教程

ECN是有网络辅助信息的拥塞控制。

以往我们都是根据一些网络事件(比如三个冗余ACK或者超时)来判断拥塞,进而进行调节。而网络提供信息给端系统则更快。

拥塞控制的wireshark流程_拥塞控制_07


改变了IP协议的数据报,

CE:代表网络中发生了拥塞

ECT:表示ECN使能。

Not ECT:表示不支持ECNTCP数据段,

CWR置为1:表示拥塞窗口减半,

ECE置为1:表示目标主机发现拥塞

拥塞控制的wireshark流程_拥塞控制的wireshark流程_08

拥塞控制的wireshark流程_拥塞控制的wireshark流程_09


接收方发送时,ECE置为1,指示发送方降速并cwd置为1。

拥塞控制的wireshark流程_拥塞控制_10


发送方接收到后,将cwd置为1,并且回复一个cwd=1的数据段,表示我已经将cwd置为一了。

接收方收到后,不再将ECN置为一。

拥塞控制的wireshark流程_拥塞控制的wireshark流程_11


缺点:

  1. 安全性:在某路由器时强制更改数据包
  2. 如何进行增速等问题。

十、RED


在网络层进行全局拥塞控制(所以我们确切地不认为他是链路层的拥塞控制算法):为避免发生网路中的全局同步现象,路由器采用随机早期检测(RED算法)

使路由器的队列维持两个参数,即队列长队最小门限min和最大门限max,每当一个分组到达的时候,RED就计算平均队列长度。然后分情况对待到来的分组:

  1. 平均队列长度小于最小门限——把新到达的分组放入队列排队。
  2. 平均队列长度在最小门限与最大门限之间——则按照某一概率将分组丢弃。
  3. 平均队列长度大于最大门限——丢弃新到达的分组。