विशेष (और 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 के रूप में माना जा सकता है और कई मामलों में एक प्रसारण पता जो स्पष्ट रूप से नहीं है कि पिंग क्या कर रहा है । यह विशेष रूप से मामलों का अर्थ है "प्रश्न में इंटरफ़ेस का प्राथमिक आईपी" (मल्टीकास्ट / प्रसारण मामलों के लिए कुछ अतिरिक्त हैंडलिंग के साथ)।
RFC 1122 FC3.2.1.3 व्यवहार की व्याख्या करता है: नेटवर्क के साथ 0.0.0.0 और आईपी पते दोनों बंद ("मेजबान संख्या", जैसे लूपबैक के मामले में 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 )।