wie funktioniert ping zero

16

kann jemand erklären, wie es ping 0funktioniert und es zu übersetzen 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
Rahul Patil
quelle
Sie pingen sich selbst: P
Alko

Antworten:

21

Besonderes (und AFAICT) leicht unterdokumentiertes Verhalten bei iputils ping : Sie pingen sich selbst an.

Wenn Sie ping 0dies tun, geschieht Folgendes (aus Gründen der Übersichtlichkeit stark bearbeitet und kommentiert):

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()ist nicht POSIX, aber ich gehe davon aus, dass es das Verhalten kopiert, inet_addr()wenn weniger als 4 Dezimalpunkte konvertiert werden. Im Fall einer einzelnen Zahl ohne Punkte wird sie einfach in der binären Netzwerkadresse gespeichert und 0x00000000entspricht der gepunkteten Form 0.0.0.0.

Sie können dies sehen, wenn Sie strace(als 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.

Sie können die Änderung auch sehen, wenn Sie sich stattdessen an eine bestimmte Schnittstelle binden :

# 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.

Während 0 als 0.0.0.0 und eine Broadcast-Adresse behandelt werden kann, ist dies in vielen Fällen eindeutig nicht das, was Ping tut . In Sonderfällen bedeutet dies "die primäre IP der fraglichen Schnittstelle" (mit etwas zusätzlicher Behandlung für Multicast- / Broadcast-Fälle).

RFC 1122 §3.2.1.3 erläutert das Verhalten: Sowohl 0.0.0.0 als auch die IP-Adresse mit ausgeblendetem Netzwerk (die "Host-Nummer", z. B. 0.0.0.1 bei Loopback) bedeuten "dieser Host in diesem Netzwerk".

       (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.

Zumindest im Fall von 0 oder 0.0.0.0 pingverhält sich iputils so , dass andere Pings und andere Betriebssysteme sich möglicherweise anders verhalten. Zum Beispiel pingt FreeBSD 0.0.0.0 über die Standardroute (was meines Erachtens nicht "korrekt" ist).

ping 1oder 0.0.0.1nicht ganz wie erhofft funktionieren (jedenfalls nicht für mich, iputils-sss20101006 ).

mr.spuratic
quelle
@ mr.spuratic .. das, was ich erwartet habe .. danke
Rahul Patil
Ist es nicht die Behandlung technisch als 0.0.0.0 und dann anschließend ein spezielles Gehäuse 0.0.0.0 „die primäre IP - Adresse der Schnittstelle“ zu bedeuten? Was passiert, wenn Sie 0.0.0.0 anpingen?
Random832
@ Random832 ja, das stimmt.
mr.spuratic