我了解到 TCP 连接由元组(源 IP、源端口、目标 ip、目标端口)标识。从理论上讲,因此应该可以让一个来自 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);
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 地址。
这是实践中的最大值,通常较低。例如,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。
归档时间: |
|
查看次数: |
14314 次 |
最近记录: |