当接收缓冲区已满时,TCP 会暂停发送吗?

Will TCP send pause when recv buffer is full?

假设有一个 TCP 非阻塞套接字在不消耗传入数据的情况下连续发送数据,有时 recv 缓冲区将被填满并且进一步接收的任何数据包都将被丢弃。但是对等套接字不断地消耗数据,所以发送缓冲区中有足够的 space。

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

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