ping zeroはどのように機能しますか?


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

あなた自身をpingしている:P
Alko

回答:


21

スペシャル(とAFAICT)やや下に文書での動作のiputils ping:あなた自身に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個未満のドット付き10進数が変換されるときの動作をコピーすると想定しています。ドットなしの単一番号の場合、それは単にバイナリネットワークアドレスに格納され0x00000000、ドット形式と同等0.0.0.0です。

あなたはstrace(rootとして)これを見ることができます:

# 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および他のOSは異なる動作をする可能性があります。たとえば、FreeBSDはデフォルトルートを介して0.0.0.0にpingを実行します(これは「正しい」動作ではないと思います)。

ping 1または0.0.0.1、期待どおりには動作しません(とにかくiputils-sss20101006)。


@ mr.spuratic ..私は..おかげで期待したものということ
ラーフルパティル

技術的には0.0.0.0として処理し、その後0.0.0.0を特別にケーシングして「インターフェースのプライマリIP」を意味していませんか?0.0.0.0にpingを実行するとどうなりますか?
Random832

@ Random832はい、それは正しいです。
mr.spuratic
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.