任何人都可以解释它是如何ping 0工作的并将其转换为127.0.0.1.
[champu@testsrv ]$ ping 0
PING 0 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.039 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.013 ms
--- 0 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.013/0.026/0.039/0.013 ms
Run Code Online (Sandbox Code Playgroud)
mr.*_*tic 21
iputils 中的 特殊(和 AFAICT)行为略有不足ping:您 ping 自己。
如果你ping 0就是这样(为了清楚起见,经过大量编辑和评论):
if (inet_aton(target, &whereto.sin_addr)) == 1) {
// convert string to binary in_addr
}
// inet_aton returns 1 (success) and leaves the `in_addr` contents all zero.
if (source.sin_addr.s_addr == 0) {
// determine IP address of src interface, via UDP connect(), getsockname()
}
// special case for 0 dst address
if (whereto.sin_addr.s_addr == 0)
whereto.sin_addr.s_addr = source.sin_addr.s_addr;
Run Code Online (Sandbox Code Playgroud)
inet_aton()不是 POSIX,但我假设它复制了inet_addr()少于 4 个点分十进制被转换时的行为。在无点单数的情况下,它只是存储到二进制网络地址中,0x00000000相当于点形式0.0.0.0。
如果您strace(以 root 用户身份):
# strace -e trace=network ping 0
socket(PF_INET, SOCK_RAW, IPPROTO_ICMP) = 3
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4
connect(4, {sa_family=AF_INET, sin_port=htons(1025),
sin_addr=inet_addr("0.0.0.0")}, 16) = 0
getsockname(4, {sa_family=AF_INET, sin_port=htons(58056),
sin_addr=inet_addr("127.0.0.1")}, [16]) = 0
...
PING 0 (127.0.0.1) 56(84) bytes of data.
Run Code Online (Sandbox Code Playgroud)
如果您改为绑定到特定接口,您还可以看到更改:
# strace -e trace=network ping -I eth0 0
socket(PF_INET, SOCK_RAW, IPPROTO_ICMP) = 3
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4
setsockopt(4, SOL_SOCKET, SO_BINDTODEVICE, "eth0\0", 5) = 0
connect(4, {sa_family=AF_INET, sin_port=htons(1025),
sin_addr=inet_addr("0.0.0.0")}, 16) = 0
getsockname(4, {sa_family=AF_INET, sin_port=htons(58408),
sin_addr=inet_addr("192.168.0.123")}, [16]) = 0
setsockopt(3, SOL_RAW, ICMP_FILTER, ...)
[...]
PING 0 (192.168.0.123) from 192.168.0.123 eth0: 56(84) bytes of data.
Run Code Online (Sandbox Code Playgroud)
虽然在许多情况下 0 可能被视为 0.0.0.0 和广播地址,但这显然不是 ping 正在做的事情。在特殊情况下,这意味着“相关接口的主要 IP”(对多播/广播情况进行一些额外处理)。
RFC 1122 §3.2.1.3 解释了这种行为:0.0.0.0 和网络被屏蔽的 IP 地址(“主机号”,例如环回情况下的 0.0.0.1)意味着“这个网络上的这个主机”。
Run Code Online (Sandbox Code Playgroud)(a) { 0, 0 } This host on this network. MUST NOT be sent, except as a source address as part of an initialization procedure by which the host learns its own IP address. See also Section 3.3.6 for a non-standard use of {0,0}. (b) { 0, <Host-number> } Specified host on this network. It MUST NOT be sent, except as a source address as part of an initialization procedure by which the host learns its full IP address.
至少在 0 或 0.0.0.0 这就是 iputils 的ping行为方式的情况下,其他 ping 和其他操作系统的行为可能会有所不同。例如,FreeBSD 通过默认路由 ping 0.0.0.0(我认为这不是“正确”的行为)。
ping 1或者不太像0.0.0.1预期的那样工作(反正不适合我,iputils-sss20101006)。
| 归档时间: |
|
| 查看次数: |
3955 次 |
| 最近记录: |