Mengapa ada tanda persen '%' di alamat IPv6?

125

Saya menggunakan .NET Frameworkkelas untuk mendapatkan alamat IP untuk mesin saya.

Dns.GetHostAddresses(Dns.GetHostName())

Saya memiliki adaptor VirtualBox yang memiliki alamat IPv4 dan IPv6. Menggunakan kode .NET saya mendapatkan alamat IPv6 sebagaife80::71a3:2b00:ddd3:753f%16

Perhatikan% 16 di bagian akhir?

Namun, jika saya meminta penggunaan yang sama WMI, saya mendapatkan alamat sebagai 'fe80 :: 71a3: 2b00: ddd3: 753f'

Jadi, apakah% 16 memiliki makna khusus?

Sunting:

Saya hanya memiliki beberapa pengamatan tentang ini. Dan mereka sangat cocok dengan apa yang dikatakan Stephen Jennings dalam jawabannya.

Saya menginstal Vmware untuk melihat alamat IPv6 yang dikeluarkannya. Alamatnya adalah: fe80 :: 3dd0: 7f8e: 57b7: 34d5% 19

fe80 :: b059: 65f4: e877: c40% 20

Jelas, angka-angka setelah% bukan merupakan representasi hex. Saya memeriksa semua properti yang tersedia untuk adaptor jaringan menggunakan Wmi dan menemukan bahwa jumlahnya persis sama dengan properti InterfaceIndex dari setiap adapter jaringan. Sesuai MSDN , ini secara unik mengidentifikasi setiap adapter jaringan dan properti ini diperkenalkan di Vista.

Yang masih membingungkan saya adalah mengapa kelas IPAddress memungkinkan Anda untuk membuat alamat ip dalam format itu kecuali itu valid. Jawabannya diberikan oleh Stephen. Angka tersebut adalah id lingkup. IPAddress memiliki konstruktor yang menerima alamat DAN id ruang lingkup.

Oh, dan ketiga adapter jaringan ini adalah tautan lokal. Konfirmasikan melalui ipconfig

Keren. Itu menarik !!

Amith George
sumber
2
Saya tidak tahu apa itu sebelum Anda bertanya. Saya belajar sesuatu yang rapi tentang IPv6 hari ini juga (kutu buku apa kita).
Stephen Jennings
@Stephen, jadi apakah Anda pernah bekerja dengan ipv6 sebelumnya? Saya menduga dengan cepat Anda berhasil. Saya telah googled untuk beberapa waktu sebelum memposting pertanyaan di sini. Kerja bagus!
Amith George
Pencarian "persen alamat ipv6" membuat saya mendapatkan nama yang saya butuhkan, dan dari sana mencari-cari dan mencoba memahami dokumentasi teknis yang membingungkan membutuhkan waktu paling lama. Saya mendapatkan apa yang IPv6 coba capai, tetapi ada banyak konsep baru yang belum saya pelajari dan pahami. Ini adalah satu, dan tidak ada yang memberi Anda pemahaman yang lebih baik daripada mencoba menjelaskan kepada orang lain.
Stephen Jennings
Notasi alternatif mungkin fe80:10( 0x0010makhluk 16). Saya menggunakannya di browser saya ketika bekerja dengan alamat IPv6 link-lokal, tetapi saya tidak 100% yakin ini sesuai dengan standar. (Menggunakan persen dalam URL berantakan di peramban; pada kenyataannya saya tidak bisa menggunakannya sama sekali.)
Arjan

Jawaban:

134

Angka setelah '%' adalah ID lingkup.

IPv6 mendefinisikan setidaknya tiga cakupan jangkauan untuk alamat:

  1. Dialamatkan secara global. Ini adalah alamat IPv6 yang diberikan kepada Anda oleh ISP Anda. Ini tersedia untuk digunakan di Internet publik.

  2. Tautan-lokal. Ini mirip dengan kisaran 169.254.XX. Ini adalah alamat yang ditetapkan oleh komputer untuk memfasilitasi komunikasi lokal. Alamat-alamat ini tidak diarahkan di Internet publik karena mereka tidak unik secara global.

  3. Node-lokal. Ini adalah alamat yang mengidentifikasi antarmuka lokal, mirip dengan 127.0.0.1. Pada dasarnya, ini adalah alamat :: 1.

Microsoft telah menerbitkan artikel ini yang menjelaskan pengalamatan IPv6 , yang merupakan artikel paling membingungkan yang saya temukan. Artikel menunjukkan bahwa keberadaan ID lingkup di alamat Anda berarti itu adalah alamat tautan-lokal . Anda juga dapat mengatakan itu adalah tautan-lokal karena alamat dimulai dengan fe80.

Informasi yang jelas dan mudah dipahami tentang topik ini tampaknya jarang, jadi saya menyatukan sisanya berdasarkan pemahaman terbaik saya tentang RFC 4007 dan informasi lain di luar sana.

Komputer dapat memiliki beberapa alamat tautan-lokal, masing-masing dengan cakupan yang berbeda. ID lingkup menunjukkan lingkup untuk alamat mana. Misalnya, bayangkan skenario komputer dengan dua NIC, masing-masing dengan alamat tautan-lokal pada jaringan yang berbeda. Jika Anda mencoba mengirim sesuatu ke alamat lain yang dimulai dengan fe80, bagaimana komputer tahu NIC mana yang akan dikirim? ID lingkup tampaknya menjadi solusi untuk ini.

Stephen Jennings
sumber
Terima kasih! Mengedit pertanyaan saya untuk menambahkan hal-hal tambahan yang kebetulan saya amati sambil menunggu jawaban. Dan ketika saya datang untuk mempostingnya, saya terkejut melihat jawaban Anda mengkonfirmasikan pengamatan :)
Amith George
Jawaban bagus. Biarkan saya melihat apakah saya sepenuhnya mengerti itu. Jadi perangkat dengan dua NIC dapat terhubung ke dua router yang berbeda, dan ditugaskan alamat DHCP yang sama fe80::42. Juga, router memiliki alamat yang sama fe80::1. Sekarang fe80::1%Xini dapat digunakan untuk membedakan antara router, tetapi fe80::42%Xapakah ini berguna untuk klien, bukan?
user123444555621
2
@ Pumbaa80 Klien akan mengirim pesan ke fe80::1%1untuk mencapai router yang terhubung ke NIC # 1, dan itu akan mengirim pesan ke fe80::1%2untuk mencapai router yang terhubung ke NIC # 2. Selain itu, alamat Tautan-lokal dikonfigurasikan secara otomatis oleh komputer host, bukan melalui DHCP, jadi mungkin tidak akan menetapkan dua NIC-nya IP yang sama. Ingat juga bahwa alamat tautan-lokal tidak dapat dirutekan, jadi biasanya Anda tidak akan mengirim pesan ke router, Anda akan mengirim pesan di antara dua host.
Stephen Jennings
oleh eksperimen, tampaknya trailing %nndapat dihilangkan untuk setidaknya beberapa perintah, misalnya ping, tracert.
matt wilkie
Jawaban yang sangat bagus Hanya untuk menyebutkan bahwa ID lingkup adalah nol adalah khusus, dan tampaknya menunjukkan bahwa algoritma implementasi khusus untuk memilih ID lingkup dari daftar antarmuka dengan lingkup IP tersebut.
Arran Cudbard-Bell
21

Alamat IPv6 dengan awalan fe80 :: / 64 adalah alamat tautan-lokal yang dibangun dengan menggabungkan awalan itu dengan alamat perangkat keras dari perangkat jaringan, 71a3: 2b00: ddd3: 753f dalam contoh Anda. (Analog dalam IPv4 adalah 169.254.0.0/16.) Karena awalannya sama untuk semua alamat tautan-lokal pada mesin, perutean kadang-kadang mungkin perlu mengetahui antarmuka mana yang Anda maksud. Dan itulah yang ditentukan oleh angka setelah persen, yang disebut indeks zona. Spesifik tergantung pada sistem operasi: Pada Windows, %16adalah antarmuka nomor 16; di Linux misalnya Anda mungkin melihat sesuatu seperti %eth0.

Beberapa alat atau API akan menganggap indeks zona ini tidak penting atau tersirat untuk tujuan mereka. Misalnya, di Linux ifconfigalat tidak menunjukkannya karena jelas antarmuka mana yang dimiliki oleh alamat. Tetapi secara umum harus diperhitungkan.

Peter Eisentraut
sumber
18

Karakter setelah% (yang merupakan angka dalam contoh Anda) adalah Pengenal Antarmuka. Karakter-karakter itu digunakan untuk mengidentifikasi "antarmuka jaringan", yang sering orang sebut "kartu jaringan". Misalnya, ini dapat membantu untuk menentukan apakah suatu paket akan menggunakan kartu Ethernet berkabel atau adaptor Wi-Fi nirkabel.

Saya menduga Anda menggunakan Microsoft Windows. Menggunakan angka sebagai pengidentifikasi antarmuka.

Sebagai perbandingan, sistem Unix-like dapat menggunakan huruf setelah tanda%. misalnya:fe80::71a3:2b00:ddd3:753f%eth0

Dalam hal itu, pengidentifikasi Antarmuka eth0,, cocok dengan nama kartu jaringan.

Di Microsoft Windows, Anda bisa mendapatkan daftar pengidentifikasi antarmuka (numerik) dengan menggunakan salah satu baris perintah yang memeriksa tabel routing. Saya lebih suka " netstat -nr" karena itu juga bekerja pada sistem operasi lain, tetapi Microsoft Windows juga mendukung " route print". Output yang dihasilkan, yang akan dilaporkan, kemungkinan akan lebih dari satu layar, jadi bersiaplah untuk menggulir kembali, kecuali jika Anda mengirim lebih banyak.

misalnya di sistem saya:

=========================================================================== Interface List 14...5c f9 dd 6d 98 b8 ......Realtek PCIe GBE Family Controller 12...e0 06 e6 7e fc 4e ......Bluetooth Device (Personal Area Network) 1...........................Software Loopback Interface 1 13...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter 15...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #2 ===========================================================================

Dalam hal ini, alamat seperti fe80 :: 71a3: 2b00: ddd3: 753f% 14 akan merujuk ke Realtek PCIe GBE Family Controller saya. "GBE" mengacu pada Gigabit Ethernet.

Sekarang, inilah bagian yang sulit: Jika Anda ingin melakukan ping alamat jarak jauh, Anda mungkin perlu menggunakan alamat IPv6 sistem jarak jauh, tetapi Interface Identifier sistem lokal. Jadi, misalnya, jika saya menggunakan Komputer A dan saya memiliki alamat IPv6 lokal fe80 :: 1 terlampir ke nomor Antarmuka 14, dan saya ingin melakukan ping Komputer B dan memiliki alamat IPv6 lokal fe80 :: 2 dilampirkan ke Antarmukanya nomor 16, maka ini yang akan saya gunakan:

ping fe80::2%14

Jadi pingperintah tersebut akan mengirim paket ICMPv6 ke alamat IPv6 jarak jauh (fd80 :: 2), yang merupakan milik komputer jarak jauh, dan akan menggunakan Interface dengan Identifier 14 untuk melakukannya. Interface Identifier 14 adalah angka dari sistem yang saya gunakan, bukan sistem jarak jauh.

Sekarang, mari kita lihat mengapa ini mungkin perlu.

Jika saya ingin melakukan ping ke alamat IPv6 Google (yaitu 2607: f8b0: 400a: 802 :: 200e pada saat saya menulis jawaban ini), maka tabel routing akan memeriksa kartu jaringan yang menangani alamat yang dimulai dengan 2607: f8b0: 400a: 802. Tabel perutean akan menunjukkan bahwa tidak ada kartu jaringan saya yang terhubung langsung ke jaringan menggunakan alamat yang dimulai dengan 2607: f8b0: 400a: 802, sehingga komputer saya akan berakhir menggunakan alamat "gateway". Jika saya terhubung ke jaringan lain yang merupakan bagian dari organisasi tempat saya bekerja, saya mungkin memiliki alamat "gateway" khusus yang merutekan lalu lintas ke jaringan pribadi. Dalam hal ini, saya tidak memiliki gateway yang lebih spesifik, jadi saya akan menggunakan "gateway default" IPv6. Itulah cara IPv6 bekerja sebagian besar waktu, kecuali untuk alamat tautan-lokal. Ini juga cara IPv4 bekerja sebagian besar waktu.

Menurut RFC 4291 bagian 2.8 , setiap komputer yang menggunakan IPv6 harus menetapkan alamat tautan-lokal untuk setiap antarmuka jaringan. RFC 4291 bagian 2.5.6 menunjukkan bit-bit yang harus diawali dengan tautan-alamat lokal, yang menyebabkan alamat tautan-lokal dimulai dengan "fe80: 0000: 0000: 0000:" (walaupun banyak dari nol tersebut dapat diciutkan menjadi dua titik) ). Fakta bahwa alamat-alamat itu dimulai dengan "fe80:" juga dijelaskan oleh RFC 4291 bagian 2.4 .

Jika Anda mencoba melakukan ping ke sistem jarak jauh (misalnya, "2607: f8b0: 400a: 802"), proses umum biasanya untuk mengetahui jaringan atau subnet yang alamatnya merupakan bagian dari, yang dilakukan dengan melihat bit di awal alamat. Kemudian, bit-bit itu digunakan untuk menentukan bagaimana mengarahkan lalu lintas.

Namun, proses itu tidak berfungsi untuk alamat tautan-lokal IPv6, karena setiap antarmuka jaringan (operasional, aktif) memiliki alamat tautan-lokal yang dimulai dengan "fe80:" pada subnet menggunakan awalan subnet / ukuran "/ 64 ". Jika Anda menggunakan laptop, Anda mungkin menemukan bahwa kartu Ethernet dan adaptor Wi-Fi Anda diharapkan memiliki alamat IPv6.

Sekarang, ketika Anda mengirim ping ke fe80 :: 2, Anda ingin komputer Anda mengirim paket itu ke kartu jaringan yang tepat. Jika Anda memiliki printer yang terhubung ke jaringan kabel, Anda tidak ingin mengirim lalu lintas keluar kartu Wi-Fi Anda, menggunakan jalur jaringan / rute yang tidak akan menghasilkan lalu lintas menuju ke printer. Dan jika Anda mencoba berkomunikasi dengan perangkat nirkabel menggunakan kartu Wi-Fi Anda, Anda tidak ingin lalu lintas keluar dari kartu Ethernet.

Solusinya adalah meminta Anda menentukan perangkat jaringan yang Anda inginkan lalu lintas untuk digunakan. Jadi, itulah tujuan dari pengidentifikasi jaringan.

TOOGAM
sumber
2
Oke, setelah membaca kembali jawaban Peter Eisentraut , sepertinya jawabannya secara teknis benar. Semoga detail saya memberikan lebih banyak kejelasan. Saya tidak setuju dengan jawaban Stephen Jennings , karena jawaban itu membuatnya tampak seperti "ID lingkup" mengidentifikasi "tautan lokal" sebagai cakupan. Namun, dua antarmuka jaringan yang berbeda keduanya bisa menjadi "tautan lokal" tetapi mereka tidak akan menggunakan "ruang lingkup" yang sama (per contoh yang ditunjukkan dalam daftar bernomornya). Sebagai gantinya, saya katakan angka-angka itu mengidentifikasi "antarmuka" jaringan.
TOOGAM