是否可以连接到 TCP 端口 0?

nh2*_*nh2 65 networking tcp

侦听 TCP 端口 0 会为我分配一个系统上的空闲端口号。

但是当我尝试连接到 TCP 端口 0时会发生什么?显而易见的答案是:“它不起作用”:

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

这是在系统中的哪个位置处理的?在操作系统内核的 TCP 堆栈中?是否有 Unix 可以连接到 TCP 端口 0?

gol*_*cks 63

只是为了确保我们在同一页面上(您的问题在这种方式上是模棱两可的),要求在端口 0 上绑定 TCP 表示请求动态生成未使用的端口号。换句话说,您在该请求之后实际侦听的端口号不为零。有关于这个在评论[linux kernel source]/net/ipv4/inet_connection_sock.cinet_csk_get_port()

/* Obtain a reference to a local port for the given sock,
 * if snum is zero it means select any available local port.
 */
Run Code Online (Sandbox Code Playgroud)

这是标准的unix约定。可能有些系统实际上允许使用端口 0,但这被认为是一种不好的做法。但是,POSIX、IANA 或 TCP 协议并未正式指定此行为。1 你可能会觉得这很有趣

这就是为什么您不能明智地建立到端口零的 TCP 连接的原因。大概nc知道这一点并通知您您正在提出一个无意义的请求。如果您在本机代码中尝试此操作:

/* Obtain a reference to a local port for the given sock,
 * if snum is zero it means select any available local port.
 */
Run Code Online (Sandbox Code Playgroud)

您会遇到与尝试连接到任何其他不可用端口时相同的错误:ECONNREFUSED“连接被拒绝”。所以回复:

这是在系统中的哪个位置处理的?在操作系统内核的 TCP 堆栈中?

可能不是; 它不需要特殊处理。即,如果您能找到允许绑定和侦听端口 0 的系统,您大概可以连接到它。


1. 但 IANA确实将其称为“保留”(请参阅此处)。这意味着,不应在线使用此端口。这使得动态分配约定没问题(因为它实际上不会被使用)。将其具体规定为目的可能超出了 IANA 的范围;本质上,操作系统可以自由地用它做他们想做的事,包括什么都不做。

  • @ratchetfreak 255.255.255.255 已播出。0.0.0.0 根据上下文有两种含义。在编程中,它与 `INADDR_ANY` 同义,这是 Richard 所指的(系统将用默认值替换它)。但实际上在网络上使用该地址似乎具有 Andrea 提到的含义(除非不太清楚它算作“广播”):http://en.wikipedia.org/wiki/0.0.0.0 (4认同)
  • @AndreaCi 没有广播 255.255.255.255? (2认同)
  • @yegle http://stackoverflow.com/questions/4046616/sockets-how-to-find-out-what-port-and-address-im-assigned (2认同)

小智 5

使用端口 0 会触发操作系统搜索并分配下一个可用端口。这避免了您必须对特定端口进行硬编码或必须搜索可用端口。我的 Mint Linux 系统回来了

nc: port range not valid
Run Code Online (Sandbox Code Playgroud)

nc localhost 0 
Run Code Online (Sandbox Code Playgroud)