Linux:在端口0上绑定时会发生什么

LeC*_*oux 3 unix linux networking

当我尝试bind(2)在端口0(linux 5.0)上会发生什么?

使用BSD nc:nc -l 0有效,并对其进行分级提供给我:

bind(3, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
listen(3, 1)                            = 0
accept4(3, 
Run Code Online (Sandbox Code Playgroud)

但是尝试连接:

$ nc 127.1 0
nc: port number too small: 0
Run Code Online (Sandbox Code Playgroud)

这里会发生什么?

小智 6

当尝试绑定端口0时,实际上选择了一个随机端口。

尝试这个:

nc -l 0
ss -4 -t -l # List active listening TCP sockets on IPv4
 # ctrl+c nc to close its socket
ss -4 -t -l # And check the difference
Run Code Online (Sandbox Code Playgroud)

我的给出:

State   Recv-Q  Send-Q    Local Address:Port       Peer Address:Port  
LISTEN  0       0             127.0.0.1:58505           0.0.0.0:*    
LISTEN  0       0             127.0.0.1:46253           0.0.0.0:*    
LISTEN  0       0         192.168.122.1:domain          0.0.0.0:*    
LISTEN  0       0               0.0.0.0:41853           0.0.0.0:*
State   Recv-Q  Send-Q    Local Address:Port       Peer Address:Port  
LISTEN  0       0             127.0.0.1:58505           0.0.0.0:*    
LISTEN  0       0             127.0.0.1:46253           0.0.0.0:*    
LISTEN  0       0         192.168.122.1:domain          0.0.0.0:* 
Run Code Online (Sandbox Code Playgroud)

因此我的nc绑定到端口41853,是随机选择的