网络基础
说到TCP流量控制和拥塞控制,不得不说一下滑动窗口,TCP流量控制和拥塞控制主要是由滑动窗口来实现的,首先什么是滑动窗口
滑动窗口是发送方和接收方用来进行流量控制的,因为如果每发送一个数据包就进行一次响应的话,那么网络的吞吐量会很高,传送的效率很低。我们可以想象每个快递单独运送和一整个小区的快递一起运送,哪个效率高。
那我们看看发送方的滑动窗口,其实就是三个指针:
那么可⽤窗⼝⼤⼩的计算就可以是:SND.WND-(SND.NXT-SND.UNA)
那么接收方的滑动窗口只有两个指针:
接收方和发送方的窗口大小和操作系统缓冲区大小有关系
TCP报文里有一个窗口大小的字段,根据这个字段,发送方来确定每次发送数据的大小,以达到流量控制
流量控制是避免发送⽅的数据填满接收⽅的缓存,而拥塞控制则是避免发送方数据占满整个网络
拥塞窗⼝ cwnd是发送⽅维护的⼀个的状态变量,它会根据⽹络的拥塞程度动态变化的。
当连接建立完成时,首先设置cwnd为1,之后每收到一个ACK确认后,cwnd++,随着收到的ACK数量增加
可以看到,cwnd呈指数型增长,很快就会涨到较大值,那到什么时候停下呢
有⼀个叫慢启动⻔限 ssthresh (slow start threshold)状态变量。
进⼊拥塞避免算法后,它的规则是:每当收到⼀个 ACK 时,cwnd 增加 1/cwnd。
如果拥塞避免算法不管用,拥塞还是发生了,那就启动拥塞发生算法,主要是利用重传机制,而重传有超时重传和快速重传,他们分别有不同的算法设置:
ssthresh 设为 cwnd/2
cwnd 重置为 1
cwnd 设为 cwnd/2
ssthresh 重置为 cwnd