是否可以复用套接字连接?

时间:2009-03-20 10:35:46

标签: sockets

是否可以复用套接字连接?

我需要与yahoo messenger建立多个连接,我正在寻找一种有效的方法,而不必为每个客户端连接打开一个套接字。

到目前为止,我必须为每个客户端使用一个套接字,并且这不会超过50,000个连接。

哦,我的解决方案适用于TELCO,所以我需要至少达到250,000到500,000个连接

我计划将多个IP地址绑定到一个NIC,以超过每个IP地址的65k端口限制。

请给我任何帮助,我能得到的见解。

**我在本网站上的大多数其他问题都没有得到答案:) **

由于

5 个答案:

答案 0 :(得分:2)

这是一个关于在严重情况下进行缩放的有趣问题。

您实际上是在问:“我如何建立与互联网服务的N个连接,其中N>> = 250,000”。

有效和高效地实现这一目标的唯一方法是集群。您无法在单个主机上执行此操作,因此您需要能够将客户端分段并分区为多个不同的服务器,以便每个服务器只处理一个子集。

这个想法是让一台服务器保持尽可能少的连接(均匀地分散连接),同时保持足够的连接,通过将服务器间通信保持在最低水平,使您托管的任何服务都可行。这意味着任何两个相关的连接(例如两个相互交谈的帐户)都必须位于同一主机上。

您将需要可以处理此问题的服务器和网络基础架构。您将需要一个IP地址子网,每个服务器必须与互联网进行无状态通信(即您的路由器不会进行任何NAT,以便不必跟踪250,000多个连接)。

你必须和美国在线谈谈。如果不考虑断开连接,AOL就无法处理这种级别的连接。任何这种规模的服务都必须与AOL协商,以便您和他们能够处理连接。

您应该调查i / o多路复用技术。想到Kqueue和epoll。

为了编写这个大规模并发和teleco级解决方案,我建议调查erlang。 Erlang专为这些情况而设计(多服务器,大型多客户端,大规模多线程电信级软件)。它目前用于运行爱立信电话交换机。

答案 1 :(得分:1)

如果另一端支持此类操作,则只能通过单个套接字复用多个连接。 换句话说,它是一个函数协议 - 套接字没有任何本机支持。

我怀疑yahoo messenger协议对它有任何支持。

另一种选择(对单个NIC上的多个IP)是设计自己的多路复用协议,并拥有从多路复用协议转换为雅虎协议的卫星服务器。

答案 2 :(得分:1)

虽然您可以在套接字上侦听多个传入连接请求,但在建立连接时,它会将服务器上的唯一端口连接到客户端上的唯一端口。为了复用连接,您需要控制管道的两端并拥有一个协议,允许您将上下文从一个虚拟连接切换到另一个虚拟连接,或者使用不关心客户端身份的无状态协议。在前一种情况下,您需要在应用程序层中实现它,以便您可以重用现有连接。在后一种情况下,您可以使用代理来跟踪哪个服务器响应转到哪个客户端。由于您正在连接到Yahoo Messenger,我认为您无法执行此操作,因为它需要经过身份验证的连接,并且它假定每个连接都对应于单个用户。

答案 3 :(得分:1)

我会选择另一种你可以考虑的方法(取决于你的绝望程度)。

请注意,操作系统TCP / IP实现需要是通用的,但您只对非常具体的用例感兴趣。因此,在您的应用程序代码中实现TCP / IP的简化版本(仅处理您的用例,但这样做非常好)可能是有意义的。

例如,如果您使用的是Linux,则可以将几个IP地址路由到tun接口,并让您的应用程序处理该tun接口的IP数据包。这样,您就可以在应用程序中完全实现TCP / IP(针对您的用例进行了优化),并避免操作系统对开放连接数量的任何限制。

当然,自己做TCP / IP还有很多工作要做,但这实际上取决于你是多么绝望 - 也就是你可以承受多少硬件来解决这个问题。

答案 4 :(得分:0)

500,000个任意yahoo messenger连接 - 你的电信公司是代表雅虎做的吗?似乎现在多年来已经存在的任何解决方案都应该在摩尔定律的帮助下进行扩展 - 据我所知,所有IM客户端在很长一段时间内都非常有效,而且需求没有紧迫增加我能想到。

为什么用硬件和传统解决方案解决这个问题不是一个合理的问题?