塔南鲍姆的计算机网络说
IP 地址 0.0.0.0(最低地址)是主机启动时使用。它的意思是“这个网络”或“这个主机”。
[::]
是 IPv4 的 IPv6 版本0.0.0.0
。
问题:
1)什么时候[::]
表示0.0.0.0
这个网络,什么时候表示这个主机?
2) 当表示该主机时,是指该主机上的所有网络接口,还是仅表示该主机上的一个指定网络接口?
3)为什么[::]
允许我从同一局域网内的其他主机访问mysql服务器?这里是指这个网络还是这个主机?为什么 [::]
被mysql服务器使用,尽管主机不在“启动时”的情况下?
$ sudo netstat -ap | grep mysql
tcp6 0 0 [::]:mysql [::]:* LISTEN 23683/mysqld
tcp6 0 0 [::]:33060 [::]:* LISTEN 23683/mysqld
unix 2 [ ACC ] STREAM LISTENING 1169294 23683/mysqld /var/run/mysqld/mysqld.sock
unix 2 [ ACC ] STREAM LISTENING 1169513 23683/mysqld /var/run/mysqld/mysqlx.sock
unix 2 [ ] DGRAM 1169211 23683/mysqld
谢谢。
答案1
在netstat
您给出的输出中,“0.0.0.0”和“[::]”并不意味着“此主机”,它们意味着相关服务正在侦听“此主机上的所有接口”。因此,这些端口对任何主机开放,包括本地主机。
答案2
请注意 RFC 1122 中的官方 IP 定义是this host on this network
。这这官方定义。然而,操作系统特定的用途仍然存在。
Linux 的内部使用[::]
和0.0.0.0
更好地被认为是来自其他计算领域的“Null”。根据上下文,“null”可能意味着“什么都没有”、“不知道”、“不关心”或偶尔“错误”。它的含义确实是上下文相关的。
IP 地址可用于表示网络或主机。例如192.168.1.1是主机192.168.1.0/24。它所代表的内容完全取决于软件期望接收的内容。
当它表示该主机时,是指该主机上的所有网络接口,还是仅表示该主机上的一个指定网络接口?
当提到绑定(监听)套接字时,它的意思是“不关心”哪个 IP。但这仅限于当前主机的 IP,因此实际上意味着从当前主机寻址到任何 IP 的任何接口上都将接受连接。