梁越

tcp流量控制和拥塞控制

0 人看过

网络基础

说到TCP流量控制和拥塞控制,不得不说一下滑动窗口,TCP流量控制和拥塞控制主要是由滑动窗口来实现的,首先什么是滑动窗口

滑动窗口

滑动窗口是发送方和接收方用来进行流量控制的,因为如果每发送一个数据包就进行一次响应的话,那么网络的吞吐量会很高,传送的效率很低。我们可以想象每个快递单独运送和一整个小区的快递一起运送,哪个效率高。

那我们看看发送方的滑动窗口,其实就是三个指针:

  • SND.WND :表示发送窗⼝的⼤⼩(⼤⼩是由接收⽅指定的)
  • SND.UNA :是⼀个绝对指针,它指向的是已发送但未收到确认的第⼀个字节的序列号,也就是 #2 的第⼀
    个字节
  • SND.NXT也是⼀个绝对指针,它指向未发送但可发送范围的第⼀个字节的序列号,也就是 #3 的第⼀个
    字节

那么可⽤窗⼝⼤⼩的计算就可以是:SND.WND-(SND.NXT-SND.UNA)

那么接收方的滑动窗口只有两个指针:

  • RCV.WND :表示接收窗⼝的⼤⼩,它会通告给发送⽅。
  • RCV.NXT:表示下一个期望接收到的序列号

接收方和发送方的窗口大小和操作系统缓冲区大小有关系

窗口大小和流量控制

TCP报文里有一个窗口大小的字段,根据这个字段,发送方来确定每次发送数据的大小,以达到流量控制

拥塞窗口和拥塞控制

流量控制是避免发送⽅的数据填满接收⽅的缓存,而拥塞控制则是避免发送方数据占满整个网络

拥塞窗⼝ cwnd是发送⽅维护的⼀个的状态变量,它会根据⽹络的拥塞程度动态变化的。

慢启动

当连接建立完成时,首先设置cwnd为1,之后每收到一个ACK确认后,cwnd++,随着收到的ACK数量增加

可以看到,cwnd呈指数型增长,很快就会涨到较大值,那到什么时候停下呢

有⼀个叫慢启动⻔限 ssthresh (slow start threshold)状态变量。

  • 当 cwnd < ssthresh 时,使⽤慢启动算法
  • 当 cwnd >= ssthresh 时,就会使⽤「拥塞避免算法」

拥塞避免算法

进⼊拥塞避免算法后,它的规则是:每当收到⼀个 ACK 时,cwnd 增加 1/cwnd。

拥塞发生算法

如果拥塞避免算法不管用,拥塞还是发生了,那就启动拥塞发生算法,主要是利用重传机制,而重传有超时重传和快速重传,他们分别有不同的算法设置:

超时重传

ssthresh 设为 cwnd/2

cwnd 重置为 1

快速重传

cwnd 设为 cwnd/2

ssthresh 重置为 cwnd