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

时间:2011-01-15 16:53:31

标签: sockets berkeley-sockets

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

2 个答案:

答案 0 :(得分:6)

TCP提供flow control。 TCP堆栈(发送方和接收方都有)可以为您缓冲一些数据,这通常在OS内核中完成。

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

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

还有一些细节here

答案 1 :(得分:1)

它是维护数据缓冲区(包括传入数据的缓冲区)的网络驱动程序堆栈。如果缓冲区已满,则会丢弃相应的TCP数据包,并且客户端会尝试发送数据。这herehere还有更多内容。