IPv6-индекс зоны и scope_id
Как индекс зоны соотносится с scope_id в структуре sockaddr_in6?
Кажется, что функциональность у разных платформ разная, и мне хотелось бы знать, как они связаны. Например, Windows имеет структуру SCOPE_ID (а также просто 32-битное значение). Mac OSX имеет только 32-битное значение. Очевидно, что 32-битное значение - это путь, но как именно он выложен? Это все еще 4 верхних бита "уровня"? Как сетевой порядок байтов влияет на это?
Также я предполагаю, что под окнами индекс зоны, указанный в IP-адресе (например, FF80::1%1), транслируется непосредственно в нижние 28 бит вышеупомянутой структуры. Как это работает в Mac OSX, которая использует имена, а не цифры (например, FF80::1%en0). Я кодирую это как четыре CC? В равной степени я напоминаю, что в linux используются 4 символа, которые не могут вписаться в 28 бит.
Так может кто-нибудь объяснить мне этот беспорядок? Мне действительно нужно написать учебник по всему этому, когда я закончу, потому что в сети очень мало информации о ipv6.
Редактировать: находится ли scope_id в сетевом порядке байтов? Я просто смотрю на scope_id, возвращенный из recvfrom, и он, кажется, имеет порядок с прямым порядком байтов... что не может быть правильным, не так ли?
1 ответ
Индекс зоны и области действия одинаковы и часто взаимозаменяемы, однако сами термины разные.
Область используется как в "глобальной области", "локальной области", "универсальной области" и относится к тому, насколько уникальным является конкретный адрес IPv6. Каждый интерфейс имеет локальную область действия, которая уникальна для непосредственного сегмента локальной сети, что, например, полезно для автоматической настройки и обнаружения локальных устройств, например принтера, который вы только что подключили к сети. IPv6-адрес глобальной области может предоставляться сервером DHCP.
Зона предназначена для указания конкретного эффективного интерфейса в локальной области.
Индекс области действия отличается от индекса интерфейса тем, что для указания интерфейса я использую структуру следующим образом:
struct interface_req_t {
uint32_t ir_interface;
uint32_t ir_scope_id;
};
Каждая платформа уникальна в том, как она интерпретирует значение, поскольку Windows имеет несколько повторных интерпретаций перечисления интерфейса в зависимости от домена. Недостатком реализации Windows является то, что индекс может меняться при использовании адаптеров горячей замены. В Unix вы склонны видеть имена интерфейсов %qe0
, %eth0
и т. д., которые могут быть преобразованы в цифровую форму при необходимости, например if_nametoindex()
, Windows Vista добавляет совместимый API.
Только локальная область видимости определяется по префиксу адреса fe80::/10.
Windows SCOPE_ID показывает избыточный дизайн, который также существует в многоадресной рассылке IPv4, то есть разделяет домены администрирования адресов. Это все необязательно и часто игнорируется.