


发送方不能无脑的发送数据,应该考虑接收方的处理能力。
TCP 提供一种机制可以让「发送方」根据「接收方」的实际接收能力控制发送的数据量,这就是所谓的流量控制。
操作系统缓冲区和滑动窗口的区别
先收缩窗口,在减少缓冲区,防止数据丢失。
窗口关闭
当接收窗口大小为0时,会停止接收数据,当接收窗口重新有空间时,会给发送方发一个窗口非0 的ACK报文,但是此报文可能会丢失。为了防止此现象发送方会定时进行窗口探测。
糊涂窗口综合征
当接收窗口很小的时候,为了避免为发生大车拉小物的情况,所以设定一个窗口最小阈值。当「窗口大小」小于 min( MSS,缓存空间/2 ) ,也就是小于 MSS 与 1/2 缓存大小中的最小值时,就会向发送方通告窗口为 0,也就阻止了发送方再发数据过来。
另外也可以设定发送方当有小数量数据时先停止发送,等后面攒多了在一块发送(伺机使用)。
可以在 Socket 设置 TCP_NODELAY 选项来关闭这个算法(关闭 Nagle 算法没有全局参数,需要根据每个应用自己的特点来关闭)
setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, (char *)&value, sizeof(int));
