32

Использование cmd и ping в Windows дало мне следующие результаты:

  • Пингует "localhost":

Введите описание изображения здесь

  • Пинг "192.168.0.10" (локальный IP-адрес):

Введите описание изображения здесь

Разве обе ситуации не одинаковы?

Я имею в виду, я пингую тот же интерфейс, ту же машину и тот же адрес. Почему я получаю такие разные результаты?

РЕДАКТИРОВАТЬ: Вот мой ipconfig /all экран:

Введите описание изображения здесь

6 ответов6

45

Вы не пропингуете тот же интерфейс, без каких-либо физических интерфейсов у вас все еще есть "локальный хост".

Ваш localhost используется для ссылки на ваш компьютер с его "внутреннего" IP, а не с любого "внешнего" IP вашего компьютера. Таким образом, пакеты ping не проходят через какой-либо физический сетевой интерфейс; только через интерфейс виртуальной обратной связи, который напрямую отправляет пакеты от порта к порту без каких-либо физических скачков.

Вы можете все еще задаться вопросом, почему localhost разрешается в ::1 , в то время как традиционно мы ожидаем, что он разрешится в IPv4-адрес 127.0.0.1 . Обратите внимание, что .localhost традиционно является TLD (см. RFC 2606), который указывает на обратный IP-адрес (для IPv4 см. RFC 3330 , особенно 127.0.0.0/8).

Поиск localhost с помощью nslookup дает нам:

nslookup localhost

...
Name:    localhost
Addresses:  ::1
          127.0.0.1

Таким образом, Windows предпочитает использовать IPv6 loopback IP address ::1 (см. RFC 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, выделенной жирным шрифтом:

  1. В редакторе реестра найдите и щелкните следующий раздел реестра:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters
    
  2. Дважды щелкните DisabledComponents, чтобы изменить запись DisabledComponents.

    Примечание. Если запись DisabledComponents недоступна, ее необходимо создать. Для этого выполните следующие действия:

    1. В меню «Правка» выберите пункт «Создать» и нажмите «Значение DWORD (32-разрядное)».

    2. Введите DisabledComponents и нажмите клавишу ВВОД.

    3. Дважды щелкните DisabledComponents.

  3. Введите любое из следующих значений в поле Значение: данные, чтобы настроить протокол IPv6 на нужное состояние, а затем нажмите кнопку ОК:

    • Введите 0 чтобы включить все компоненты IPv6. (Настройка Windows по умолчанию)
    • Введите 0xffffffff чтобы отключить все компоненты IPv6, кроме петлевого интерфейса IPv6. Это значение также настраивает Windows на использование Интернет-протокола версии 4 (IPv4) вместо IPv6 путем изменения записей в таблице политик префиксов. Для получения дополнительной информации см. Выбор источника и адреса назначения.
    • Введите 0x20 чтобы предпочитать IPv4 по сравнению с IPv6, изменив записи в таблице политик префиксов.
    • Введите 0x10 чтобы отключить IPv6 на всех нетуннельных интерфейсах (как на интерфейсах LAN, так и на протоколах PPP).
    • Введите 0x01 чтобы отключить IPv6 на всех туннельных интерфейсах. К ним относятся протокол внутренней туннельной автоматической адресации (ISATAP), 6to4 и Teredo.
    • Введите 0x11 чтобы отключить все интерфейсы IPv6, кроме интерфейса обратной связи IPv6.
  4. Перезагрузите компьютер, чтобы этот параметр вступил в силу.

Что это за таблица префиксов политики?

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.

Ах, поэтому, используя этот KB, мы могли бы добавить сюда записи, которые обозначают, что IPv4 имеет более высокий приоритет, чем IPv6.

Примечание. Нет причин переопределять это поведение, если только у вас не возникли проблемы с совместимостью. Изменение этого параметра на нашем Windows Server нарушило работу нашего почтового сервера, поэтому с ним следует обращаться осторожно ...

20

Интерфейс обратной связи существует независимо от вашего интерфейса (ов) Ethernet.

Даже без усложнения IPv6 у вас будет два разных адреса.

Петлевой IPv4- адрес: 127.0.0.1
IPv4-адрес вашего интерфейса Ethernet: 192.168.0.10

Интерфейс обратной связи вполне может находиться на другом программном уровне, более удаленном от реального оборудования. Я сомневаюсь, что это каким-то образом зависит от вашего конкретного драйвера интерфейса Ethernet, например.

11

Localhost и ваш IP-адрес не одно и то же.

Локальный хост - это специальный программный IP-адрес, связанный с вашей системой. Localhost, или 127.0.0.1, является адресом обратной связи. Он всегда указывает на вашу систему и доступен только с вашего компьютера. Эта маршрутизация происходит на уровне ОС и определенно никогда не покидает сетевой адаптер ... Так что у него нет шансов попасть в сеть ....

Проверка вашего собственного IP-адреса аналогична, но потенциально может включать в себя весь сетевой стек, так как он должен определить, что это ваш IP-адрес, и правильно его направить...

Эффект должен быть таким же, но могут быть различия.

Например, отключите сетевой кабель. Пингуйте свой статический IP-адрес. Вы можете не получить маршрут к хосту или другие ошибки. Теперь пропингуйте localhost или 127.0.0.1, и все заработает.

6

На снимках экрана я понимаю, что этот вопрос не о Linux, но, возможно, он является полезным "примером".

В этой ОС, если вы пропингуете один из адресов локального адаптера, он транслируется на устройство обратной связи (особый случай взломать). Это означает, что пакеты на самом деле отправляются на устройство обратной связи (что имеет все последствия, о которых вы могли подумать: например, с точки зрения брандмауэра, эти пакеты поступают на интерфейс обратной связи и будут соответствовать правилам для этого интерфейса).

Устройство, которому назначен IP, никогда не увидит пакеты. (Это хорошо, потому что он не будет правильно делать с этими пакетами: он хотел бы отправить присоски.)

Тем не менее, если интерфейс, который содержит этот IP-адрес, не работает, вы потеряете это соединение. Преобразование в петлю перестанет работать.

Другими словами, это приемлемый дизайн, который рассматривает эти локальные адреса как псевдонимы для устройства обратной связи.

Ссылки на код:

http://lxr.linux.no/#linux+v3.3.2/net/ipv4/route.c#L2623

Посмотрите на функцию ip_route_output_slow . Это вызывает fib_lookup , и если эта функция возвращает код RTN_LOCAL , dev_out переписывается в loopback:

http://lxr.linux.no/#linux+v3.3.2/net/ipv4/route.c#L2769

5

Похоже, псевдоним "Localhost" преобразуется в петлю IPv6, а когда вы явно используете адрес IPv4, очевидно, что это не так.

1

@ebwhite прав насчёт чего.

Теперь, возможно, причина в том, что у вас настроена Teredo (я не могу сказать по вашему скриншоту, лучше скопировать его в текстовый файл и вставить весь вывод) - поведение localhost, поскольку IPv6 соответствует системам на моем Сеть только для IPv4 с установленным Teredo, но системы без него ведут себя так, как вы ожидаете получить 127.0.0.1 при пинге localhost . Я протестировал это с Windows XP и мне нужно посмотреть, что делают мои системы Windows 7, и обновить вопрос.

Как правило, системы по умолчанию используют IPv6, если IPv6 доступен, поэтому ваша система работает так, как она должна .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .