假设我有一个客户端通过 TCP 连接到一堆主机上的 1000 个不同的服务器。然后我想在同一台主机上启动 100 个客户端。我通常会用完临时端口(由操作系统分配)。我的解决方案是让每个客户端在连接到所有 1000 个服务器时绑定到 1 个端口(因此只使用 100 个端口)。
我的问题是 - 这应该是我默认做的事情吗?换句话说,在我构建的自定义连接层中,客户端是否应该自动重用相同的端口来连接到多个服务器(因此更具可扩展性),还是这种方法有缺点?我正在使用 Linux。
更新:原来我的解决方案依赖于SO_REUSEPORT
. 的主要用例SO_REUSEPORT
是负载平衡侦听套接字,其中使用多个线程/进程来管理传入连接,但我看不出它不能用于在连接之前绑定到同一端口的 TCP 客户端的任何原因。Linux 内核 3.9 现在支持这个。使用 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 连接到许多其他进程,我很想听听关于为什么我不应该只建立我的连接的任何评论默认情况下,层客户端只是重新使用相同的端口。