Я запускаю пример в hiredis, который использует «127.0.0.2» в качестве IP-адреса сервера Redis, и он работает правильно. На самом деле, сервер Redis работает на той же машине. Я знаю, что «127.0.0.1» - это IP-адрес "lo", но как насчет «127.0.0.2»? Это так же, как "127.0.0.1"?
3 ответа
Да:
Стандарты сети IPv4 резервируют весь адресный блок 127.0.0.0/8 для целей обратной связи. Это означает, что любой пакет, отправленный на один из этих 16 777 214 адресов (с 127.0.0.1 по 127.255.255.254), возвращается в цикл. IPv6 имеет только один адрес:::1.
Для этой цели в различных стандартах IETF зарезервирован блок адресов IPv4 127.0.0.0/8 в нотации CIDR и адрес IPv6 ::1. Наиболее распространенный IPv4-адрес - 127.0.0.1. Обычно эти петлевые адреса отображаются на имена хостов, localhost или loopback.
или из самого RFC:
127.0.0.0/8 - этот блок назначен для использования в качестве петлевого адреса узла Интернета. Датаграмма, отправленная протоколом более высокого уровня на адрес в любом месте этого блока, должна вернуться обратно в хост. Обычно это реализуется с использованием только 127.0.0.1/32 для обратной связи, но никакие адреса в этом блоке никогда не должны появляться ни в одной сети [RFC1700, стр. 5].
Для развлечения попробуйте пинговать:
$ ping 127.127.127.127
PING 127.127.127.127 (127.127.127.127) 56(84) bytes of data.
64 bytes from 127.127.127.127: icmp_req=1 ttl=64 time=0.110 ms
64 bytes from 127.127.127.127: icmp_req=2 ttl=64 time=0.065 ms
^C
--- 127.127.127.127 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.065/0.087/0.110/0.024 ms
127.0.0.2
совпадает с 127.0.0.1
? Ответ = НЕТ
В то время как 127.0.0.1
до 127.255.255.254
все локальные адреса , привязанные к интерфейсу lo
Они не то же самое. Вы можете использовать каждый адрес для привязки разных сервисов к одному и тому же порту. Например, 16 миллионов веб-серверов на порту 80, доступные только с локального компьютера (если у вас не хватает памяти или других ресурсов в первую очередь)
Я только что настроил службу Docker для привязки к 127.0.0.2:80
, затем я добавил псевдоним в /etc/hosts
теперь я могу подключиться к нему через http://myserver
, но не через http://127.0.0.1
или http://localhost
. Однако он доступен только с этой машины. Только на интерфейсе lo
.
Затем я настроил другую службу Docker для привязки к 127.0.0.3:80
, и службу Python на localhost:80
а другую на 127.0.0.4:80
Это может не работать на всех операционных системах. Я использую Debian(9) Gnu/Linux, ядро Linux 4.9.0-3-amd64
Не полный общий ответ (он уже есть). Этот мой ответ показывает пример, где 127.0.0.2
был использован для решения проблемы.
Выдержка:
Оператор попытался протестировать некоторое программное обеспечение в случае, когда его соединение с сервером было отклонено. Это было сделано на сервере с помощью временного правила iptables
которое отклоняет весь трафик с IP-адреса клиента. Клиент сразу же смог "увидеть", что соединение было отклонено.
Проблема возникла, когда этот человек перенес серверное программное обеспечение на тот же компьютер, что и клиент, и попытался использовать петлевой интерфейс. Правило было заблокировано для обмена данными с 127.0.0.1
но информация о том, что соединение было отклонено, соответствовала тому же правилу и никогда не доходила до зависшего клиентского программного обеспечения (предположительно, до истечения времени ожидания).
Решением было использовать 127.0.0.2
в качестве адреса сервера и установить правило, которое отклоняет подключения к нему. Информация об отказе перешла на 127.0.0.1
и была в состоянии передать клиентскому программному обеспечению.