侦听 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.c
上inet_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 的范围;本质上,操作系统可以自由地用它做他们想做的事,包括什么都不做。
小智 5
使用端口 0 会触发操作系统搜索并分配下一个可用端口。这避免了您必须对特定端口进行硬编码或必须搜索可用端口。我的 Mint Linux 系统回来了
nc: port range not valid
Run Code Online (Sandbox Code Playgroud)
到
nc localhost 0
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
44579 次 |
最近记录: |