当tcp / udp服务器发布速度超过客户端消耗时会发生什么?

时间:2010-01-04 05:43:31

标签: networking tcp sockets udp

我试图了解当服务器发布(通过tcp,udp等)比客户端可以使用数据更快时会发生什么。

在一个程序中,我理解如果队列位于生产者和消费者之间,它将开始变大。如果没有队列,那么生产者根本无法生产任何新东西,直到消费者可以消费(我知道可能有更多的变化)。

我不清楚当数据离开服务器(可能是不同的进程,机器或数据中心)并发送到客户端时会发生什么。如果客户端根本无法足够快地响应传入数据,假设服务器和消费者耦合非常松散,那么飞行中的数据会发生什么?

我在哪里可以阅读以获取有关此主题的详细信息?我只需阅读TCP / UDP的低级细节吗?

由于

6 个答案:

答案 0 :(得分:24)

使用TCP,有一个TCP Window用于流量控制。 TCP仅允许一次保持一定数量的数据不被确认。如果服务器生成数据的速度快于客户端消耗数据的速度,则未确认的数据量将增加,直到TCP窗口“满”为止,此时发送TCP堆栈将等待,并且在客户端之前不会再发送任何数据承认一些待处理的数据。

使用UDP,没有这样的流量控制系统;毕竟它是不可靠的。允许客户端和服务器上的UDP堆栈丢弃数据报(如果他们感觉到的话),就像它们之间的所有路由器一样。如果您发送的数据报比链接可以提供给客户端的数据集多,或者链接提供的数据报比客户端代码可以接收的数据报数多,那么其中一些数据报将被丢弃。除非您在基本UDP上构建了某种形式的可靠协议,否则服务器和客户端代码可能永远不会知道。虽然实际上您可能会发现数据报不会被网络堆栈丢弃,并且NIC驱动程序只会咀嚼所有可用的非页面缓冲池并最终导致系统崩溃(请参阅this blog posting for more details)。

返回TCP,服务器代码处理TCP窗口变满的方式取决于您使用的是阻塞I / O,非阻塞I / O还是异步I / O.

  • 如果您使用阻止I / O,那么您的发送呼叫将被阻止,您的服务器将会变慢;实际上,您的服务器与您的客户端处于锁定状态。在客户端收到待处理数据之前,它无法发送更多数据。

  • 如果服务器正在使用非阻塞I / O,那么您可能会收到错误返回,告诉您该呼叫将被阻止;你可以做其他事情,但你的服务器需要在以后重新发送数据......

  • 如果您正在使用异步I / O,那么事情可能会更复杂。例如,使用Windows上的I / O完成端口的异步I / O,您根本不会注意到任何不同。您的重叠发送仍然会被接受,但您可能会注意到它们需要更长时间才能完成。重叠的发送正在服务器计算机上排队,并且正在为重叠的缓冲区使用内存,并且可能还使用了“非页面缓冲池”。如果您继续发出重叠发送,那么您将面临耗尽非页面缓冲池内存或使用可能无限量内存作为I / O缓冲区的风险。因此,使用异步I / O和服务器可以比客户端消耗它更快地生成数据,您应该使用写入的完成来编写自己的流控制代码。我在我的博客herehere上写过这个问题,我的服务器框架提供了自动处理它的代码。

就“飞行中”数据而言,两个对等体中的TCP堆栈将确保数据按预期到达(即按顺序并且没有任何遗漏),它们将通过在需要时重新发送数据来完成此操作

答案 1 :(得分:5)

TCP具有名为flow control的功能。

作为TCP协议的一部分,客户端告诉服务器在不填满缓冲区的情况下可以发送多少数据。如果缓冲区填满,客户端会告诉服务器它还无法发送更多数据。缓冲区稍微清空后,客户端告诉服务器它可以再次开始发送数据。 (这也适用于客户端将数据发送到服务器时)。

另一方面,UDP完全不同。 UDP本身不做这样的事情,并且如果数据进入速度快,那么它将开始丢弃数据,然后进程可以处理。如果应用程序协议不能丢失数据(即,如果它需要“可靠的”数据流),则应由应用程序添加逻辑。

答案 2 :(得分:2)

如果你真的想了解TCP,你几乎需要与RFC一起阅读实现;真正的TCP实现并不完全如指定。例如,Linux有一个“内存压力”概念,可防止内存(相当小)DMA内存池耗尽,并防止一个套接字从缓冲区空间运行任何其他套接字。

答案 3 :(得分:1)

服务器长时间不能比客户端快。在它比客户端快一段时间之后,托管它的系统会在它写入套接字时阻塞它(写入可以阻塞整个缓冲区,就像读取可以阻塞空缓冲区一样)。

答案 4 :(得分:1)

使用TCP,这不可能发生。

如果是UDP,数据包将丢失。

答案 5 :(得分:0)

TCP Wikipedia article显示TCP标头格式,即保存窗口大小和确认序列号的位置。其余的字段和描述应该很好地概述传输节流的工作原理。 RFC 793指定基本操作;第41和42页详细介绍了流量控制。