连接IP 0.0.0.0成功。如何?为什么?

连接IP 0.0.0.0成功。如何?为什么?

我们正在本地主机上提供一个端口,并希望检查另一个进程是否该端口可用。由于我们代码中的错误,它实际上正在尝试连接到 IP 0.0.0.0:<port>,并且由于某种原因它成功了 - 正如 strace 所证明的那样:

[...]
connect(3, {sa_family=AF_INET, sin_port=htons(10002), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
[...]

这是什么意思?为什么它有效?

答案1

0.0.0.0 作为目标地址,以不同方式指代不可路由的主机或“此主机”(RFC 5735 第 3 节)。实际上,在大多数情况下,连接到 0.0.0.0 相当于连接到 localhost。严格来说,它作为线路上的目标地址无效(RFC 1122 第 3.2.1.3 节),仅作为源地址,因此操作系统必须确保目标地址为 0.0.0.0 的数据包不会按原样离开系统。实际上,当 Linux 内核看到目标地址为 0.0.0.0 (IE无目的地地址),它将源地址复制到目标地址,如果数据包也没有源地址,它将两者都设置为环回地址。在这两种情况下,数据包都是通过环回接口“发送出去”的,因此它永远不会离开系统。

绑定时,“此主机”扩展为“此主机上的任何地址”——因此应用程序通常通过绑定到 0.0.0.0 来接受连接,这意味着它们将接收寻址到系统上任何 IPv4 地址的数据包。

相关内容