Mengapa ada perbedaan antara ping "localhost" dan ping "alamat IP lokal"?

32

Menggunakan cmddan pingpada Windows memberi saya hasil berikut:

  • Ping "localhost":

Masukkan deskripsi gambar di sini

  • Pinging "192.168.0.10" (alamat IP lokal):

Masukkan deskripsi gambar di sini

Bukankah kedua situasi sama persis?

Maksudku, aku melakukan ping antarmuka yang sama, mesin yang sama dan alamat yang sama. Mengapa saya mendapatkan hasil yang berbeda?

EDIT: Ini ipconfig /alllayar saya :

Masukkan deskripsi gambar di sini

Diogo
sumber
18
Anda tidak melakukan ping antarmuka yang sama , bahkan tanpa antarmuka fisik apa pun Anda masih memiliki "host lokal".
Tamara Wijsman
Jika dengan "antarmuka yang sama", maksud Anda antarmuka loopback, Anda benar. Jika yang Anda maksud adalah antarmuka Ethernet, Anda salah karena beberapa alasan. (Misalnya, bagaimana :: 1 dikaitkan dengan antarmuka Ethernet? Dan mengapa antarmuka Ethernet - yang tugasnya mengirim paket Ethernet pada kabel dan menerimanya dari kabel - terlibat dalam operasi yang tidak pernah melibatkan Paket ethernet atau kabel?)
David Schwartz
Saya cukup yakin pertanyaan ini telah ditanyakan pada Stackoverflow sebelumnya, jika saya dapat menemukannya ...
Chris S
Inti dari ini akan dijawab oleh SO ini, saya percaya: stackoverflow.com/questions/6938039/…
Dawson Toth
Saya pikir hal yang menarik adalah: mengapa Anda mendapatkan sejumlah byte yang ditransfer dan TTL saat melakukan ping host jarak jauh, tetapi tidak ketika melakukan ping localhost? Sepertinya tidak ada yang peduli bahwa format alamat IP agak tidak aktif.
dhasenan

Jawaban:

46

Anda tidak melakukan ping pada antarmuka yang sama , tanpa antarmuka fisik apa pun, Anda masih memiliki "host lokal".

Anda localhostdigunakan untuk merujuk ke komputer Anda dari IP "internal", bukan dari IP "eksternal" komputer Anda. Jadi, paket ping tidak melewati antarmuka jaringan fisik apa pun; hanya melalui antarmuka loop kembali virtual yang langsung mengirim paket dari port ke port tanpa hop fisik.

Anda mungkin masih bertanya-tanya mengapa localhostini ::1diselesaikan, sementara secara tradisional kami mengharapkannya untuk menyelesaikan ke alamat IPv4 127.0.0.1. Catatan yang .localhostsecara tradisional TLD (lihat RFC 2606 ) yang menunjuk kembali ke alamat IP loop kembali (untuk IPv4, lihat RFC 3330 , terutama 127.0.0.0/8).

Mencari localhostmenggunakan nslookupmemberi kami:

nslookup localhost

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

Dengan demikian Windows lebih suka menggunakan alamat IP loop kembali IPv6 ::1(lihat RFC 2373 ) seperti yang terdaftar pertama.

Oke, jadi, dari mana asalnya, mari kita lihat file hosts.

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

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

Hmm, kita harus melihat pengaturan DNS Windows.

Artikel KB ini memberi tahu kami tentang pengaturan yang memengaruhi apa yang lebih disukai Windows, ditekankan dalam huruf tebal:

  1. Di Penyunting Registri, temukan dan kemudian klik subkunci registri berikut:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters
    
  2. Klik dua kali DisabledComponents untuk mengubah entri DisabledComponents.

    Catatan: Jika entri DisabledComponents tidak tersedia, Anda harus membuatnya. Untuk melakukan ini, ikuti langkah-langkah ini:

    1. Di menu Edit, arahkan ke Baru, lalu klik Nilai DWORD (32-bit).

    2. Ketik DisabledComponents, lalu tekan ENTER.

    3. Klik dua kali DisabledComponents.

  3. Ketik salah satu dari nilai berikut di bidang Data nilai: untuk mengonfigurasi protokol IPv6 ke kondisi yang diinginkan, lalu klik OK:

    • Ketik 0untuk mengaktifkan semua komponen IPv6. (Pengaturan standar Windows)
    • Ketik 0xffffffffuntuk menonaktifkan semua komponen IPv6, kecuali antarmuka loopback IPv6. Nilai ini juga mengonfigurasi Windows untuk memilih menggunakan Protokol Internet versi 4 (IPv4) daripada IPv6 dengan memodifikasi entri dalam tabel kebijakan awalan. Untuk informasi lebih lanjut, lihat Pemilihan Sumber dan Alamat Alamat.
    • Ketik 0x20untuk memilih IPv4 daripada IPv6 dengan memodifikasi entri dalam tabel kebijakan awalan.
    • Ketik 0x10untuk menonaktifkan IPv6 pada semua antarmuka nontunnel (pada antarmuka LAN dan protokol Point-to-Point [PPP]).
    • Ketik 0x01untuk menonaktifkan IPv6 di semua antarmuka terowongan. Ini termasuk Intra-Automatic Tunnel Addressing Protocol (ISATAP), 6to4, dan Teredo.
    • Ketik 0x11untuk menonaktifkan semua antarmuka IPv6 kecuali untuk antarmuka loopback IPv6.
  4. Nyalakan kembali komputer agar pengaturan ini diterapkan.

Apa tabel kebijakan awalan ini?

netsh interface ipv6 show prefixpolicies(atau prefixpolicypada versi sebelumnya)

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

Tabel ini memutuskan awalan apa yang didahulukan dari awalan lain selama DNS menyelesaikan.

Ah, jadi menggunakan KB itu kita bisa menambahkan entri di sini yang menunjukkan bahwa IPv4 memiliki prioritas lebih tinggi daripada IPv6.

Catatan: Tidak ada alasan untuk menimpa perilaku ini, kecuali jika Anda mengalami masalah yang kompatibel. Mengubah pengaturan ini pada Windows Server kami memecah server email kami, sehingga harus ditangani dengan hati-hati ...

Tamara Wijsman
sumber
Sebenarnya 'localhost' bukan domain tingkat atas, tetapi nama host. Perbedaannya sangat halus, tetapi pada dasarnya setiap nama domain adalah nama host, tetapi tidak semua nama host adalah nama domain. Secara konvensi, nama host yang diakhiri dengan ful stop haruslah FQDN, dan sebagian besar nama host yang tidak berakhir pada stop penuh dapat dikonversi ke FQDN dengan menambahkan domain induk, mundur kembali ke menambahkan root jika perlu. Namun, itu hanya konvensi. 'localhost' dicadangkan oleh RFC 2606, untuk mencegahnya menjadi TLD, karena sepertinya tidak berfungsi dengan benar, dan bahkan dapat menyebabkan masalah.
Kevin Cathcart
2
Salah, sebagaimana RFC 2606 menyebutkan: 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. Catat penggunaan TLDdan perhatikan yang secara tradisional didefinisikan . Bahkan, ping localhost.karya-karya yang menegaskan bahwa ini setidaknya benar dalam konteks pertanyaan ini. Kalimat terakhir Anda bukanlah yang dikatakan RFC, harap kutip jika kalimat itu "mencegahnya menjadi TLD" karena menurut apa yang dikatakannya itu adalah TLD tradisional. Lain mereka tidak akan merujukthe .localhost TLD
Tamara Wijsman
Saya agak terlalu kuat. localhostbisa menjadi TLD jika server DNS yang sebenarnya merespons, tetapi umumnya localhost secara umum didefinisikan sebagai nama host di / etc / hosts, di mana nama host dicari sebelum mencoba untuk menyelesaikan melalui DNS. Karena itu dig localhostbiasanya tidak mengembalikan catatan "A" untuk 127.0.0.1, atau catatan AAAA untuk :: 1. Itu berarti RFC salah ketika dikatakan traditionally been statically defined in host DNS implementations, tetapi lebih dikembalikan oleh layanan pencarian nama sistem, yang tidak selalu menggunakan DNS.
Kevin Cathcart
@KevinCathcart: Kami ada di pertanyaan Windows di sini, dan versi Windows menyebutkan ini dilakukan oleh DNS sendiri. nslookuptidak mengembalikan catatan. Jadi, YMMV ...
Tamara Wijsman
1
@KevinCathcart digpengembalian saya untuk A, AAAA, dan NS untuk localhost, termasuk catatan otoritas untuk:localhost. IN NS localhost.
KutuluMike
20

The antarmuka loopback ada secara independen dari antarmuka Ethernet Anda (s).

Bahkan tanpa komplikasi IPv6 Anda akan memiliki dua alamat berbeda.

Loopback alamat IPv4 : 127.0.0.1
Alamat IPv4 antarmuka Ethernet Anda: 192.168.0.10

Antarmuka loopback mungkin berada di lapisan perangkat lunak yang berbeda, lebih jauh dari perangkat keras nyata. Saya ragu itu tergantung dengan cara apa pun pada driver antarmuka Ethernet spesifik Anda misalnya.

RedGrittyBrick
sumber
11

Localhost dan alamat IP Anda bukan hal yang sama.

Localhost adalah perangkat lunak khusus yang hanya berisi Alamat IP, yang ditautkan ke sistem Anda. Localhost, atau 127.0.0.1, adalah alamat pengulangan. Selalu menunjuk ke sistem Anda, dan hanya dapat diakses dari komputer Anda. Routing ini terjadi pada level OS, dan pasti tidak pernah meninggalkan NIC ... Jadi tidak ada kesempatan untuk mencapai jaringan ....

Ping alamat IP Anda sendiri serupa tetapi berpotensi melibatkan seluruh tumpukan jaringan, karena perlu mendeteksi bahwa itu adalah alamat IP Anda, dan rutekan dengan benar ...

Efeknya harus sama, tetapi bisa ada perbedaan.

Misalnya, cabut kabel jaringan Anda. Ping alamat IP statis Anda. Anda mungkin tidak mendapatkan rute ke host, atau kesalahan lainnya. Sekarang ping localhost atau 127.0.0.1, dan itu akan berhasil.

Benjamin Schollnick
sumber
Jadi, ping localhost tidak berguna sama sekali? Maksud saya, jika saya ingin menguji antarmuka saya ....
Diogo
4
@DiogoRocha benar, ping localhost tidak pernah menyentuh perangkat keras. Heck ping 192.168.0.10 mungkin tidak memberikan Anda info yang andal juga jika driver kartu jaringan memotong permintaan yang diberikan kepada dirinya sendiri.
Scott Chamberlain
@DiogoRocha Terminologi Anda tidak aktif. 127.0.0.1 adalah antarmuka, tetapi antarmuka virtual.
barlop
@Diogo, Tidak cukup. Localhost memungkinkan Anda untuk menguji perilaku jaringan suatu aplikasi, atau memverifikasi bahwa tumpukan jaringan berfungsi .... Tapi itu tidak menguji driver. Jadi misalnya, jika Anda memiliki Driver NIC yang buruk, localhost mungkin dapat membantu membuktikan bahwa itu adalah driver yang bagus. Jarak tempuh Anda pasti akan berubah-ubah !!
Benjamin Schollnick
6

Saya menyadari dari tangkapan layar pertanyaan ini bukan tentang Linux, tetapi mungkin membuat "kasus yang tepat" berguna.

Pada OS itu, jika Anda melakukan ping ke salah satu alamat adaptor lokal Anda, itu diterjemahkan ke perangkat loopback (hack kasus khusus). Ini berarti bahwa paket-paket tersebut benar-benar masuk ke perangkat loopback (yang memiliki semua implikasi yang mungkin Anda pikirkan: misalnya dari sudut pandang firewall, paket-paket tersebut masuk pada antarmuka loopback dan akan cocok dengan aturan untuk antarmuka itu).

Perangkat tempat IP diberikan tidak akan pernah melihat paket. (Ini bagus karena tidak akan melakukan hal yang benar dengan paket-paket itu: ia ingin mengirim pengisap keluar.)

Namun, jika antarmuka yang berpendapat bahwa IP harusnya turun, Anda telah kehilangan koneksi itu. Pemetaan ke loopback akan berhenti berfungsi.

Jadi dengan kata lain, itu adalah desain yang bisa diterapkan untuk menganggap alamat lokal tersebut sebagai alias untuk perangkat loopback.

Referensi kode:

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

Lihatlah fungsinya ip_route_output_slow. Panggilan ini fib_lookup, dan jika fungsi ini mengembalikan kode RTN_LOCAL, dev_outditulis ulang ke loopback:

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

Kaz
sumber
4

Sepertinya alias "Localhost" sedang menyelesaikan loopback IPv6 dan ketika Anda secara eksplisit menggunakan alamat IPv4 jelas tidak.

EBGreen
sumber
6
OS tampaknya tidak setuju dengan Anda.
EBGreen
6
Tidak masalah, itu tampaknya diatur untuk komputer, localhost memukul loopback ipv6.
Rob
1
@DiogoRocha Tidak ada alamat seperti itu :: 1 di dunia IPV4. 127.0.0.1 adalah IP yang dicadangkan untuk loopback di sana. :: 1 Namun TIDAK ada untuk IPV6, dan seperti 127.0.0.1, dicadangkan untuk loopback IPV6.
Andy
4
Bagaimana ini menjawab pertanyaan? Anda hanya menyatakan yang sudah jelas.
Tamara Wijsman
4
Tolong jelaskan jawaban Anda, ini tidak benar-benar menjelaskan apa pun
Ivo Flipse
1

@ebwhite benar tentang apa.

Sekarang, mengapa mungkin Anda mengatur Teredo (saya tidak tahu dari tangkapan layar Anda, mengirimnya ke file teks dan menempelkan seluruh output lebih baik) - perilaku localhost menjadi IPv6 konsisten dengan sistem pada saya IPv4 hanya jaringan dengan teredo yang diinstal, tetapi sistem tanpanya berperilaku seperti yang Anda harapkan 127.0.0.1saat Anda melakukan ping localhost. Saya telah menguji ini dengan Windows XP dan perlu melihat apa yang dilakukan sistem Windows 7 saya dan memperbarui pertanyaan.

Umumnya, sistem default ke IPv6 jika IPv6 tersedia begitu, sistem Anda bekerja sebagaimana mestinya .

Journeyman Geek
sumber
dia tidak menerima Bytes atau TTL, dengan salah satu tangkapan layar, apakah itu IPv6? Mengapa?
barlop
juga sesuai dengan apa yang saya lihat di windows 7 - dugaan saya adalah waktu pulang pergi diabaikan
Journeyman Geek