Вопрос: Почему в IPv6-адресе есть знак процента «%»?


Я использую .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 имеет конструктор, который принимает адрес И идентификатор области.

О, и все эти три сетевых адаптера были связаны локально. Подтверждено это через ipconfig

Круто. Это было интересно!


109
2018-01-23 21:42


Источник


Я понятия не имел, что это было до того, как вы спросили. Я тоже кое-что узнал о IPv6 (какие у нас есть кретины). - Stephen Jennings
@Stephen, так вы уже работали с ipv6? Я быстро схватился за то, что вы прибили его. Я довольно долго занимался поиском в Интернете, прежде чем публиковать этот вопрос. Хорошая работа! - Amith George
Поиск «ipv6 address percent» дал мне имя, которое мне было нужно, и оттуда поиск и попытка понять запутанную техническую документацию заняли больше всего времени. Я получаю то, что пытается выполнить IPv6, но есть много новых концепций, которые у меня есть, которые я не получил, чтобы исследовать и понимать. Это было одно, и ничто не дает вам лучшего понимания, чем пытаться объяснить кому-то другому. - Stephen Jennings
Альтернативная нотация может быть fe80:10 ( 0x0010 16). Я использую это в моем браузере при работе с локальными IPv6-адресами ссылок, но я не уверен на 100%, что это соответствует стандартам. (Использование процентов в URL-адресах бесполезно в браузерах, на самом деле я не мог заставить это работать вообще). - Arjan


Ответы:


Число после «%» - это идентификатор области.

IPv6 определяет по крайней мере три области охвата достижимости для адресов:

  1. В глобальном масштабе. Это адрес IPv6, предоставленный вашим провайдером. Он доступен для использования в общедоступном Интернете.

  2. Link-местные. Это похоже на диапазон 169.254.X.X. Это адрес, который компьютер присваивает себе, чтобы облегчить локальные коммуникации. Эти адреса не распространяются в общедоступном Интернете, потому что они не являются глобально уникальными.

  3. Узел-местный. Это адрес, который идентифицирует локальный интерфейс, аналогичный 127.0.0.1. В принципе, это адрес :: 1.

Microsoft опубликовала эту статью, описывающую адресацию IPv6, который является наименее запутанной статьей, которую я нашел. В статье указано, что наличие идентификатора области в вашем адресе означает, что это link-local address, Вы также можете сказать, что это ссылка-локальная, потому что адрес начинается с fe80,

Ясная, понятная информация по этой теме кажется редкой, поэтому я собираю все это вместе, основываясь на моем лучшем понимании RFC 4007 и другая информация там.

Компьютер может иметь несколько локальных локальных адресов, каждый из которых имеет разную область. Идентификатор области указывает, для какой области предназначен адрес. Например, представьте себе сценарий компьютера с двумя сетевыми адаптерами, каждый из которых имеет локальный адрес связи в разных сетях. Если вы попытаетесь отправить что-то на другой адрес, начинающийся с fe80, как компьютер узнает, какой сетевой адаптер отправит? Идентификатор области видимости является для этого решением.


117
2018-01-23 22:26



Благодаря! Отредактировал мой вопрос, чтобы добавить дополнительный материал, который я наблюдал, ожидая ответа. И когда я пришел, чтобы опубликовать их, я был удивлен, увидев ваш ответ, подтверждающий наблюдения :) - Amith George
Хороший ответ. Позвольте мне понять, полностью ли я это понял. Таким образом, устройство с двумя сетевыми адаптерами может подключаться к двум различным маршрутизаторам и назначать один и тот же адрес DHCP fe80::42, Кроме того, маршрутизаторы имеют одинаковый адрес fe80::1, Сейчас fe80::1%X могут использоваться для разграничения между маршрутизаторами, но fe80::42%X мало используется клиенту, не так ли? - user123444555621
@ Pumbaa80 Клиент отправит сообщения в fe80::1%1 для доступа к маршрутизатору, подключенному к NIC # 1, и он отправит сообщения в fe80::1%2 для доступа к маршрутизатору, подключенному к NIC # 2. В качестве сторонних локальных адресов Link-local автоматически настраиваются хост-компьютером, а не через DHCP, поэтому он, вероятно, не будет назначать своим двум сетевым адаптерам тот же IP-адрес. Также имейте в виду, что локальные адреса ссылок не маршрутизируются, поэтому обычно вы не будете отправлять сообщения на маршрутизатор, вы будете отправлять сообщения между двумя хостами. - Stephen Jennings
по экспериментам, кажется, %nn могут быть опущены для, по меньшей мере, некоторых команд, например. ping, tracert, - matt wilkie
Очень хороший ответ. Просто упомянуть, что идентификатор области равен нулю, является особенным и, похоже, указывает, что конкретный алгоритм реализации выбирает идентификатор области видимости из списка интерфейсов с этой областью этого IP-адреса. - Arran Cudbard-Bell


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

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


17
2018-01-23 23:30





Символами после% (которые являются номерами в вашем примере) являются Идентификатор интерфейса. Эти символы используются для идентификации «сетевого интерфейса», который люди часто называют «сетевой картой». Например, это может помочь определить, будет ли пакет использовать проводную карту 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.

Теперь вот сложная часть: если вы хотите выполнить ping удаленный адрес, вам может потребоваться использовать IPv6-адрес удаленной системы, но идентификатор интерфейса локальной системы. Например, если я использую компьютер A, и у меня есть локальный IPv6-адрес fe80 :: 1, подключенный к интерфейсу номер 14, и я хочу выполнить ping компьютер B и он имеет локальный IPv6-адрес fe80 :: 2, прикрепленный к его интерфейс номер 16, то это то, что я буду использовать:

ping fe80::2%14

Итак ping команда отправит пакет ICMPv6 на удаленный IPv6-адрес (fd80 :: 2), который принадлежит удаленному компьютеру, и будет использовать интерфейс с идентификатором 14 для этого. Идентификатор интерфейса 14 - это номер из системы, которую я использую, а не удаленная система.

Теперь давайте посмотрим, почему это может быть необходимо.

Если я хочу, чтобы ping адрес IPv6 Google (который был 2607: f8b0: 400a: 802 :: 200e в то время, когда я написал этот ответ), тогда таблица маршрутизации проверит, какая сетевая карта обрабатывает адреса, начинающиеся с 2607: f8b0: 400a: 802. В таблице маршрутизации указывается, что ни одна из моих сетевых карт не подключена напрямую к сети с использованием адресов, начинающихся с 2607: f8b0: 400a: 802, поэтому мой компьютер в конечном итоге будет использовать адрес «шлюза». Если я подключался к другой сети, входящей в состав организации, над которой я работаю, у меня может быть специальный адрес «шлюза», который направляет трафик в частную сеть. В этом случае у меня нет более конкретного шлюза, поэтому я буду использовать IPv6 «шлюз по умолчанию». Так работает IPv6 большую часть времени, за исключением локальных локальных адресов. Это также то, как IPv4 работал большую часть времени. (Я упростил этот пример, предположив, что размер подсети IPv6 равен 64, поскольку описание всего процесса сделало бы это описание еще более длинным.)

В соответствии с RFC 4291 раздел 2.8, каждый компьютер, использующий IPv6, должен назначать локальный адрес связи для каждого сетевого интерфейса. Раздел 2.5.6 RFC 4291 показывает биты, с которых должны начинаться локальные локальные адреса, что приводит к тому, что локальные адреса ссылок начинаются с «fe80: 0000: 0000: 0000:» (хотя многие из этих нулей обрушиваются на двойной двоеточие). Тот факт, что эти адреса начинаются с «fe80:», также описывается RFC 4291 раздел 2.4,

Если вы попытаетесь выполнить ping удаленную систему (например, «2607: f8b0: 400a: 802»), общий процесс обычно заключается в определении сети или подсети, частью которой является адрес, что делается путем просмотра битов в начале адреса. Затем эти биты используются для определения способа маршрутизации трафика.

Однако этот процесс не работает для локального адреса канала IPv6, поскольку каждый отдельный (оперативный, активный) сетевой интерфейс имеет локальный адрес связи, начиная с «fe80:» в подсети, используя префикс / размер подсети / 64" . Если вы находитесь на ноутбуке, вы, скорее всего, обнаружите, что и ваша карта Ethernet, и ваш адаптер Wi-Fi должны иметь такой адрес IPv6.

Теперь, когда вы отправляете свой пинг на fe80 :: 2, вы хотите, чтобы ваш компьютер отправил этот пакет из нужной сетевой карты. Если у вас есть принтер, подключенный к проводной сети, вы не хотите отправлять трафик на свою карту Wi-Fi, используя сетевой маршрут / маршрут, который не приведет к попаданию трафика на принтер. И если вы пытаетесь связаться с беспроводным устройством, используя карту Wi-Fi, вы не хотите, чтобы ваш трафик выходил из карты Ethernet.

Решение заключается в том, чтобы указать, какое сетевое устройство вы хотите использовать для трафика. Таким образом, это цель сетевого идентификатора.


12
2018-04-24 04:22



Хорошо, после перечитывания Ответ Питера Эйзентраута, похоже, что он технически правильный. Надеюсь, мои подробности предоставят еще большую ясность. Я не согласен с Ответ Стивена Дженнингса, потому что этот ответ заставляет его выглядеть так: «Идентификатор области» идентифицирует «связь локально» как область действия. Однако два разных сетевых интерфейса могут быть «связаны локально», но они не будут использовать одну и ту же «область» (по примерам, указанным в его нумерованном списке). Вместо этого я говорю, что эти цифры определяют сетевой «интерфейс». - TOOGAM