Чому в IPv6-адресі є знак відсотка "%"?


125

Я використовую .NET Frameworkкласи, щоб отримати IP-адреси для своєї машини.

Dns.GetHostAddresses(Dns.GetHostName())

У мене є адаптер VirtualBox, який має адреси IPv4 та IPv6. Використовуючи код .NET, я отримую IPv6 адресу якfe80::71a3:2b00:ddd3:753f%16

Зверніть увагу на% 16 наприкінці?

Однак якщо я WMIзапитую те саме, використовуючи адресу , я отримую адресу як 'fe80 :: 71a3: 2b00: ddd3: 753f'

Отже, чи має% 16 якесь особливе значення?

Редагувати:

Я просто мав ще кілька спостережень з цього приводу. І вони дуже добре співпадають з тим, що сказав Стівен Дженнінгс у своїй відповіді.

Я встановив Vmware, щоб побачити, яку IPv6 адресу він видав. Адреси були: fe80 :: 3dd0: 7f8e: 57b7: 34d5% 19

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

Зрозуміло, що цифри після% не є певним шестигранним поданням. Я перевірив усі властивості мережевого адаптера за допомогою Wmi і виявив, що номери точно такі, як властивість InterfaceIndex кожного мережного адаптера. Відповідно до MSDN , він однозначно ідентифікує кожен мережевий адаптер, і ця властивість була представлена ​​у Vista.

Що все-таки мене бентежило, чому клас IPAddress дозволить вам створити ip-адресу в такому форматі, якщо вона не була дійсною. Відповідь надав Стівен. Номер - ідентифікатор області. IPAddress має конструктор, який приймає адресу AND ідентифікатор області.

О, і всі ці три мережеві адаптери були локальними посиланнями. Підтвердили це через ipconfig

Класно. Це було цікаво !!


2
Я не мав уявлення, що це було, перш ніж ти запитав. Я дізнався щось акуратне про IPv6 і сьогодні (які дурниці ми).
Стівен Дженнінгс

@Stephen, ви раніше працювали з ipv6? Мене здивувало, що ти швидко це прибив. Я довго гугла, перш ніж розміщувати це питання. Хороша робота!
Аміт Джордж

Пошук "відсотків адреси ipv6" отримав мені ім'я, яке мені потрібно, і звідси пошук та намагання зрозуміти заплутану технічну документацію зайняли найбільше часу. Я розумію, що IPv6 намагається здійснити, але є багато нових концепцій, які я ще не довів до дослідження та розуміння. Це було одне, і ніщо не дає тобі краще розуміння, ніж намагатися пояснити комусь іншому.
Стівен Дженнінгс

Альтернативними позначеннями можуть бути fe80:10( 0x0010істота 16). Я використовую це у своєму браузері під час роботи з локальними IPv6 адресами посилань, але я не на 100% впевнений, що це відповідає стандартам. (Використання відсотків у URL-адресах безладно в браузерах; адже я взагалі не міг змусити це працювати.)
Arjan

Відповіді:


134

Число після "%" - це ідентифікатор області.

IPv6 визначає щонайменше три сфери доступності для адрес:

  1. Глобально адресований. Це IPv6-адреса, яку вам надав ваш Інтернет-провайдер. Він доступний для використання в загальнодоступному Інтернеті.

  2. Посилання-локальне. Це схоже на діапазон 169.254.XX. Це адреса, яку комп'ютер призначає собі, щоб полегшити місцевий зв'язок. Ці адреси не надходять у загальнодоступний Інтернет, оскільки вони не є унікальними в усьому світі.

  3. Вузол-локальний. Це адреса, яка ідентифікує локальний інтерфейс, подібно до 127.0.0.1. В основному, це адреса :: 1.

Microsoft опублікувала цю статтю, в якій описує IPv6 адресацію , що є найменш заплутаною статтею, яку я знайшов. У статті вказується, що наявність ідентифікатора сфери у вашій адресі означає, що це локальна адреса посилання . Ви також можете сказати, що це локальне посилання, оскільки адреса починається з fe80.

Ясна, просто зрозуміла інформація на цю тему здається рідкісною, тому решту цього я складаю на основі мого найкращого розуміння RFC 4007 та іншої інформації там.

Комп'ютер може мати декілька локальних адрес, кожен з яких має різну область застосування. Ідентифікатор області вказує, для якої області використовується адреса. Наприклад, уявіть собі сценарій комп'ютера з двома НІК, кожен з яких має локальну адресу в різних мережах. Якщо ви спробуєте надіслати щось на іншу адресу, починаючи з fe80, як комп'ютер дізнається, на який NIC надсилати? Ідентифікатор області виглядає як рішення для цього.


Дякую! Відредагував моє запитання, щоб додати зайві речі, які я випадково спостерігав під час очікування відповіді. І коли я прийшов опублікувати їх, я здивувався, побачивши вашу відповідь, що підтверджує спостереження :)
Аміт Джордж

Гарна відповідь. Дозвольте мені побачити, чи я це повністю зрозумів. Таким чином, пристрій з двома NIC може підключитися до двох різних маршрутизаторів і отримати йому таку саму DHCP-адресу fe80::42. Також маршрутизатори мають однакову адресу fe80::1. Тепер це fe80::1%Xможе бути використано для розмежування маршрутизаторів, але fe80::42%Xце малокорисне для клієнта, правда?
користувач123444555621

2
@ Pumbaa80 Клієнт надсилає повідомлення, щоб fe80::1%1дістатися до маршрутизатора, підключеного до NIC №1, і він надсилатиме повідомлення, fe80::1%2щоб дістатися до маршрутизатора, підключеного до NIC №2. На відміну від цього, локальні адреси налаштовуються автоматично головним комп'ютером, а не через DHCP, тому він, ймовірно, не призначив би двом NIC однакову IP-адресу. Також пам’ятайте, що локальні адреси посилань не є маршрутизованими, тому зазвичай ви не будете надсилати повідомлення маршрутизатору, ви будете надсилати повідомлення між двома хостами.
Стівен Дженнінгс

експериментальним шляхом, здається , тягнеться %nnможе бути опущений , принаймні , деяких команд, наприклад ping, tracert.
matt wilkie

Дуже гарна відповідь. Зауважимо лише, що ідентифікатор області нуля є спеціальним, і, схоже, вказує на те, що алгоритм конкретного впровадження вибирає ідентифікатор області зі списку інтерфейсів із цією областю цього IP.
Арран Кадбард-Белл

21

Адреси IPv6 з префіксом fe80 :: / 64 - це локальні адреси посилань, які будуються комбінуванням цього префіксу з апаратною адресою мережевого пристрою, 71a3: 2b00: ddd3: 753f у вашому прикладі. (Аналог в IPv4 дорівнює 169.254.0.0/16.) Оскільки префікс однаковий для всіх локальних адрес на машині, маршрутизації іноді може знадобитися знати, на який інтерфейс ви посилаєтесь. І саме це визначає число після відсотків, яке називається індексом зони. Особливості залежать від операційної системи: в Windows - %16це інтерфейс № 16; наприклад, у Linux ви можете побачити щось подібне %eth0.

Деякі інструменти або API вважають цей індекс зони неважливим або неявним у своїх цілях. Наприклад, в Linux ifconfigінструмент не показує його, оскільки очевидно, до якого інтерфейсу належить адреса. Але загалом це слід враховувати.


18

Символи після% (які у вашому прикладі бувають числами) є ідентифікатором інтерфейсу. Ці символи використовуються для ідентифікації "мережевого інтерфейсу", який люди часто називають "мережевою картою". Наприклад, це може допомогти визначити, чи буде пакет використовувати провідну карту Ethernet або бездротовий адаптер Wi-Fi.

Я здогадуюсь, що ви використовуєте Microsoft Windows. Він використовує числа як ідентифікатори інтерфейсу.

Як порівняння, Unix-подібні системи можуть використовувати літери після знаку%. наприклад:fe80::71a3:2b00:ddd3:753f%eth0

У цьому випадку ідентифікатор інтерфейсу eth0, відповідає назві мережевої карти.

У Microsoft Windows можна отримати список ідентифікаторів (числових) інтерфейсів, скориставшись одним із командних рядків, що перевіряють таблицю маршрутизації. Я віддаю перевагу " netstat -nr", оскільки це працює і в інших операційних системах, але Microsoft Windows також підтримує " route print". Отриманий результат, про який повідомляється, швидше за все, буде довгий на екрані, тому будьте готові прокручуватися назад, якщо ви не підключите більше.

наприклад, у моїй системі:

=========================================================================== 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 ===========================================================================

У такому випадку така адреса, як fe80 :: 71a3: 2b00: ddd3: 753f% 14, стосується мого сімейного контролера Realtek PCIe GBE. "GBE" посилається на Gigabit Ethernet.

Тепер ось складна частина: Якщо ви хочете ввести пінг у віддалену адресу, можливо, вам доведеться використовувати IPv6 адресу віддаленої системи, але ідентифікатор інтерфейсу локальної системи. Так, наприклад, якщо я використовую комп'ютер A і у мене локальна IPv6 адреса fe80 :: 1, приєднана до інтерфейсу № 14, і я хочу пінг-комп’ютер B, і до нього приєднано локальну IPv6-адресу fe80 :: 2 його інтерфейс номер 16, то я б це використав:

ping fe80::2%14

Таким чином pingкоманда відправить пакет ICMPv6 на віддалену адресу IPv6 (fd80 :: 2), яка належить до віддаленого комп'ютера, і буде використовувати для цього інтерфейс з ідентифікатором 14. Ідентифікатор інтерфейсу 14 - це номер системи, яку я використовую, а не віддаленої системи.

Тепер давайте розберемося, чому це може знадобитися.

Якщо я хочу ввести адресу IPv6 Google (яка на момент написання цієї відповіді - 2607: f8b0: 400a: 802 :: 200e), тоді таблиця маршрутизації перевірить, яка мережна карта обробляє адреси, які починаються з 2607: f8b0: 400a: 802. У таблиці маршрутизації буде вказано, що жодна з моїх мережевих карт не підключена безпосередньо до мережі за допомогою адрес, які починаються з 2607: f8b0: 400a: 802, тому мій комп'ютер в кінцевому підсумку використовує адресу "шлюзу". Якщо я підключався до іншої мережі, яка є частиною організації, над якою я працюю, у мене може бути спеціальна адреса "шлюзу", яка спрямовує трафік до приватної мережі. У цьому випадку у мене немає більш конкретного шлюзу, тому я буду використовувати IPv6 "шлюз за замовчуванням". Ось як працює IPv6 більшу частину часу, за винятком локальних адрес посилань. Це також, як IPv4 працював більшу частину часу.

Згідно з розділом 2.8 RFC 4291 , кожен комп'ютер, що використовує IPv6, повинен призначити локальну адресу для кожного мережевого інтерфейсу. Розділ 2.5.6 RFC 4291 показує біти, з яких повинні починатися локальні адреси, які змушують локальні адреси починатися з "fe80: 0000: 0000: 0000:" (хоча багато з цих нулів згортаються до подвійної двокрапки ). Те, що ці адреси починаються з "fe80:", також описано у розділі 2.4 RFC 4291 .

Якщо ви намагаєтеся пінгувати віддалену систему (наприклад, "2607: f8b0: 400a: 802"), загальним процесом є звичайно з'ясувати мережу або підмережу, до якої належить адреса, що робиться, переглядаючи біти. на початку адреси. Потім ці біти використовуються для визначення маршруту руху.

Однак цей процес не працює для локальної адреси IPv6, оскільки кожен окремий (оперативний, активний) мережевий інтерфейс має локальну адресу, що починається з "fe80:" у підмережі, використовуючи префікс підрозетки / розмір "/ 64 ". Якщо ви перебуваєте на ноутбуці, ви, ймовірно, виявите, що як на вашій Ethernet-картці, так і на адаптері Wi-Fi очікується така IPv6-адреса.

Тепер, коли ви відправляєте свій ping на fe80 :: 2, ви хочете, щоб ваш комп'ютер надіслав цей пакет із потрібної мережевої карти. Якщо у вас принтер, підключений до дротової мережі, ви не хочете відправляти трафік на свою Wi-Fi карту, використовуючи мережевий шлях / маршрут, що не призведе до того, що трафік потрапить на принтер. І якщо ви намагаєтеся зв’язатися з бездротовим пристроєм за допомогою своєї Wi-Fi-картки, ви не хочете, щоб ваш трафік виходив з Ethernet-карти.

Рішення полягає в тому, щоб ви вказали, на якому мережному пристрої ви хочете використовувати трафік. Отже, саме така мета ідентифікатора мережі.


2
Гаразд, перечитавши відповідь Пітера Ейзентраута , здається, що його технічно правильно. Сподіваюсь, мої деталі надають ще ясності. Я не погоджуюся з відповіддю Стівена Дженнінгса , оскільки ця відповідь робить його схожим на те, що "ідентифікатор області" ідентифікує "локальний зв'язок" як область застосування. Однак два різних мережевих інтерфейсу можуть бути "локальними ланцюжками", але вони не використовуватимуть однакову "область" (відповідно до прикладів, наведених у його нумерованому списку). Натомість я кажу, що ці цифри ідентифікують мережевий "інтерфейс".
TOOGAM
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.