
Использование cmd
и ping
в Windows дало мне следующие результаты:
- Пинг "localhost":
- Пинг "192.168.0.10" (локальный IP-адрес):
Разве обе ситуации не одинаковы?
Я имею в виду, я пингую тот же интерфейс, ту же машину и тот же адрес. Почему я получаю такие разные результаты?
EDIT: Вот мой ipconfig /all
экран:
решение1
Вы не пингуете тот же интерфейс, без каких-либо физических интерфейсов у вас все равно будет «локальный хост».
Your localhost
используется для обращения к вашему компьютеру с его "внутреннего" IP, а не с любого "внешнего" IP вашего компьютера. Таким образом, пакеты ping не проходят через какой-либо физический сетевой интерфейс; только через виртуальный интерфейс обратной петли, который напрямую отправляет пакеты с порта на порт без каких-либо физических переходов.
Вы все еще можете задаться вопросом, почему localhost
разрешается в ::1
, хотя традиционно мы ожидаем, что он разрешается в адрес IPv4 127.0.0.1
. Обратите внимание, что .localhost
традиционно является TLD (см.RFC2606), который указывает на IP-адрес обратной связи (для IPv4 см.RFC3330, особенно 127.0.0.0/8).
Поиск localhost
с помощью nslookup
дает нам:
nslookup localhost
...
Name: localhost
Addresses: ::1
127.0.0.1
Таким образом, Windows предпочитает использовать IP-адрес обратной связи IPv6 ::1
(см.Запрос на изменение 2373), так как он указан первым.
Хорошо, откуда это взялось, давайте посмотрим на файл hosts.
type %WINDIR%\System32\Drivers\Etc\Hosts
...
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
...
Хм, надо посмотреть настройки DNS в Windows.
Эта статья базы знанийсообщает нам о настройке, которая влияет на предпочтения Windows, выделенной жирным шрифтом:
В редакторе реестра найдите и щелкните следующий подраздел реестра:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters
Дважды щелкните DisabledComponents, чтобы изменить запись DisabledComponents.
Примечание: Если запись DisabledComponents недоступна, ее необходимо создать. Для этого выполните следующие действия:
В меню «Правка» выберите пункт «Создать», а затем щелкните «Параметр DWORD (32 бита)».
Введите DisabledComponents и нажмите ENTER.
Дважды щелкните DisabledComponents.
Введите любое из следующих значений в поле «Значение», чтобы настроить протокол IPv6 на желаемое состояние, а затем нажмите кнопку «ОК»:
- Введите
0
, чтобы включить все компоненты IPv6. (Настройка Windows по умолчанию)- Введите
0xffffffff
, чтобы отключить все компоненты IPv6, за исключением интерфейса обратной связи IPv6. Это значение также настраивает Windows на использование предпочтительного протокола Интернета версии 4 (IPv4) вместо IPv6 путем изменения записей в таблице политики префиксов. Для получения дополнительной информации см. Выбор адреса источника и назначения.- Введите
0x20
, чтобы отдать предпочтение IPv4 вместо IPv6, изменив записи в таблице политик префиксов.- Введите
0x10
, чтобы отключить IPv6 на всех нетуннельных интерфейсах (как на интерфейсах локальной сети, так и на интерфейсах протокола точка-точка [PPP]).- Введите
0x01
, чтобы отключить IPv6 на всех туннельных интерфейсах. К ним относятся Intra-Site Automatic Tunnel Addressing Protocol (ISATAP), 6to4 и Teredo.- Введите
0x11
, чтобы отключить все интерфейсы IPv6, за исключением интерфейса обратной связи IPv6.Перезагрузите компьютер, чтобы изменения вступили в силу.
Что это за таблица политики префиксов?
netsh interface ipv6 show prefixpolicies
(илиprefixpolicy
в более ранних версиях)
Precedence Label Prefix
---------- ----- --------------------------------
50 0 ::1/128
45 13 fc00::/7
40 1 ::/0
10 4 ::ffff:0:0/96
7 14 2002::/16
5 5 2001::/32
1 11 fec0::/10
1 12 3ffe::/16
1 10 ::/96
В этой таблице определяется, какие префиксы имеют приоритет над другими префиксами во время разрешений DNS.
Ага, так вот, используя эту базу знаний, мы могли бы добавить сюда записи, которые обозначают, что IPv4 имеет более высокий приоритет, чем IPv6.
Примечание:Нет причин переопределять это поведение, если только у вас нет проблем с совместимостью. Изменение этого параметра на нашем сервере Windows сломало наш почтовый сервер, поэтому с этим следует обращаться осторожно...
решение2
Theинтерфейс обратной связисуществует независимо от вашего интерфейса(ов) Ethernet.
Даже без усложненияIPv6у вас будет два разных адреса.
Обратная петляIPv4адрес: 127.0.0.1
IPv4-адрес вашего интерфейса Ethernet: 192.168.0.10
Интерфейс loopback вполне может находиться на другом программном уровне, более удаленном от реального оборудования. Я сомневаюсь, что это как-то зависит от вашего конкретного драйвера интерфейса Ethernet, например.
решение3
Localhost и ваш IP-адрес — это не одно и то же.
Localhost — это специальный программный IP-адрес, который связан с вашей системой. Localhost или 127.0.0.1 — это адрес обратной связи. Он всегда указывает на вашу систему и доступен только с вашего компьютера. Эта маршрутизация происходит на уровне ОС и определенно никогда не покидает сетевой адаптер... Поэтому у него нет никаких шансов попасть в сеть...
Пинг вашего собственного IP-адреса аналогичен, но он потенциально задействует весь сетевой стек, поскольку ему необходимо определить, что это ваш IP-адрес, иправильно направить его...
Эффект должен быть одинаковым, но могут быть различия.
Например, отключите сетевой кабель. Пропингуйте свой статический IP-адрес. Вы можете не получить маршрут к хосту или получить другие ошибки. Теперь пропингуйте localhost или 127.0.0.1, и это сработает.
решение4
Похоже, что псевдоним «Localhost» преобразуется в обратную связь IPv6, а когда вы явно используете адрес IPv4, очевидно, что этого не происходит.