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

我已经知道TCP连接是由元组(源IP,源端口,目的IP,目的端口)标识的。 从理论上讲,应该有一个从host1:port1连接到server1:port1的客户机,同时从host1:port1到server2:port1连接另一个客户机(在host1上运行)。

我已经testing了一下Java,到目前为止似乎是可能的。

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

更新:这是我的Java代码。 这似乎工作,netstat -t清楚地显示从端口9990(一个到9997,一个到9998)的两个活动的传出连接。 至less在现代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 

这不是TCP要求。 就TCP而言,只有源IP,源端口,目的IP和目的端口的组合必须是唯一的。 但实际上,大多数TCP API不提供任何方式来创build具有相同源端口的多个连接,除非它们具有不同的源IP地址。

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

 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。

除了Iain的回答(上面),你的内核可能只有10,000个端口允许外出连接,理论上你至less限制在适配器每个IP地址上的一组XX,XXX端口。 由于127.1对外界不可用,在本地networking上,因此对于每个其他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. 

为了使这个工作,你需要阅读这个线程的答案。

是。 这是真的。

端口将绑定到应用程序和networking。

不能有超过65553的应用程序通过TCP连接,65535通过UDP连接在同一主机上。 操作系统通过双重pipe理端口为连接到networking的每个应用分配一个端口。

如果有两个应用程序在networking软件包到达时在同一个端口上进行侦听,那么计算机无法知道应用程序要传送数据。 举个例子,如果你的Messenger和Skype绑定在同一个端口上,你的信使消息将显示在Skype中,反之亦然:)

虽然系统可能对打开的TCP连接数量有限制,但通常对使用的端口号没有限制。 但是,一个好的TCP实现必须防止两次使用同一对套接字。 (socket = IP地址+端口)。 然而,一个端口被分配给一个进程来防止窃取连接,通常的方法是请求一个空闲端口用于监听端口或者外出端口。 这可以防止重复的传出套接字,从而重复连接。 无法使用该方法,应用程序本身必须防止创build重复的连接。