ping zero nasıl çalışır?


16

Herkes nasıl ping 0çalışır açıklayabilir ve çevirebilir 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

Kendinize ping atıyorsunuz: P
Alko

Yanıtlar:


21

Özel (ve AFAICT) iputils'te az belgelenmiş davranış : kendinize ping atıyorsunuz ping .

Eğer siz ping 0buysanı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 0x00000000ve 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 pingdavranı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 1ya da 0.0.0.1olsa umduğum gibi çalışmıyor (yine de benim için değil, iputils-sss20101006 ).


@ mr.spuratic .. beklediğim .. teşekkürler
Rahul Patil

Teknik olarak 0.0.0.0 olarak muamele görmüyor ve daha sonra "arayüzün birincil IP'si" anlamına gelen özel kasa 0.0.0.0 değil mi? 0.0.0.0 'a ping yaparsanız ne olur?
Random832

@ Random832 evet, bu doğru.
mr.spuratic
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.