【发布时间】:2013-09-03 01:19:52
【问题描述】:
假设我有一个客户端通过 TCP 连接到一堆主机上的 1000 个不同的服务器。然后我想在同一台主机上启动 100 个客户端。我通常会用完临时端口(由操作系统分配)。我的解决方案是让每个客户端在连接到所有 1000 个服务器时绑定到 1 个端口(因此只使用 100 个端口)。
我的问题是 - 这应该是我默认做的事情吗?换句话说,在我构建的自定义连接层中,客户端是否应该自动重用相同的端口来连接到多个服务器(因此更具可扩展性),还是这种方法有缺点?我正在使用 Linux。
更新:原来我的解决方案依赖于SO_REUSEPORT 的可用性。 SO_REUSEPORT 的主要用例是用于负载平衡侦听套接字,其中多个线程/进程用于管理传入连接,但我看不出它不能用于绑定到同一端口的 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 连接到许多其他进程,我很想听听任何 cmets 关于我为什么应该t 只是在我的连接层客户端中构建,默认情况下重用相同的端口。
【问题讨论】:
-
@EJP 请在上面查看我的更新 - 如果您在这里有任何建议,我很想听听您的想法。
-
您编辑中的 Linux 功能似乎针对的是服务器,而不是客户端。你真的需要几万个出站连接,就够用完端口空间了吗?