欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

《数据通信与网络》笔记--TCP中的拥塞控制

程序员文章站 2022-03-19 11:29:31
《数据通信与网络》笔记--TCP中的拥塞控制   1.拥塞窗口 发送方窗口的大小不仅取决于接收方,而、而且还取决于网络拥塞的情况。 发送方有2种信息:接收方通告的窗口大小和拥...

《数据通信与网络》笔记--TCP中的拥塞控制

 

1.拥塞窗口

发送方窗口的大小不仅取决于接收方,而、而且还取决于网络拥塞的情况。

发送方有2种信息:接收方通告的窗口大小和拥塞窗口的大小,实际的窗口大小事这两者中的最小者。

实际窗口大小 = min(rwnd,cwnd)

rwnd:接收窗口大小。

cwnd:拥塞窗口大小。

2.拥塞策略

TCP处理拥塞的一般策略基于3个阶段:慢速启动,拥塞避免和拥塞检测。

2.1.慢速启动:指数增长

TCP拥塞控制所使用的一种算法称为慢性启动(slow start),这种算法是基于这样的想法,它在开始时设置拥塞窗口大小(cwnd)

 

为一个最长段长度(MSS),每次接到一个确认时,窗口的大小就增加一个MSS值。窗口时慢速启动的,但是按指数规则增长。

下图说明了慢速启动的过程。(图中假设rwnd比cwnd大得多,这样发送方窗口大小永远等于cwnd,每段都是单独进行确认的)

 

《数据通信与网络》笔记--TCP中的拥塞控制

 

开始:cwnd = 1

第一次传输后:cwnd =2

第二次传输后:cwnd=4

第三次传输后:cwnd=8

慢速启动不能一直继续下去,到达阈值必须停止该阶段。发送方保存一个称为ssthresh(慢速启动阈值)变量,当拥塞窗口中的字节达到这个

阈值时,慢速启动阶段结束而下一个阶段开始。在大多数实现中,ssthresh值是65536个字节。

2.2.拥塞避免:加性增加

如果我们以慢速启动算法开始,则拥塞窗口大小按指数规则增长。为了在拥塞发生之前避免拥塞,必须降低指数增长的速度。TCP定义了另一个

算法,称为拥塞避免(congestion avoidance),这个算法是加性增加(additive increase),而不是指数增加。当拥塞窗口的大小达到慢速启动

的阈值时,慢速启动阶段停止,加性增加阶段开始。在这个算法中,每次整个窗口所有段都被确认(一次传输)时,拥塞窗口才增加1。下图说明

了这个过程。

 

《数据通信与网络》笔记--TCP中的拥塞控制

 

开始:cwnd = 1

第一次传输后:cwnd = 2

第二次传输后:cwnd = 3

第三次传输后:cwnd = 4

2.3.拥塞检测:乘性减少

如果发生拥塞,拥塞窗口的大小必须减少。发送方能推测出发生拥塞现象的唯一方法就是通过重传段的要求。可是重传是在两种情况下发生:重传计时器

到达或接受到三个ACK。在这二中情况下,阈值就下降一半,即乘性减少(multiplicative decrease)。大多数TCP实现包含2个反应:

1.如果计时器到达,那么存在非常严重的拥塞的可能性;一个段可能已在网络中丢失。

在这种情况下,TCP做出强烈的反应。

a.设置阈值为当前拥塞窗口大小的一半。

b.设置cwnd为一个段的大小。

c.启动慢速启动阶段。

2.如果接收到3个ACK,那么存在着轻度拥塞的可能性。一个段可能已经丢失,但自从接收到3个ACK后,有一些段可能已安全到达,这称为快速传送和快速恢复。

在这种情况下,TCP做出轻度的反应。

a.设置阈值为当前拥塞窗口大小的一半。

b.设置cwnd为阈值(有些实现是阈值加上3个段)

c.启动拥塞避免阶段。

 

下图给出了一个例子。

 

《数据通信与网络》笔记--TCP中的拥塞控制

 

假定最大窗口是32个段,阈值时16个段(最大窗口的一半),在慢速启动阶段,窗口大小从1开始按指数规律增加知道它达到阈值。

当达到阈值后,拥塞避免(加性增加)过程允许窗口大小线性增长知道计时器到达或达到最大窗口的大小。在途中,当窗口为20时,

计时器到达。此时。进入乘性减少过程,将阈值设置为当前窗口的大小的一半,当计时器达到时,当前窗口大小为10,因此现在的

阈值为10。

TCP再次进入慢速启动,并设置窗口的大小为1,当达到新阈值(10)时,TCP进入加性增加阶段。当窗口大小为12时,3个ACK事件

发生,再次进入乘性减少过程,阈值设置为6,这时TCP进入加性增加阶段,该阶段一直维持到另一个计时器到时或者另外3个ACK

事件发生为止。