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

lxg*_*xgr 12 tcp socket

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

我已经在 J​​ava 中进行了一些测试,到目前为止似乎是可能的。

但是,我多次阅读到主机地址的源端口必须是唯一的,这基本上意味着最多有 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);
Run Code Online (Sandbox Code Playgroud)

和 netstat -t 输出(截断):

tcp6       0      0 localhost:9990          localhost:9998          CONNECTED 
tcp6       0      0 localhost:9990          localhost:9999          CONNECTED 
Run Code Online (Sandbox Code Playgroud)

Dav*_*rtz 17

这不是 TCP 要求。就TCP而言,只需要源IP、源端口、目的IP和目的端口的组合是唯一的。然而,在实践中,大多数 TCP API 不提供任何方式来创建多个与相同源端口的连接,除非它们具有不同的源 IP 地址。

  • 谢谢,这完全回答了我问题的理论部分!我想我只需要尝试每个 TCP 实现。 (2认同)

use*_*517 5

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

sysctl net.ipv4.ip_local_port_range 32768 to 61000
Run Code Online (Sandbox Code Playgroud)

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

sysctl -w net.ipv4.ip_local_port_range="10000 64000"
Run Code Online (Sandbox Code Playgroud)

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

net.ipv4.ip_local_port_range = 10000 65535
Run Code Online (Sandbox Code Playgroud)

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