03_TCP协议的流量控制和拥塞控制

一、TCP流量控制

作用:为了解决发送方和接收方速度不同而导致的数据丢失问题,当发送方发送的太快,接收方来不及接受就会导致数据丢失。

方式:由接收端采用滑动窗口的形式,告知发送方允许/停止发包解决TCP丢包问题。

TCP流量控制主要使用滑动窗口协议,滑动窗口是接受数据端使用的窗口大小,用来告诉发送端接收端的缓存大小,以此可以控制发送端发送数据的大小,从而达到流量控制的目的。

操作过程:

(1)接收端向发送端通知自已可以接收数据的大小;

(2)于是发送端会发送不超过这个限度的数据,该大小限度就被称作窗口大小。窗口大小的值由接收端主机决定,而在TCP 首部中,专门有一个字段用来通知窗口大小:

image

(3)接收端将自己可以接收的缓冲区大小放入这个字段中通知给发送端,这个字段的值越大,说明网络的吞吐量越高。

接收端的这个缓冲区一旦面临数据溢出时,窗口大小的值也会随之被设置为一个更小的值通知给发送端,从而控制数据发送量。也就是说,发送端主机会根据接收端主机的指示,对发送数据的量进行控制。这也就形成了一个完整的TCP流控制(流量控制)。Window=0时,即告知发送方停止发送数据。

对所有数据帧按顺序赋予编号,发送方在发送过程中始终保持着一个发送窗口,只有落在发送窗口内的帧才允许被发送;同时接收方也维持着一个接收窗口,只有落在接收窗口内的帧才允许接收。这样通过调整发送方窗口和接收方窗口的大小可以实现流量控制。

我们可以通过下图来分析:

image

(1)发送方接收到了对方发来的报文 ack = 33, win = 10,知道对方收到了 33 号前的数据,现在期望接收 [33, 43) 号数据。那我们开始发送[33, 43) 号的数据。

(2)[33, 43) 号的数据你是已经发送了,但接受方并没有接受到[36,37]数据。所以接收方发送回对报文段 A 的确认:ack = 35, win = 10

(3)发送方收到了 ack = 35, win = 10,对方期望接收 [35, 45) 号数据。那么发送方在发送[35, 45) 。

  这里面需要思考一个问题: 第一步发送了[33, 43),如果这次发送[35, 45),那中间重叠部分不是发送了两次,所以这里要思考: 是全部重新发送还是只发送接收端没有收到的数据,如果全部发送那么重复,发送的数据接收端怎么处理。

(4)接收方接收到了报文段 [35, 41),接收方发送:ack = 41, win = 10(这是一个累积确认)。

(5)发送方收到了 ack = 41, win = 10,对方期望接收 [41, 51) 号数据。

这样一直传输数据,直到数据发送完成。这么一来就保证数据数据的可靠性,因为如果某数据没有获取到,那么ack永远不会跳过它。

这里也要思考一个问题,如果某一数据一只没有获取到,总不能一直这样堵塞在这里吧,下面就要讲接下来有关堵塞的解决方法。

二、拥塞控制

作用:为了解决过多的数据注入到网络导致网络崩溃和超负荷问题。

方式:由发送方采用拥塞窗口的形式去判断网络状态,从而采取不同算法执行TCP动态发包解决网络整体质量问题。

两个概念:

  1. 拥塞窗口(cwnd):发送方维持的一个状态变量,其大小取决于网络的拥塞程度,并且动态变化。
  2. 慢开始门限(ssthresh):为了防止拥塞窗口cwnd的增长过大引起网络拥塞所设置的一个门限值。

TCP拥塞控制的几种方法:慢开始拥塞避免快重传快恢复

如何确认使用算法?

  1. 当cwnd < ssthresh时,使用慢开始算法;
  2. 当cwnd > ssthresh时,停止使用慢开始算法而改用拥塞避免算法;
  3. 当cwnd = ssthresh时,既可使用慢开始算法,也可使用拥塞避免算法。

2.1 慢开始

发送方先探测网络拥塞程度,并不是一开始就发送大量的数据,发送方会根据拥塞程度增大拥塞窗口cwnd。

计算方法:每经过一个传输轮次cwnd值就加倍,让cwnd值呈指数增加。

image

具体过程

  1. 当前发送方cwnd值为1,因此只能发送一个数据报文段(拥塞窗口cwnd值是几就能发送几个数据段);
  2. 接收方收到该数据报文段后回复一个确认报文段,发送方收到该确认报文后,将cwnd值变为2(加倍);
  3. 发送方此时可以连续发送两个数据段,接收方收到该数据段后一次发回2个确认报文段;
  4. 发送方收到这两个确认报文后,将cwnd值加2变为4(加倍)后可以连续发送4个数据段,以此类推直至cwnd=ssthresh。

2.2 拥塞避免

继上图达到cwnd≥ssthresh后采用该算法用来控制拥塞窗口的增长速率。

计算方法:每经过一个传输轮次cwnd值加1,让cwnd值呈线性缓慢增大。

image

2.3 拥塞发生

当网络发生拥塞丢包时(如图假定cwnd=24),会有两种情况:快重传快恢复

超时重传算法直接把cwnd减小到1太过强烈,若还能收到连续3个ACK说明网络质量没那么差。同时采用快重传和快恢复算法,过程如下:

  1. 当发送方连续收到3个重复确认时即执行“乘法减小”算法,把慢开始门限ssthresh 减半;
  2. 由于发送方现在认为网络不那么差,于是把cwnd值设置为开始门限ssthresh 减半后的数值;
  3. 开始执行拥塞避免算法 (“加法增大”)使拥塞窗口缓慢地线性增大。

image

 
 
 
 
 
 
 
 
posted @ 2025-09-12 08:53  碧蓝i之海  阅读(142)  评论(0)    收藏  举报