应该/可以使用相同的端口绑定到多个服务器

时间:2013-08-30 10:30:04

标签: linux sockets tcp

假设我有一个客户端通过TCP连接到一堆主机上的1000个不同的服务器。然后我想在同一台主机上启动100个客户端。我通常会用完短暂的端口(由操作系统分配)。我的解决方案是每个客户端连接到所有1000个服务器时绑定到1个端口(因此只使用100个端口)。

我的问题是 - 这应该是我默认做的事吗?换句话说,在我构建的自定义连接层中,客户端是否应该自动重用相同的端口连接到多个服务器(因此可扩展性更强),或者这种方法是否存在缺点?我正在使用Linux。

更新:结果我的解决方案依赖于SO_REUSEPORT的可用性。 SO_REUSEPORT的主要用例是负载平衡侦听套接字,其中多个线程/进程用于管理传入连接,但我没有看到为什么它不能用于绑定到TCP客户端的TCP客户端的任何原因连接前的同一端口。 Linux kernel 3.9 now supports this。使用python 3.3.2和Linux 3.11.0,以下工作:

from socket import *

s1 = socket(AF_INET, SOCK_STREAM)
s1.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1)
s1.bind(('localhost', 23456))

s2 = socket(AF_INET, SOCK_STREAM)
s2.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1)
s2.bind(('localhost', 23456))

正如@glglgl建议会很好,它尽可能地失败,如果你尝试连接到同一个远程(host, port),你会收到一条错误消息:

OSError: [Errno 99] Cannot assign requested address

我认为没有任何理由不能将此问题用于可通过TCP连接到许多其他进程的大量进程的可伸缩性问题,我很想听听有关为什么我应该'的任何意见t 只需构建到我的连接层客户端,只需在默认情况下重新使用相同的端口。

1 个答案:

答案 0 :(得分:2)

  

默认情况下,客户端是否应使用相同的套接字绑定到多个服务器

不,因为客户端无法使用相同的套接字绑定到多个服务器,默认情况下或任何其他方式。你是说'使用相同的端口?'

  

假设我有一个客户端通过TCP连接到一堆主机上的1000个不同的服务器。然后我想在同一台主机上启动100个客户端。我通常会用完短暂的端口(由操作系统分配)。

换句话说,你意味着'相同的端口',而不是'相同的套接字'。

  

我的解决方案是每个客户端连接到所有1000个服务器时绑定到1个端口(因此只使用100个端口)。

但你的“解决方案”不起作用。操作系统不允许您为多个同时出站连接重用相同的本地端口。

  

我的问题是 - 这应该是我默认做的事情吗?

你完全不能这样做,更不用说by default