Özel (ve AFAICT) iputils'te az belgelenmiş davranış : kendinize ping atıyorsunuz ping
.
Eğer siz ping 0
buysanız (netlik için yoğun bir şekilde düzenlenmiş ve yorumlanmıştır):
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()
POSIX değil, ancak inet_addr()
4'ten az noktalı ondalık sayıların dönüştürüldüğünün davranışını kopyaladığını varsayıyorum . Noktasız tek bir sayı olması durumunda, bu sadece ikili ağ adresine kaydedilir 0x00000000
ve noktalı forma eşdeğerdir 0.0.0.0
.
strace
(Kök olarak) eğer bunu görebilirsiniz :
# 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.
Bunun yerine belirli bir arayüze bağlanırsanız değişikliği de görebilirsiniz :
# 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.
0, 0.0.0.0 olarak kabul edilebilir ve birçok durumda ping'in yaptığı şey bu değildir . Özel durumlar, "söz konusu arabirimin birincil IP'si" anlamına gelir (çok noktaya yayın / yayın vakaları için bazı ekstra işlemlerle).
RFC 1122 §3.2.1.3 davranışı açıklar: hem 0.0.0.0 hem de ağın maskelenmiş olduğu IP adresi ("ana bilgisayar numarası", örneğin geri döngü durumunda 0.0.0.1) "bu ağdaki bu ana bilgisayar" anlamına gelir.
(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.
En azından 0 veya 0.0.0.0 durumunda, iputils böyle ping
davranır, diğer pingler ve diğer işletim sistemleri farklı davranabilir. Örneğin, FreeBSD varsayılan yol üzerinden 0.0.0.0 ping ("doğru" davranış olduğunu sanmıyorum).
ping 1
ya da 0.0.0.1
olsa umduğum gibi çalışmıyor (yine de benim için değil, iputils-sss20101006 ).