Я использую .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 имеет специальное значение?
Править:
У меня просто были еще некоторые наблюдения об этом. И они соответствуют вполне прилично тому, что Stephen Jennings сказал в своем ответе.
Я установил VMware для наблюдения, какой адрес IPv6 он выпустил. Адреса были: fe80:: 3dd0:7f8e:57b7:34d5%19
fe80:: b059:65f4:e877:c40%20
Очевидно, числа после % не являются некоторым шестнадцатеричным представлением. Я проверил все свойства, доступные для использования сетевого адаптера Wmi, и нашел, что числа - точно то же как свойство InterfaceIndex каждого сетевого адаптера. Согласно MSDN, это однозначно определяет каждый сетевой адаптер, и это свойство было представлено в Vista.
То, что все еще смутило меня, было то, почему будет класс IPAddress позволять Вам создавать IP-адрес в том формате, если это не было допустимо. Ответ был предоставлен Stephen. Число является идентификатором объема. IPAddress имеет конструктора, который принимает адрес И идентификатор объема.
О, и все эти три сетевых адаптера были локальной ссылкой. Подтвержденный это через ipconfig
Круто. Это было интересно!!
Число после '%' является идентификатором объема.
IPv6 определяет по крайней мере три объема достижимости для адресов:
Глобально адресуемый. Это - адрес IPv6, данный Вам Вашим ISP. Это доступно для использования в общедоступном Интернете.
Локальный для ссылки. Это подобно 169.254. Диапазон X.X. Это - адрес, который компьютер присваивает сам для упрощения местных связей. Эти адреса не становятся направленными вокруг в общедоступном Интернете, потому что они не глобально уникальны.
Локальный для узла. Это - адрес, который определяет локальный интерфейс, подобный 127.0.0.1. В основном это - адрес:: 1.
Microsoft опубликовала эту статью, описывающую обращение IPv6, которое является меньше всего запутывающей статьей, которую я нашел. Статья указывает, что присутствие идентификатора объема в Вашем адресе означает, что это - локальный для ссылки адрес. Можно также сказать, что это локально для ссылки, потому что адрес начинается fe80
.
Ясная, просто понятая информация об этой теме, кажется, редка, таким образом, я помещаю остальную часть этого вместе на основе моего лучшего понимания RFC 4007 и другой информации там.
Компьютер может иметь несколько локальных для ссылки адресов, каждого с различным объемом. Идентификатор объема указывает, для какого объема адрес. Например, вообразите сценарий компьютера с двумя NICs, каждого с локальным для ссылки адресом в различных сетях. При попытке отправить что-то в другой адрес, начинающийся fe80, как компьютер будет знать который NIC отослать на? Идентификатор объема, кажется, решение для этого.
Адреса IPv6 с префиксом fe80::/64 являются локальными для ссылки адресами, которые создаются путем объединения того префикса с аппаратным адресом сетевого устройства, 71a3:2b00:ddd3:753f в примере. (Аналог в IPv4 является 169.254.0.0/16.), Так как префикс является тем же для всех локальных для ссылки адресов на машине, маршрутизация, возможно, иногда должна была бы знать, к какому интерфейсу Вы обращаетесь. И именно это указывает число после процента, названного индексом зоны. Специфические особенности зависят от операционной системы: В Windows, %16
интерфейсный номер 16; на Linux, например, Вы могли бы видеть что-то как %eth0
.
Некоторые инструменты или API будут считать этот индекс зоны неважным или неявным в их целях. Например, на Linux ifconfig
инструмент не показывает его, потому что это очевидно, которые взаимодействуют через интерфейс, адрес принадлежит. Но в целом это должно быть принято во внимание.