Почему я могу пинговать 127.1?

11

Я знаю, что IPv6 позволяет опускать последовательные нули. Но как насчет IPv4? Я не нашел ссылки на это в Интернете, включая Wikipedia и RFC 791 - Internet Protocol. В этом документе предполагается, что «ведущие нули могут быть опущены» в адресе IPv4 (поиск по термину «опущен»). Не достаточно конкретно.

Проверьте эту сессию оболочки:

[~]$ ping -c 1 127.1
PING 127.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.040 ms

--- 127.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.040/0.040/0.040/0.000 ms
[~]$ ping -c 1 127.0.1
PING 127.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.044 ms

--- 127.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.044/0.044/0.044/0.000 ms
[~]$ ssh 127.1 :
The authenticity of host '127.1 (127.0.0.1)' can't be established.
ECDSA key fingerprint is 04:48:fa:f2:ef:95:7c:35:46:39:2e:d3:89:dd:cd:87.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '127.1' (ECDSA) to the list of known hosts.
alex@127.1's password: 

Очевидно, что и ping, и ssh понимают 127.1 и 127.0.1 так же, как 127.0.0.1. Где это указано?

Александр де Вертёй
источник
7
Эта страница справочника, ссылка на которую есть в этом сообщении о переполнении стека, может оказаться прямо в вашем переулке.
ботаник
1
Это древний стиль обозначений, но да: он работает :-)
Сандер Штеффанн
1
@nerdwaller: Пожалуйста, опубликуйте это как ответ. (Бонусные баллы, если вы поймете, почему ping 0.0.0.0или ping 0работает так же ...)
user1686

Ответы:

14

Примерно год назад было сообщение о переполнении стека, в котором просят что-то подобное ( этот пост ).

Основная причина в том, как inet_aton()( man-страница ) преобразует октеты в двоичный адрес.

ABCD

Каждая из четырех числовых частей указывает байт адреса; байты назначаются в порядке слева направо для создания двоичного адреса.

азбука

Части a и b определяют первые два байта двоичного адреса. Часть c интерпретируется как 16-битное значение, которое определяет самые правые два байта двоичного адреса. Эта нотация подходит для указания (устаревших) сетевых адресов класса B.

аб

Часть a определяет первый байт двоичного адреса. Часть b интерпретируется как 24-битное значение, которое определяет самые правые три байта двоичного адреса. Эта нотация подходит для указания (устаревших) сетевых адресов класса C.

a

Значение a интерпретируется как 32-битное значение, которое сохраняется непосредственно в двоичный адрес без какой-либо перестановки байтов.

Это не определено POSIX.anything - но это доступно довольно широко.

nerdwaller
источник
1
Отлично, я также проверил сообщение, на которое вы ссылались в Stack Overflow. У него было отличное понимание того, как можно использовать разные системы счисления. @grawity Wikipedia сообщает, что текущая сеть - 0.0.0.0/8. Я предполагаю, что 0.0.0.0/32 должен быть текущим хостом, и этот пинг ожидает только / 32 "сетей". Я не нашел явную ссылку, хотя.
Александр де Verteuil
2
@AlexandredeVerteuil: ping ожидает хосты , а не сети ... так что да, / 32 для IPv4.
user1686
3

Это пережиток старых времен классного обращения. 127.1означает сеть 127, хост 1. (И, да, 127.257это законно, потому что сеть 127может иметь более 256 хостов.

Дэвид Шварц
источник
127.257, в частности 127.0.1.1, адрес, который я на самом деле вижу на старом активаторе сервера KMS, который работал в Windows 8.0
Пол Стелиан,