每个主机的TCP源端口是否必须唯一?


10

我了解到,元组(源IP,源端口,目标ip,目标端口)标识了TCP连接。从理论上讲,因此应该有可能将host1:port1中的客户端连接到server1:port1,同时将另一个客户端(在host1上运行)从host1:port1连接到server2:port1。

我已经在Java中进行了一些测试,到目前为止似乎可行。

但是,我多次读到,源端口对于主机地址必须是唯一的,这基本上意味着硬限制是最多65536个并发传出TCP连接。真的吗?

更新:这是我的Java代码。这似乎可行,netstat -t清楚地显示来自端口9990的两个活动的传出连接(一个到9997,一个到9998)。至少在现代Linux上,这似乎可行吗?

Socket s1 = new Socket();
s1.setReuseAddress(true);
SocketAddress saremote = new InetSocketAddress("localhost",9999);
SocketAddress salocal = new InetSocketAddress("localhost",9990);
s1.bind(salocal);
s1.connect(saremote);


Socket s2 = new Socket();
s2.setReuseAddress(true);
SocketAddress saremote2 = new InetSocketAddress("localhost",9998);
SocketAddress salocal2 = new InetSocketAddress("localhost",9990);
s2.bind(salocal2);
s2.connect(saremote2);

和netstat -t输出(被截断):

tcp6       0      0 localhost:9990          localhost:9998          CONNECTED 
tcp6       0      0 localhost:9990          localhost:9999          CONNECTED 

“如果您询问设计良好的系统的上限,您肯定会做错了™
Chris S

Answers:


16

这不是TCP要求。就TCP而言,仅源IP,源端口,目标IP和目标端口的组合需要唯一。但是,实际上,除非它们具有不同的源IP地址,否则大多数TCP API都不提供使用同一源端口创建多个连接的任何方法。


2
谢谢,这完全回答了我问题的理论部分!我猜我只需要尝试每个TCP实现。
lxgr 2011年

5

这是实际中的最大值,通常较低。例如,Linux使用net.ipv4.ip_local_portkernel参数定义用于出站连接的端口。通常是这样的

sysctl net.ipv4.ip_local_port_range 32768 to 61000

您可以增加sysctl可用的数量,例如

sysctl -w net.ipv4.ip_local_port_range="10000 64000"

或者您可以使用相同的信息编辑/etc/sysctl.conf

net.ipv4.ip_local_port_range = 10000 65535

我发现的所有示例都显示最小值也为1024。


1

除了Iain的答案(上述)之外,内核可能仅允许10,000个端口用于传出连接,从理论上讲,适配器上每个IP地址至少应限制为一组XX,XXX端口。由于127.1在本地网络上对外界不可用,因此对于彼此的 IP地址(外部),您在65K端口范围内具有一组出站端口。

因此,传出限制实际上是:

  With 1 IP Address: XX,XXX (or 2 x XX,XXX on internal network)
  With 2 IP addresses: 2 x XX,XXX (or 3 x XX,XXX on internal network)
  With 3 IP addresses: 3 x XX,XXX (or 4 x XX,XXX on internal network)
  etc.

要使此工作有效,您需要阅读此线程的答案。


0

是。这是真的。

端口将绑定,应用程序将与网络绑定。

在同一主机上,通过TCP连接的应用程序不能超过65553,通过UDP连接的应用程序不能超过65535。操作系统通常对端口进行动态管理,为每个连接到网络的应用分配一个端口。

如果有两个应用程序在网络程序包到达时在同一端口上列出信息,则计算机将无法知道将要传递数据的应用程序。例如,如果将Messenger和Skype绑定在同一端口上,则Messenger消息将出现在Skype中,反之亦然:)


我认为问题不是关于监听应用程序数量的上限(正如您所指出的那样,它受唯一端口号的数量限制),而是关于一次运行的套接字数量的上限。Web服务器通常有数十个套接字,所有套接字都指向其单个端口80或443。如果主机上的许多服务器都这样做,则没有理由打开的套接字数不能超过2 ^ 32。
布兰登·罗兹

0

尽管系统可能会限制打开的TCP连接的数量,但通常对所使用的端口号没有限制。但是,良好的TCP实现必须防止两次使用同一对套接字。(套接字= IP地址+端口)。但是,将端口分配给进程以防止窃取连接,通常的方法是为监听端口或传出端口请求一个空闲端口。这样可以防止重复的输出套接字,从而避免重复的连接。如果无法使用该方法,则应用程序本身必须防止创建重复的连接。


3
如何在此旧问题上发布的答案中添加新内容?
克里斯S
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.