Dlaczego istnieje różnica między pingiem „localhost” a ping „lokalnym adresem IP”?

32

Używanie cmdi pingWindows dał mi następujące wyniki:

  • Pingowanie „localhost”:

Wpisz opis zdjęcia tutaj

  • Pingowanie „192.168.0.10” (lokalny adres IP):

Wpisz opis zdjęcia tutaj

Czy obie sytuacje nie są dokładnie takie same?

Mam na myśli pingowanie tego samego interfejsu, tej samej maszyny i tego samego adresu. Dlaczego otrzymuję tak różne wyniki?

EDYCJA: Oto mój ipconfig /allekran:

Wpisz opis zdjęcia tutaj

Diogo
źródło
18
Nie pingujesz tego samego interfejsu , nawet bez fizycznych interfejsów nadal masz „hosta lokalnego”.
Tamara Wijsman,
Jeśli przez „ten sam interfejs” masz na myśli interfejs pętli zwrotnej, masz rację. Jeśli masz na myśli interfejs Ethernet, mylisz się z kilku powodów. (Na przykład, w jaki sposób :: 1 jest powiązane z interfejsem Ethernet? I dlaczego interfejs Ethernet - którego zadaniem jest wysyłanie pakietów Ethernet za pośrednictwem drutu i odbieranie ich z drutu - miałby brać udział w operacji, która nigdy nie wymaga Pakiet Ethernet czy drut?)
David Schwartz,
Jestem całkiem pewien, że to pytanie zadawano już na Stackoverflow, jeśli mogę je znaleźć ...
Chris S
Myślę, że sedno tego odpowiada SO: stackoverflow.com/questions/6938039/...
Dawson Toth,
Myślę, że interesujące jest to: dlaczego dostajesz liczbę bajtów przesłanych i TTL podczas pingowania zdalnego hosta, ale nie podczas pingowania localhost? Nikt prawdopodobnie nie obchodzi, że format adresu IP jest nieco wyłączony.
dhasenan

Odpowiedzi:

46

Nie pingujesz tego samego interfejsu , bez fizycznych interfejsów nadal masz „hosta lokalnego”.

Twoje localhostodnosi się do twojego komputera z jego „wewnętrznego” adresu IP, a nie z „zewnętrznych” adresów IP twojego komputera. Pakiety ping nie przechodzą przez fizyczny interfejs sieciowy; tylko przez interfejs wirtualnej pętli zwrotnej, który bezpośrednio wysyła pakiety z portu do portu bez żadnych fizycznych przeskoków.

Nadal możesz się zastanawiać, dlaczego localhosttak się dzieje ::1, podczas gdy tradycyjnie spodziewalibyśmy się, że rozwiąże to na adres IPv4 127.0.0.1. Zauważ, że .localhosttradycyjnie jest to TLD (patrz RFC 2606 ), który wskazuje na adres IP pętli zwrotnej (dla IPv4, patrz RFC 3330 , szczególnie 127.0.0.0/8).

Wyszukiwanie za localhostpomocą nslookupdaje nam:

nslookup localhost

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

W związku z tym system Windows woli używać adresu IP z pętlą zwrotną IPv6 ::1(patrz RFC 2373 ), ponieważ jest wymieniony jako pierwszy.

Okej, skąd to się bierze, spójrzmy na plik hosts.

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

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

Hmm, musimy spojrzeć na ustawienia DNS systemu Windows.

W tym artykule bazy wiedzy opisano ustawienie wpływające na preferencje systemu Windows, wyróżnione pogrubioną czcionką:

  1. W Edytorze rejestru zlokalizuj, a następnie kliknij następujący podklucz rejestru:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters
    
  2. Kliknij dwukrotnie pozycję DisabledComponents, aby zmodyfikować wpis DisabledComponents.

    Uwaga: Jeśli pozycja DisabledComponents jest niedostępna, musisz ją utworzyć. Aby to zrobić, wykonaj następujące kroki:

    1. W menu Edycja wskaż polecenie Nowy, a następnie kliknij opcję Wartość DWORD (32-bitowa).

    2. Wpisz DisabledComponents, a następnie naciśnij klawisz ENTER.

    3. Kliknij dwukrotnie DisabledComponents.

  3. Wpisz dowolną z następujących wartości w polu Dane wartości: aby skonfigurować protokół IPv6 do pożądanego stanu, a następnie kliknij przycisk OK:

    • Wpisz, 0aby włączyć wszystkie składniki IPv6. (Ustawienie domyślne systemu Windows)
    • Wpisz, 0xffffffffaby wyłączyć wszystkie składniki IPv6, z wyjątkiem interfejsu sprzężenia zwrotnego IPv6. Ta wartość konfiguruje również system Windows, aby wolał używać protokołu internetowego w wersji 4 (IPv4) niż IPv6, modyfikując wpisy w tabeli zasad prefiksów. Aby uzyskać więcej informacji, zobacz Wybór adresu źródłowego i docelowego.
    • Wpisz, 0x20aby preferować IPv4 zamiast IPv6, modyfikując wpisy w tabeli strategii przedrostków.
    • Wpisz, 0x10aby wyłączyć IPv6 na wszystkich interfejsach nie-tunelowych (zarówno w sieci LAN, jak i interfejsach PPP).
    • Wpisz, 0x01aby wyłączyć IPv6 na wszystkich interfejsach tunelu. Należą do nich międzyplatformowy automatyczny protokół adresowania tuneli (ISATAP), 6to4 i Teredo.
    • Wpisz, 0x11aby wyłączyć wszystkie interfejsy IPv6 z wyjątkiem interfejsu sprzężenia zwrotnego IPv6.
  4. Uruchom ponownie komputer, aby to ustawienie zaczęło obowiązywać.

Co to jest ta tabela zasad prefiksów?

netsh interface ipv6 show prefixpolicies(lub prefixpolicywe wcześniejszych wersjach)

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

Ta tabela określa, które prefiksy mają pierwszeństwo przed innymi prefiksami podczas rozstrzygania DNS.

Ach, więc używając tej KB, moglibyśmy dodać tutaj wpisy, które wskazują, że IPv4 ma wyższy priorytet niż IPv6.

Uwaga: Nie ma powodu, aby zastępować to zachowanie, chyba że występują problemy z kompatybilnością. Zmiana tego ustawienia w naszym systemie Windows Server spowodowała uszkodzenie naszego serwera poczty, dlatego należy się z nim obchodzić ostrożnie ...

Tamara Wijsman
źródło
W rzeczywistości „localhost” nie jest domeną najwyższego poziomu, ale nazwą hosta. Rozróżnienie jest wyjątkowo subtelne, ale w zasadzie każda nazwa domeny jest nazwą hosta, ale nie wszystkie nazwy hostów są nazwami domen. Zgodnie z konwencją nazwy hostów kończące się kropką muszą być FQDN, a większość nazw hostów nie kończących kropką może zostać przekonwertowana na nazwę FQDN poprzez dołączenie domeny nadrzędnej, w razie potrzeby wracając do dołączania katalogu głównego. Są to jednak tylko konwencje. „localhost” jest zarezerwowany przez RFC 2606, aby zapobiec przekształceniu go w TLD, ponieważ prawdopodobnie nie działa poprawnie, a nawet może powodować problemy.
Kevin Cathcart,
2
Niepoprawnie, jak wspomina 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. Zwróć TLDuwagę na tradycyjnie zdefiniowane użycie i zwróć uwagę . W rzeczywistości ping localhost.prace, które potwierdzają, że jest to przynajmniej prawdą w kontekście tego pytania. Twoje ostatnie zdanie nie jest tym, co powiedział RFC, proszę zacytować, jeśli to „zapobiegnie przekształceniu go w TLD”, ponieważ według tego, co mówi , jest tradycyjnie TLD. W przeciwnym razie nie odniosą się do nichthe .localhost TLD
Tamara Wijsman,
Byłem trochę za silny. localhostmoże być TLD, jeśli rzeczywisty serwer DNS odpowiada za to, ale ogólnie localhost jest ogólnie zdefiniowany jako nazwa hosta w / etc / hosts, w której nazwy hostów są sprawdzane przed próbą rozwiązania przez DNS. Jako taki dig localhostzwykle nie zwraca rekordu „A” dla 127.0.0.1 ani rekordu AAAA dla :: 1. Oznacza to, że RFC jest w błędzie, gdy mówi traditionally been statically defined in host DNS implementations, ale raczej zwraca się przez usługę wyszukiwania nazw systemu, która nie zawsze korzysta z DNS.
Kevin Cathcart
@KevinCathcart: Mamy tutaj pytanie dotyczące systemu Windows, a wersje systemu Windows wspominają, że robi to sam DNS. nslookupzwraca rekordy. Tak więc, YMMV ...
Tamara Wijsman,
1
@KevinCathcart my digzwraca rekordy A, AAAA i NS localhost, w tym rekord organu dla:localhost. IN NS localhost.
KutuluMike
20

Interfejs ten istnieje niezależnie od interfejsu Ethernet (ów).

Nawet bez komplikacji IPv6 masz dwa różne adresy.

Loopback IPv4 address: 127.0.0.1
Adres IPv4 interfejsu Ethernet: 192.168.0.10

Interfejs sprzężenia zwrotnego może znajdować się w innej warstwie oprogramowania, bardziej oddalonej od prawdziwego sprzętu. Wątpię, czy zależy to na przykład od konkretnego sterownika interfejsu Ethernet.

RedGrittyBrick
źródło
11

Localhost i twój adres IP to nie to samo.

Localhost to specjalny adres IP oprogramowania, który jest powiązany z twoim systemem. Localhost lub 127.0.0.1 to adres zwrotny pętli. Zawsze wskazuje na twój system i jest dostępny tylko z twojego komputera. To rutowanie odbywa się na poziomie systemu operacyjnego i na pewno nigdy nie opuszcza karty sieciowej ... Więc nie ma szans, aby trafiła do sieci ...

Pingowanie własnego adresu IP jest podobne, ale potencjalnie obejmuje cały stos sieciowy, ponieważ musi wykryć, że jest to Twój adres IP i odpowiednio go trasować ...

Efekt powinien być taki sam, ale mogą występować różnice.

Na przykład odłącz kabel sieciowy. Pinguj swój statyczny adres IP. Możesz nie otrzymać trasy do hosta lub inne błędy. Teraz ping localhost lub 127.0.0.1 i będzie działać.

Benjamin Schollnick
źródło
Więc ping localhost jest kompletnie bezużyteczny? To znaczy, jeśli chcę przetestować mój interfejs ....
Diogo,
4
@DiogoRocha poprawne, ping localhost nigdy nie dotyka sprzętu. Heck ping 192.168.0.10 może również nie dać wiarygodnych informacji, jeśli sterownik karty sieciowej przechwytuje żądania przesłane do siebie.
Scott Chamberlain,
@DiogoRocha Twoja terminologia jest wyłączona. 127.0.0.1 to interfejs, ale wirtualny.
barlop
@Diogo, Niezupełnie. Localhost pozwala przetestować zachowanie aplikacji w sieci lub sprawdzić, czy stos sieci działa ... Ale nie testuje sterownika. Na przykład, jeśli masz zły sterownik karty sieciowej, localhost może pomóc udowodnić, że jest to dobry sterownik. Twój przebieg na pewno będzie się różnić!
Benjamin Schollnick
6

Zdaję sobie sprawę z screenów, że to pytanie nie dotyczy Linuksa, ale być może stanowi użyteczny „przypadek”.

W tym systemie operacyjnym, jeśli pingujesz jeden z adresów lokalnego adaptera, jest on tłumaczony na urządzenie loopback (specjalny przypadek włamania). Oznacza to, że pakiety faktycznie trafiają do urządzenia pętli zwrotnej (co ma wszystkie implikacje, które możesz pomyśleć: na przykład z punktu widzenia zapory ogniowej te pakiety przychodzą na interfejs pętli zwrotnej i będą pasować do reguł dla tego interfejsu).

Urządzenie, do którego przypisany jest adres IP, nigdy nie zobaczy pakietów. (Jest to dobre, ponieważ nie zrobiłoby tego dobrze z tymi pakietami: chciałby wysłać frajerów na zewnątrz.)

Jeśli jednak interfejs, który przechowuje ten adres IP, ulegnie awarii, utracisz to połączenie. Mapowanie do pętli zwrotnej przestanie działać.

Innymi słowy, wykonalnym rozwiązaniem jest uznanie tych lokalnych adresów za aliasy dla urządzenia zwrotnego.

Odnośniki do kodu:

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

Spójrz na funkcję ip_route_output_slow. Wywołuje to fib_lookup, a jeśli ta funkcja zwróci kod RTN_LOCAL, dev_outzostanie przepisane do pętli zwrotnej:

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

Kaz
źródło
4

Wygląda na to, że alias „Localhost” przekształca się w pętlę zwrotną IPv6, a kiedy jawnie używasz adresu IPv4, oczywiście tak nie jest.

EBGreen
źródło
6
Wygląda na to, że system operacyjny się z tobą nie zgadza.
EBGreen,
6
To nie ma znaczenia, najwyraźniej jest skonfigurowany dla komputera, localhost uderza w pętlę ipv6.
Rob
1
@DiogoRocha Nie ma takiego adresu :: 1 w świecie IPV4. 127.0.0.1 jest tam adresem IP zarezerwowanym dla pętli zwrotnej. :: 1 jednak DOES istnieje dla IPV6 i podobnie jak 127.0.0.1 jest zarezerwowany dla sprzężenia zwrotnego IPV6.
Andy,
4
Jak to odpowiada na pytanie? Po prostu stwierdzasz to, co oczywiste.
Tamara Wijsman,
4
Proszę wyjaśnić swoją odpowiedź, to tak naprawdę niczego nie wyjaśnia
Ivo Flipse,
1

@ebwhite ma rację co do tego.

Teraz może być tak, że masz skonfigurowane Teredo (nie mogę rozpoznać po twoim zrzucie ekranu, lepiej jest przesłać go do pliku tekstowego i wkleić cały wynik) - zachowanie localhost będącego IPv6 jest zgodne z systemami na moim Tylko sieć IPv4 z zainstalowanym teredo, ale systemy bez niego zachowują się tak, jak się spodziewasz 127.0.0.1podczas pingowania localhost. Przetestowałem to z Windows XP i muszę zobaczyć, co robią moje systemy Windows 7 i zaktualizować pytanie.

Generalnie systemy domyślnie IPv6 jeśli IPv6 jest dostępna tak, system działa tak jak powinien, .

Journeyman Geek
źródło
nie dostaje Bytes przeniesionych lub TTL, z jednym ze zrzutów ekranu, czy to IPv6? czemu?
barlop
zgodny również z tym, co widzę w systemie Windows 7 - domyślam się, że czas podróży w obie strony jest znikomy
Journeyman Geek