成功连接到IP 0.0.0.0。怎么样?为什么?


41

我们正在localhost上提供端口,并希望在另一个过程中检查该端口是否可用。由于我们代码中的错误,它实际上试图连接到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
[...]

这是什么意思?为什么行得通?


Answers:


68

0.0.0.0作为目标地址,是指不可路由的主机或“此主机”。实际上,连接到0.0.0.0等效于连接到本地主机。(严格来说,它作为目的地地址无效,仅作为源地址无效,但实践与理论不符。)

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


7
稍微扩展一下此答案-这意味着“该系统上的任何IP地址,包括在侦听过程开始后添加的IP”
Criggie

5
本地主机是一个地址,主要是127.0.0.1,而0.0.0.0表示此主机上的所有地址。
rexkogitans

@rexkogitans本地主机不是单个地址,而是127.0.0.0/8范围内的任何地址-即,从127.0.0.0到127.255.255.255的任何地址
Dezza

6
@Dezza否,本地主机是127.0.0.1。127.0.0.0/8(即您所说的127.0.0.0到127.255.255.255)是大多数设备的回送,例如RFC 5735第4页记录。(有趣的是,某些Cisco设备可以将环回分配给任何地址,但默认情况下根本不支持环回。这并不是说这很可能会影响网络上的其他设备。)但是,localhost是一个名称,通常仅指向单个地址。地址是127.0.0.1,通常使用“主机”文件来实现。因此,我不同意您尝试进行的更正。
TOOGAM

您能否阐明“它作为目的地地址无效,而仅作为源地址无效”的含义?当mysql服务器监听0.0.0.0时,地址是目的地还是源?它不是mysql客户端发送的请求的目的地吗?
蒂姆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.