tcp的流控制
流控制,又叫做流量控制。接收端在接收发送端发送的数据包的时候,如果是高负荷情况下就无法继续接收数据,只能丢弃,丢弃后发送端超时重传,又加重了阻塞。
所以,用TCP提供了流量控制机制。 接收端向发送端通知它可以接收数据的大小。于是发送端就会发送不抄过这个限度的数据,这个数据叫做窗口大小。
TCP中有一个字段表示窗口大小。接收机将自己可以接受的缓冲区大小填入该字段发送给发送端,这个字段的值越高,就表明该主机吞吐量越大。
发送过程中,只要该缓冲区被突破,窗口大小的值会被设置为更小的值再发送给发送端。从而形成完整的流量控制。
发送端会在此期间,定时发送一个窗口探测的数据段。此数据段仅包含一个字节以获取最新的窗口大小信息。
接收端和发送端相互通信的时候,数据包处理速度不相等,发送端如果高于接收端的话,就会有许多包无法得到立即处理。因此接收端用缓冲区暂存这些数据包。
但是缓冲区满了发送端还继续发包,这些包只能丢弃,丢弃后发送端超时重传进一步增大负荷。
所以接收端会在tcp协议报文中加入流量窗口大小的字段通知发送端,缓存区的剩余大小就是窗口大小,发送端得知窗口大小后调整数据包发送的速率。
如果窗口大小为0 ,发送方会停止发包。 若想重启发送包, 发送方会定时地向接收方放出一个数据包大小为1的测试报文去询问接收方。如果接收方返回的报文中窗口大小>0则可以继续发包。
tcp是全双工通信,发送端和接收端都有窗口。发送端的窗口叫拥塞窗口。
参考 https://www.cnblogs.com/kubidemanong/p/9987810.html
《TCP/IP详解》