핑 제로는 어떻게 작동합니까?


16

어떻게 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

Ping
Al

답변:


21

iputils 에서 약간 문서화 된 특수 (및 AFAICT) 동작 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;

inet_aton()POSIX는 아니지만 inet_addr()4 점 미만의 십진수가 변환 될 때 의 동작을 복사한다고 가정합니다 . 점이없는 단일 숫자의 경우 단순히 이진 네트워크 주소에 저장되며 0x00000000점선 형식과 같습니다 0.0.0.0.

당신이 strace(루트로서) 이것을 볼 수 있습니다 :

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

대신 특정 인터페이스에 바인딩하면 변경 사항을 볼 수도 있습니다 .

# 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으로 처리 될 수 있지만 많은 경우 브로드 캐스트 주소는 ping이 수행하지 않는 것이 분명 합니다. 이것은 "문제가되는 인터페이스의 기본 IP"(멀티 캐스트 / 브로드 캐스트 사례에 대한 추가 처리 포함)를 의미하는 특수한 경우입니다.

RFC 1122 §3.2.1.3은 동작을 설명합니다. 0.0.0.0 및 네트워크가 마스크 해제 된 IP 주소 (루프백의 경우 0.0.0.1과 같은 "호스트 번호")는 "이 네트워크의이 호스트"를 의미합니다.

       (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작동 하는 방식 이며 다른 핑 및 다른 OS는 다르게 작동 할 수 있습니다. 예를 들어 기본 경로를 통한 FreeBSD 핑 0.0.0.0 ( "정확하지 않은"행동이라고 생각하지 않습니다).

ping 1또는 0.0.0.1원하는대로 작동하지 않습니다 (어쨌든 iputils-sss20101006 ).


@ mr.spuratic .. 내가 기대했던 것 .. 고마워
Rahul Patil

기술적으로 0.0.0.0으로 처리 한 다음 특수 인터페이스 0.0.0.0 을 사용하여 "인터페이스의 기본 IP"를 의미하지 않습니까? 0.0.0.0을 핑하면 어떻게됩니까?
Random832

@ Random832 네, 맞습니다.
mr.spuratic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.