পিং শূন্য কিভাবে কাজ করে?


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

স্পেশাল (এবং এএএফআইসিটি) আইপুইটিলে কিছুটা আন্ডার-ডকুমেন্টেড আচরণ 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()পসিক্স নয়, তবে আমি ধরে নিচ্ছি যে এটি 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 এবং ব্রডকাস্ট ঠিকানা হিসাবে গণ্য হতে পারে পরিষ্কারভাবে নয় যে কি পিং করছে । এটি "প্রশ্নে ইন্টারফেসের প্রাথমিক আইপি" বোঝাতে (মাল্টিকাস্ট / সম্প্রচারের ক্ষেত্রে কিছু অতিরিক্ত হ্যান্ডলিং সহ) এটি বিশেষ করে।

আরএফসি 1122 .23.2.1.3 আচরণটির ব্যাখ্যা করে: 0.0.0.0 এবং নেটওয়ার্কের সাথে আইপি ঠিকানা উভয়ই মুখোশযুক্ত ("হোস্ট নম্বর", যেমন লুপব্যাকের ক্ষেত্রে 0.0.0.1) এর অর্থ "এই নেটওয়ার্কের এই হোস্ট" mean

       (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 বা ০.০.০.০ এর ক্ষেত্রে iputils কীভাবে pingআচরণ করে তা অন্যান্য পিংস এবং অন্যান্য ওএসগুলি ভিন্নভাবে আচরণ করতে পারে। উদাহরণস্বরূপ ফ্রিবিএসডি ডিফল্ট রুটের মাধ্যমে 0.0.0.0 পিং করে (যা আমি "সঠিক" আচরণ বলে মনে করি না)।

ping 1বা 0.0.0.1আশা হিসাবে যথেষ্ট কাজ করবেন না (যাইহোক আমার জন্য নয়, iputils-sss20101006 )।


@ মিঃ স্পুর্যাটিক .. যা আমি প্রত্যাশা করলাম .. ধন্যবাদ
রাহুল পাতিল

এটা টেকনিক্যালি 0.0.0.0 যেমন চিকিত্সা করা হয় না এবং তারপর পরবর্তীকালে বিশেষ-আবরণ 0.0.0.0 "ইন্টারফেসের প্রাথমিক আইপি" মানে? আপনি 0.0.0.0 পিং করলে কি হবে?
র্যান্ডম 832

@ র্যান্ডম 832 হ্যাঁ, এটি সঠিক।
মিঃ স্পুর্যাটিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.