2010-06-28 7 views
2

Как индекс зоны относится к области scope_id в структуре sockaddr_in6?IPv6 Индекс зоны и scope_id

Функциональность, по-видимому, отличается между платформами, и мне бы хотелось знать, как они соотносятся. Например, Windows имеет SCOPE_ID structure (а также только 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, и, похоже, он находится в порядке little-endian ..., который не может быть прав, не так ли?

ответ

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, то есть разделяет административные домены адресов. Все это чисто необязательно и часто игнорируется.

+0

Приветствия ... хороший ответ, но я потерялся на одном. Ваш interface_req_t слишком велик, чтобы быть помещенным в поле scope_id ... – Goz

+0

Я использую эту структуру для указания интерфейса для API, в вызове я могу использовать getifaddrs()/GetAdapterAddresses(), чтобы найти соответствующий интерфейс #/scope # , –