누구든지 그것이 어떻게 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
답변1
특수(및 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
, 다른 ping 및 기타 운영 체제는 다르게 작동할 수 있습니다. 예를 들어, FreeBSD는 기본 경로를 통해 0.0.0.0을 핑합니다(저는 이것이 "올바른" 동작이라고 생각하지 않습니다).
ping 1
또는 0.0.0.1
원하는 대로 작동하지 않습니다(어쨌든 나에게는 해당되지 않음).iputils-sss20101006).