Đặc biệt (và AFAICT) hành vi được ghi chép lại một chút trong iputils ping
: bạn tự ping.
Nếu bạn ping 0
đây là những gì xảy ra (được chỉnh sửa và nhận xét rõ ràng cho rõ ràng):
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;
inet_aton()
không phải là POSIX, nhưng tôi cho rằng nó sao chép hành vi của inet_addr()
khi có ít hơn 4 số thập phân rải rác đang được chuyển đổi. Trong trường hợp số đơn lẻ không có dấu chấm, nó chỉ được lưu vào địa chỉ mạng nhị phân và 0x00000000
tương đương với dạng chấm 0.0.0.0
.
Bạn có thể thấy điều này nếu bạn strace
(với quyền 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.
Thay vào đó, bạn cũng có thể thấy sự thay đổi nếu bạn liên kết với một giao diện cụ thể :
# 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.
Trong khi 0 có thể được coi là 0.0.0.0 và địa chỉ quảng bá trong nhiều trường hợp rõ ràng không phải là ping đang làm gì . Nó đặc biệt trong trường hợp này có nghĩa là "IP chính của giao diện được đề cập" (với một số xử lý bổ sung cho các trường hợp phát đa hướng / phát sóng).
RFC 1122 §3.2.1.3 giải thích hành vi: cả 0.0.0.0 và địa chỉ IP bị che khuất ("số máy chủ", ví dụ 0.0.0.1 trong trường hợp loopback) có nghĩa là "máy chủ này trên mạng này".
(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.
Ít nhất là trong trường hợp 0 hoặc 0.0.0.0, đó là cách iputils ping
hành xử, các ping khác và các HĐH khác có thể hoạt động khác nhau. Ví dụ, FreeBSD ping 0,0.0.0 qua tuyến mặc định (mà tôi không nghĩ là hành vi "đúng").
ping 1
hoặc 0.0.0.1
không hoàn toàn làm việc như mong đợi (dù sao đối với tôi, iputils-sss20101006 ).