Чому існує різниця між пінг "localhost" і ping "локальна IP-адреса"?


32

Використання cmdта pingв Windows дало мені такі результати:

  • Pinging "localhost":

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

  • Pinging "192.168.0.10" (локальна IP-адреса):

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

Чи не обидві ситуації абсолютно однакові?

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

EDIT: Ось мій ipconfig /allекран:

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


18
Ви не використовуєте один і той же інтерфейс , навіть без фізичних інтерфейсів у вас все ще є "локальний хост".
Тамара Війсман

Якщо під «тим же інтерфейсом» ви маєте на увазі інтерфейс зворотного зв'язку, ви маєте рацію. Якщо ви маєте на увазі інтерфейс Ethernet, ви помиляєтеся з кількох причин. (Наприклад, як: 1 пов'язаний з інтерфейсом Ethernet? І чому інтерфейс Ethernet - завданням якого є пересилання пакетів Ethernet на дроті та отримання їх з дроту - бере участь у операції, яка ніколи не передбачає Пакет Ethernet або провід?)
Девід Шварц

Я впевнений, що це питання було задано на Stackoverflow раніше, якщо я можу його знайти ...
Chris S

Серце на це відповідає на цю відповідь, я вважаю: stackoverflow.com/questions/6938039/…
Доусон Тот,

Думаю, що цікаве: чому ви отримуєте передану кількість байтів і TTL під час пінг -нгу віддаленого хоста, але ні під час пінг-файлу localhost? Ніхто, ймовірно, не піклується про те, щоб формат IP-адреси трохи не був.
dhasenan

Відповіді:


46

Ви не використовуєте один і той же інтерфейс , без фізичних інтерфейсів у вас ще є "локальний хост".

Ви 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 вважає за краще використовувати задню IP-адресу циклу IPv6 ::1(див. RFC 2373 ), оскільки вона перерахована в першу чергу.

Гаразд, отже, звідки воно походить, давайте подивимось на файл хостів.

type %WINDIR%\System32\Drivers\Etc\Hosts

...
# localhost name resolution is handled within DNS itself.
#       127.0.0.1       localhost
#       ::1             localhost
...

Хм, ми повинні подивитися на налаштування DNS Windows.

Ця стаття KB розповідає про налаштування, яке впливає на те, що Windows віддає перевагу, підкреслене жирним шрифтом:

  1. У Редакторі реєстру знайдіть і натисніть наступний підрозділ реєстру:

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

    Примітка. Якщо запис DisabledComponents недоступний, його потрібно створити. Для цього виконайте наступні дії:

    1. У меню Правка вкажіть пункт Нове, а потім натисніть значення DWORD (32-бітне значення).

    2. Введіть DisabledComponents та натисніть клавішу ENTER.

    3. Двічі клацніть DisabledComponents.

  3. Введіть будь-яке з наступних значень у полі Значення даних: щоб налаштувати протокол IPv6 до потрібного стану, а потім натисніть кнопку ОК:

    • Введіть, 0щоб увімкнути всі компоненти IPv6. (Налаштування Windows за замовчуванням)
    • Введіть, 0xffffffffщоб відключити всі компоненти IPv6, крім інтерфейсу зворотного зв'язку IPv6. Це значення також налаштовує Windows на перевагу використання протоколу Internet Protocol версії 4 (IPv4) над IPv6 шляхом зміни записів у таблиці політики префіксів. Для отримання додаткової інформації див. Вибір джерела та адреси призначення.
    • Введіть 0x20перевагу IPv4 перед IPv6, змінивши записи в таблиці політики префіксів.
    • Введіть, 0x10щоб відключити IPv6 для всіх ненуннельних інтерфейсів (як для інтерфейсів локальної мережі, так і для протоколу «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 порушило наш поштовий сервер, тому з ним слід поводитися обережно ...


Насправді "localhost" - це не домен верхнього рівня, а ім'я хоста. Відмінність надзвичайно тонка, але в основному кожне доменне ім'я - це ім'я хоста, але не всі імена хостів є доменними іменами. За умовами, імена хостів, що закінчуються на повній зупинці, повинні бути FQDN, і більшість імен хостів, які не закінчуються на повній зупинці, можуть бути перетворені в FQDN шляхом додавання батьківського домену, повертаючись до додавання кореня, якщо потрібно. Однак це лише конвенції. "localhost" є зарезервованим RFC 2606, щоб запобігти його перетворенню в TLD, оскільки він, ймовірно, не працює належним чином і навіть може спричинити проблеми.
Кевін Кеткарт

2
Неправильно, як згадує RFC 2606: The ".localhost" TLD has traditionally been statically defined in host DNS implementations as having an A record pointing to the loop back IP address and is reserved for such use. Зверніть увагу на використання TLDта зауважте, що традиційно визначено . Насправді це ping localhost.твори, які підтверджують, що це принаймні вірно в контексті цього питання. Ваше останнє речення - це не те, що сказав RFC, будь ласка, цитуйте, чи це "заважає йому стати TLD", тому що, за його словами, це традиційно TLD. Ще б вони не посилалисяthe .localhost TLD
Тамара Війсман

Я був трохи занадто сильний. localhostможе бути TLD, якщо фактичний сервер DNS відповідає на нього, але, як правило, localhost зазвичай визначається як ім'я хоста в / etc / hosts, в якому імена хостів шукаються до спроби вирішення через DNS. Як такий, dig localhostяк правило, не повертається запис "A" для 127.0.0.1 або запис AAAA для :: 1. Це означає, що RFC помиляється, коли говорить traditionally been statically defined in host DNS implementations, але швидше повертається службою пошуку імен системи, яка не завжди використовує DNS.
Кевін Кеткарт

@KevinCathcart: Тут йдеться про питання Windows, і у версіях Windows згадується, що це робив сам DNS. nslookupробить записи повернення. Отже, YMMV ...
Тамара Війсман

1
@KevinCathcart digповертає записи A, AAAA і NS для записів localhost, включаючи запис про повноваження для:localhost. IN NS localhost.
KutuluMike

20

Інтерфейс зворотного зв'язку існує незалежно від ваших інтерфейсів Ethernet.

Навіть без ускладнення IPv6 у вас є дві різні адреси.

Loopback IPv4 - адреса: 127.0.0.1
IPv4 адресу вашого інтерфейсу Ethernet - : 192.168.0.10

Інтерфейс зворотного зв'язку, можливо, знаходиться в іншому програмному рівні, більш віддаленому від реального обладнання. Я сумніваюся, що це залежить від конкретного драйвера інтерфейсу Ethernet.


11

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

Localhost - це спеціальне програмне забезпечення, призначене лише для IP-адреси, яке пов'язане з вашою системою. Localhost, або 127.0.0.1, - це зворотна адреса циклу. Він завжди вказує на вашу систему і доступний лише з комп'ютера. Така маршрутизація відбувається на рівні ОС, і, безумовно, ніколи не залишає NIC ... Тож немає шансів потрапити в мережу ....

Пінгінг власної IP-адреси схожий, але потенційно включає весь стек мереж, оскільки він повинен виявити, що це ваша IP-адреса, і правильно вказати маршрут ...

Ефект повинен бути однаковим, але можуть бути відмінності.

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


Отже, пінг localhost є абсолютно марним? Я маю на увазі, якщо я хочу перевірити свій інтерфейс ....
Diogo

4
@DiogoRocha правильний, ping localhost ніколи не торкається обладнання. Heck ping 192.168.0.10 може також не надати вам достовірної інформації, якщо драйвер мережевої карти перехоплює запити, задані самому собі.
Скотт Чемберлен

@DiogoRocha Ваша термінологія вимкнена. 127.0.0.1 - це інтерфейс, але віртуальний.
барлоп

@Diogo, Не зовсім. Localhost дозволяє перевірити мережеву поведінку програми або перевірити, чи працює мережевий стек .... Але він не перевіряє драйвер. Так, наприклад, якщо у вас поганий драйвер NIC, localhost може допомогти довести, що це драйвер nic. Ваш пробіг точно зміниться !!
Бенджамін Шолнік

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перезаписується до циклу:

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


4

Схоже, псевдонім "Localhost" вирішує зворотний зв'язок IPv6, і коли ви явно використовуєте IPv4-адресу, очевидно, це не відбувається.


6
Здається, ОС не погоджується з вами.
EBGreen

6
Не має значення, це, мабуть, налаштовано для комп'ютера, localhost запускає цикл ipv6.
Роб

1
@DiogoRocha У світі IPV4 немає такої адреси :: 1. 127.0.0.1 - це IP, зарезервований для циклу зворотного зв'язку. :: 1, проте чи існує для IPV6, і, як 127.0.0.1, зарезервовано для циклу зворотного зв'язку IPV6.
Енді

4
Як це відповідає на питання? Ви просто констатуєте очевидне.
Тамара Війсман

4
Прошу уточнити свою відповідь, це насправді нічого не пояснює
Іво Фліпс

1

@ebwhite має рацію в чому.

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

Як правило, системи за замовчуванням для IPv6, якщо IPv6 доступний так, ваша система працює як слід .


він не передає байтів або TTL, з одним із знімків екрана, це IPv6? чому?
барлоп

також узгоджується з тим, що я бачу на Windows 7 - я гадаю, що зворотній час поїздки незначний
Journeyman Geek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.