Почему существует знак процента " % " в адресе 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 какое-то особое значение?

Edit:

у меня есть еще несколько замечаний по этому поводу. И они очень хорошо совпадают с тем, что сказал Стивен Дженнингс в своем ответе.

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

на fe80::b059:65f4:e877:С40%20

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

что все еще смущало меня, так это то, почему класс IPAddress позволяет создавать ip-адрес в этом формате, если он не является действительным. Ответ был предоставлен Стивеном. Номер-это идентификатор области. IP-адрес имеет конструктор, который принимает адрес и идентификатор области.

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

прохладный. Это было интересно!!

17
задан Stephen Jennings
27.04.2023 15:01 Количество просмотров материала 3195
Распечатать страницу

3 ответа

число После " % " является идентификатором области.

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

  1. адресуемыми по всему миру. Это IPv6-адрес, предоставленный вам провайдером. Он доступен для использования в интернете.

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

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

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

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

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

120
отвечен Stephen Jennings 2023-04-28 22:49

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

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

19
отвечен Peter Eisentraut 2023-04-29 01:06

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

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

ping fe80::2%14

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

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

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

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

при попытке пинговать удаленную систему (например, "2607:f8b0:400А:802"), как правило, обычно, чтобы выяснить, сети или подсети, адреса это часть, которая, глядя на биты в начале адреса. Затем эти биты используются для определения трафик.

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

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

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

14
отвечен TOOGAM 2023-04-29 03:23

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх