首页 > 解决方案 > 当 recv 缓冲区已满时,TCP 会暂停发送吗?

问题描述

假设有一个 TCP 非阻塞套接字,它不断地发送数据而不消耗传入的数据,在某个时候,recv 缓冲区将被填满,并且进一步接收到的任何数据包都将被丢弃。但是对等套接字不断消耗数据,因此发送缓冲区中有足够的空间。

这个套接字的行为是什么?当 recv 缓冲区已满时,发送调用是否会暂停并返回 EWOULDBLOCK。还是发送成功?如果是这样,套接字如何处理已发送数据包的确认。

标签: socketstcpbuffertcpclient

解决方案


一般来说,一个 TCP 连接中的两个“方向”是独立的。所以即使本地(传入)接收缓冲区已满,只要对方的接收缓冲区有空间,就可以发送更多数据。报告给发送方的 TCP“窗口”基本上只是对等方接收缓冲区中的可用空间量。对端将发送回纯 ACK 数据包(没有数据负载)以报告可用缓冲区空间,即使它无法发送任何数据(由于其发送缓冲区/窗口已满)。


推荐阅读