当前位置:  开发笔记 > 运维 > 正文

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

如何解决《当tcp/udp服务器发布速度超过客户端消耗时会发生什么?》经验,为你挑选了2个好方法。

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

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

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

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

谢谢



1> Len Holgate..:

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

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

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

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

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

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

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



2> R Samuel Kla..:

TCP具有称为流控制的功能.

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

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

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有