tcp - 如何保持一百万个并发 TCP 连接?

标签 tcp

我要设计一个服务器,需要为数百万客户端提供服务,这些客户端同时通过 TCP 与服务器连接。

服务器和客户端之间的数据流量会很稀疏,所以带宽问题可以忽略不计。

一个重要的要求是,每当服务器需要向任何客户端发送数据时,它应该使用现有的 TCP 连接,而不是向客户端打开一个新连接(因为客户端可能在防火墙后面)。

有谁知道如何做到这一点,以及需要什么硬件/软件(成本最低)?

最佳答案

您为此考虑使用什么操作系统?

如果使用 Windows 操作系统并使用比 Vista 更高版本的操作系统,那么在一台机器上处理数千个连接应该不会有问题。我用一台低规范的 Windows Server 2003 机器运行了测试(此处:http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html),并且轻松地实现了超过 70,000 个事件的 TCP 连接。一些影响可能连接数的资源限制在 Vista 上已经大大提高(请参阅此处:http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html),因此您可以使用小型计算机集群实现您的目标。我不知道您在那些路由连接之前需要什么。

Windows 提供了一个称为 I/O 完成端口的工具(请参阅:http://msdn.microsoft.com/en-us/magazine/cc302334.aspx),它允许您使用非常少的线程为数千个并发连接提供服务(我昨天运行测试时有 5000 个连接使到服务器的链接饱和2 个线程来处理 I/O...)。因此,基本架构具有很强的可扩展性。

如果你想运行一些测试,那么我的博客上有一些免费的工具,允许你使用数千个连接(1)和(2)和一些免费代码来破坏一个简单的回显服务器您可以使用它来开始 (3)

根据您的评论,您问题的第二部分更加棘手。如果客户端的 IP 地址不断变化,并且您和他们之间没有任何东西提供 NAT 来为您提供一致的 IP 地址,那么毫无疑问,他们的连接将被终止并需要重新建立。如果客户端在他们的 IP 地址更改时检测到此连接断开,那么他们可以重新连接到服务器,如果不能,那么我建议客户端需要经常轮询服务器,以便他们可以检测到连接丢失和重新连接。服务器在这里无能为力,因为它无法预测新的 IP 地址,并且会在尝试发送数据时发现旧连接已失败。

请记住,一旦您将系统扩展到这个级别,您的问题才刚刚开始......

关于tcp - 如何保持一百万个并发 TCP 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2831434/

相关文章:

c++ - boost::asio::deadline_timer 绑定(bind)到多态套接字类指针

c++ - IOCP C++ TCP 客户端

networking - 我什么时候应该考虑使用 TCP 或 UDP?

java - AIX 环境 - TCP 端口 RecvQ 数据增加但应用程序不消耗

linux - select()和accept()返回点对应的TCP握手阶段

c - Netfilter 内核模块拦截数据包并记录它们

perl - TCP,HTTP和多线程Sweet Sp

c++ - Windows Server 2012 服务中的 SOCKET 连接问题

android - 如何授予我的系统应用程序 root 权限以绑定(bind)特权端口?

python - 为什么这个套接字连接只允许1次发送和接收?