शून्य काम कैसे करता है?


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

आप खुद को पिंग कर रहे हैं: पी
अल्को नोव

जवाबों:


21

विशेष (और 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 )।


@ mr.spuratic .. जो मुझे उम्मीद थी .. धन्यवाद
राहुल पाटिल

क्या यह तकनीकी रूप से इसे 0.0.0.0 के रूप में नहीं मान रहा है और फिर बाद में विशेष-आवरण 0.0.0.0 का अर्थ है "इंटरफ़ेस का प्राथमिक आईपी"? यदि आप 0.0.0.0 पिंग करते हैं तो क्या होता है?
रैंडम 832 15

@ Random832 हाँ, यह सही है।
mr.spuratic 15
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.