【问题标题】:what is the maximum number of packets that can be received? [closed]可以接收的最大数据包数是多少? [关闭]
【发布时间】:2013-01-01 09:07:33
【问题描述】:


我正在开发一个 P2P 应用程序,并将其扩展到数千万用户。我正在向每个其他对等方广播一个数据包并期待响应。在继续我的编码之前,我想确认我是否可以在不到一分钟的时间内将数据包发送到数以千万计的不同 IP 地址。如果它们都响应,那么我的应用程序甚至我的 PC 是否能够在这么短的时间内处理这么多的连接和数据包?

使用 TCP 和 Windows。
允许的最大 CPU 使用率:20%
互联网带宽:假设 2Mbps
使用 WinSock2 基于 C 编程的应用程序
假设普通 PC 具有 2 GB Ram、Core 2 Duo、2.8 GHz

【问题讨论】:

  • 创建一个快速模拟测试。
  • 是的,那是怎么回事?我应该创建数百万个线程同时向我发送数据包吗?我不认为我在这里拥有一台超级计算机......还有更好的选择吗?
  • 恕我直言,我认为您还没有准备好开发这样的应用程序,更不用说将其扩展到数千万用户了。
  • @S.Swaroop 不,那太傻了。但是,如果无法编写这些功能需求的简单模拟/压力框架,那么我怀疑实际程序/协议的范围目前无法掌握。 (而且在这里编写模拟程序要容易得多。)
  • 你不能用 TCP 广播,所以你的问题已经没有意义了。您需要调查 UDP 多播。

标签: windows networking tcp p2p packets


【解决方案1】:

嗯,是的,您可以,但您可能需要使用 UDP。然而,响应 backc 也将是一个自我 DoS。

【讨论】:

  • 是的,我也是这么想的,但是如果我使用 UDP 而不是 TCP,我会得到什么好处?我的意思是我们不需要建立连接和握手,但最后我必须处理所有的数据包。有没有其他方法可以开发程序,任何概念都可以?
【解决方案2】:

通常需要在一分钟内与数千万用户直接通信的应用程序将基于服务器集群,这些服务器具有可用的互联网带宽和计算能力,因此它们本身不会 DoS。 P2P 应用程序不应要求单个主机与这么多用户进行通信,尤其是在如此短的时间范围内。

Ray 是正确的,即使您能够发送消息,您最终也会对自己的响应进行 DoSing,除非您在客户端程序中故意放置大量不同长度的延迟以隔开它们的响应。如果您要尝试这样做,他应该使用 UDP 也是正确的。我发现您的操作系统不太可能支持维持 10,000,000 个并发 TCP 连接。

为了从单个主机向数千万主机发送通知,原始主机应该通知数千万主机列表中大小为 n 的某个小子集。这些主机中的每一个将依次通知 n 多个主机,依此类推。这将需要大约 n log_n_(主机总数)时间与主机数量时间的数量级。

如果响应消息只是对收到原始消息的确认,则可以使用与此相反的系统来进行确认。每个主机都可以向发送消息的主机发送一个 ack,然后一旦该主机收到所有的 ack 或发生超时,它就会向发送它的主机发送一个 ack,其中包含哪些主机的信息已经给它发了一个ack。此过程继续备份树,直到组合的 ack 到达原始主机。这意味着您会收到大约 n 个返回给原始主机的响应,而不是数千万的数量级。

如果响应不仅仅是一个 ack,那么您的应用程序可能无法针对与您描述的硬件远程接近的任何东西进行扩展,因为这将在太短的时间内接收到太多的传入数据。您很可能会自己进行 DoS,并且很可能会从您的 ISP 那里得到一个讨厌的图。

【讨论】:

  • 回车键人,回车键:D
  • 谢谢伙计。至少我有一个很好的方法来实现这个场景。我还在考虑将负载分布在多台服务器上,比如大约 10 台服务器,每台服务器控制大约 50-60K 用户。这可能会完成这项工作。
  • @S.Swaroop: 10 * 50K = 500K,不是 10M
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多