我想考虑一种可能的情况,即我的 TCP/IP 流套接字服务的客户端向我的服务发送数据的速度比它设法将数据移动到其缓冲区(我自然是在谈论应用程序缓冲区)recv
和使用它的速度更快。
所以基本上,在这种情况下会发生什么?
显然,我的服务下的某种服务是用户应用程序,必须接收传入的流并将其存储在某个地方,直到我发出“recv”,对吗?最肯定的是操作系统。
我不想重新打开旧问题,但我似乎无法找到这个看似显而易见的问题的答案?
我想考虑一种可能的情况,即我的 TCP/IP 流套接字服务的客户端向我的服务发送数据的速度比它设法将数据移动到其缓冲区(我自然是在谈论应用程序缓冲区)recv
和使用它的速度更快。
所以基本上,在这种情况下会发生什么?
显然,我的服务下的某种服务是用户应用程序,必须接收传入的流并将其存储在某个地方,直到我发出“recv”,对吗?最肯定的是操作系统。
我不想重新打开旧问题,但我似乎无法找到这个看似显而易见的问题的答案?
TCP 提供流量控制。TCP 堆栈(在发送方和接收方)将能够为您缓冲一些数据,这通常在操作系统内核中完成。
当接收缓冲区填满时,发送者会知道它,并停止发送更多数据,最终导致发送应用程序阻塞(或无法发送更多数据),直到空间再次可用。
简而言之,发送的每个 TCP 数据包(段)都包括可以缓冲的数据大小 - 窗口大小。这意味着另一端始终知道它可以发送多少数据而接收器不会因为缓冲区已满而将其丢弃。如果窗口大小变为0,则缓冲区已满,将不再发送数据(如果发送方阻塞,send()
则调用将阻塞),有探测tcp窗口是否仍为0的程序,因此可以重新开始发送当数据被消费。
这里有更多细节