当我无法足够快地调用`recv`时会发生什么?

amn*_*amn 4 sockets berkeley-sockets

我想说明一种可能的情况,我的TCP/IP流套接字服务的客户端将数据发送到我的服务的速度快于它将数据移动到缓冲区(我自然而然地谈论应用程序缓冲区)recv并使用它.基本上,在这种情况下会发生什么?显然,我的服务(用户应用程序)下面的某种服务必须接收传入流并将其存储在某处,直到我发出'recv',对吧?最肯定的是操作系统.我不想重新打开旧问题,但我似乎无法找到这个看似明显的问题的答案?

nos*_*nos 6

TCP提供流量控制.TCP堆栈(发送器和接收器端)将能够为您缓冲一些数据,这通常在OS内核中完成.

当接收器缓冲区填满时,发送方将知道它,并停止发送更多数据,最终导致发送应用程序阻塞(或者无法发送更多数据),直到空间再次可用.

简而言之,发送的每个TCP数据包(段)包括可以缓冲的数据大小 - 窗口大小.这意味着另一端始终知道它可以发送多少数据,而接收器不会因为缓冲区已满而丢弃它.如果窗口大小变为0,缓冲区已满,不再发送数据(如果发送方阻塞,则send()呼叫将被阻止),Theres程序用于探测tcp窗口是否仍为0,因此发送可以再次恢复当数据被消耗时.

还有一些细节在这里