Кто-нибудь может объяснить, как 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
linux
networking
Рахул Патил
источник
источник
Ответы:
Особое (и AFAICT) слегка недокументированное поведение в iputils
ping
: вы пингуете себя.Если
ping 0
это то, что происходит (сильно отредактировано и прокомментировано для ясности):inet_aton()
не POSIX, но я предполагаю, что это копирует поведениеinet_addr()
когда преобразуются менее 4 десятичных знаков. В случае одиночного числа без точки оно просто сохраняется в двоичном сетевом адресе и0x00000000
эквивалентно пунктирной форме0.0.0.0
.Вы можете увидеть это, если вы
strace
(как root):Вы также можете увидеть изменения, если вы связываете с конкретным вместо этого интерфейсу:
Хотя 0 может рассматриваться как 0.0.0.0 и широковещательный адрес во многих случаях , это явно не то, что делает пинг . В особых случаях это означает «основной IP рассматриваемого интерфейса» (с некоторой дополнительной обработкой для случаев многоадресной / широковещательной передачи).
RFC 1122 §3.2.1.3 объясняет поведение: и 0.0.0.0, и IP-адрес с замаскированной сетью («номер хоста», например, 0.0.0.1 в случае обратной петли) означают «этот хост в этой сети».
По крайней мере, в случае 0 или 0.0.0.0, как iputils
ping
ведет себя , другие ping и другие ОС могут вести себя по-разному. Например, FreeBSD пингует 0.0.0.0 по маршруту по умолчанию (что я не считаю «правильным» поведением).ping 1
или0.0.0.1
не совсем работает, как надеялись (в любом случае, не для меня, iputils-sss20101006 ).источник