স্পেশাল (এবং এএএফআইসিটি) আইপুইটিলে কিছুটা আন্ডার-ডকুমেন্টেড আচরণ 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 )।