流量控制就是让发送方的发送速度不要太快,要让接收方来得及接收
原理就是通过确认报文中的窗口字段,发送方的发送窗口字段不能超过接收方的窗口大小,这个机制有点类似滑动窗口的机制。
如果窗口开的太大,且发送方发送的速度过快了,使得窗口饱和,未发送的部分长度为 0,这时候接收方的压力也会变大,窗口内全都是已发送未确认的包,也会对缓存造成负担,未确认的部分也会一直放在发送方的缓存里,这个时候就需要通过确认信息来减小窗口大小,或者缩小为 0,让发送方的速率变慢;
如果发送方的发送速度太慢了或者接收方一直处理接收到的包太慢了,也需要减小窗口的大小来降低速率;
有一种特殊情况就是如果窗口减小到了 0,这个时候发送方就不能在发送了,然后接收方的缓存被清空也就是缓存中的包都被处理了,接收方又有了空间,但是这个时候发送方并不知道接收方已经可以再次接收数据了,因为 TCP 仅当它有数据或者确认报文要发送时才会发送报文段给接收方,所以发送方就会被阻塞而不再发送数据了,为了解决这个问题,当收到零窗口通知时,会启动一个计数器,当计数器的时间到期时,发送方就会发送一个字节的数据报文段进行探测,而接收方就会在确认这个报文段的时候给出一个新的非 0 的窗口值,如果还是为 0,则计数器重置。