如何保留100万个同步TCP连接?

cow*_*cow 40 tcp

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

服务器和客户端之间的数据流量将很稀疏,因此可以忽略带宽问题.

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

有人知道如何做到这一点,以及需要什么硬件/软件(至少是成本)?

Len*_*ate 20

您正在考虑使用哪些操作系统?

如果使用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)以及一些免费的代码来破坏一个简单的echo服务器,你可以使用这些代码来启动(3)

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

请记住,一旦你的系统扩展到这个水平,你的问题才刚刚开始......

  • 为什么有一天突然发生两次暗中投票呢?神秘的挫败者呢?为什么不添加评论来解释为什么你认为答案是错的,我们可以更好地讨论和提出答案,或者至少可以学到一些东西. (3认同)

Gre*_*ill 11

这个问题与所谓的C10K问题有关.C10K页面列出了大量优秀资源,用于解决当您尝试允许数千个客户端连接到同一服务器时将遇到的问题.