Локальный адрес канала IPv6 со встроенной областью действия в OSX

Я написал простой код, который использует ioctl SIOCGIFCONF для запроса всех сетевых интерфейсов в системе и, используя inet_ntop, возвращает текстовое представление найденного адреса. Странно то, что когда обнаруживается локальный для канала IPv6-адрес, версия кода OSX, по-видимому, встраивает область в адрес.

Вот строка из / sbin / ifconfig в OSX после автонастройки интерфейсов (:

en1: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        ether 00:17:f2:0b:52:73 
        inet6 fe80::217:f2ff:fe0b:5273%en1 prefixlen 64 scopeid 0x5 

и IP-адрес, возвращенный ioctl SIOCGIFCONF:

Адрес IPv6: fe80: 5 :: 217: f2ff: fe0b: 5273

Похоже, что значение для scope (5) было вставлено сразу после fe80.

Тот же код в Linux возвращает адрес ipv6 без каких-либо дополнительных данных.

У меня возникают два вопроса: 1) Законно ли писать такой адрес ipv6? 2) Задокументировано ли где-нибудь поведение OSX?

Ссылки пожалуйста!


person Spaceghost    schedule 04.05.2011    source источник
comment
На большинстве платформ inet_ntop и inet_pton не поддерживают зоны IPv6, вы должны использовать только getnameinfo и getaddrinfo.   -  person Steve-o    schedule 05.05.2011
comment
Спасибо, Стив, я этого не знал. У меня остается вопрос: должен ли IPv6-адрес содержать информацию о зоне? Не упоминается в RFC4291, глава 2.2. Текстовое представление адресов   -  person Spaceghost    schedule 05.05.2011
comment
Только адреса локальной области видимости, то есть префиксы fe80 ::.   -  person Steve-o    schedule 05.05.2011


Ответы (1)


Я не уверен насчет вашего второго вопроса, но что касается вашего первого вопроса, да, часто можно увидеть адреса IPv6, которые сильно ограничены (например, локальные адреса ссылок), написанные таким образом, но это определенно не согласовано на разных платформах . Причина в том, что без него локальный адрес ссылки был бы неоднозначным.

Мой ответ на этот другой вопрос может быть полезным.


Изменить: я только что понял тонкость этого вопроса. Стек BSD IPv6 внутренне хранит индекс интерфейса во втором 16-битном слове локального адреса IPv6. Это не должно никогда выйти из строя. На самом деле это нарушение RFC, , потому что локальные адреса ссылок имеют 0 бит в в этой области. (что, кстати, является причиной того, что им может сойти с рук хранение дополнительной информации здесь). Я считаю, что это ошибка, и область действия действительно должна быть сообщена остальной части системы каким-либо другим способом. Так что вам, вероятно, следует проверить это и снять вручную.


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

  466 static int
  467 in6_ifattach_linklocal(
  468         struct ifnet *ifp,
  469         struct ifnet *altifp,   /* secondary EUI64 source */
  470         struct in6_aliasreq *ifra_passed)
  471 {
      ...
  494                 ifra.ifra_addr.sin6_family = AF_INET6;
  495                 ifra.ifra_addr.sin6_len = sizeof(struct sockaddr_in6);
  496                 ifra.ifra_addr.sin6_addr.s6_addr16[0] = htons(0xfe80);
  497 #if SCOPEDROUTING
  498                 ifra.ifra_addr.sin6_addr.s6_addr16[1] = 0
  499 #else
  500                 ifra.ifra_addr.sin6_addr.s6_addr16[1] = htons(ifp->if_index); /* XXX */
  501 #endif

Обратите внимание на /* XXX */ в строке 500. ;-) Я предполагаю, что это был своего рода временный обходной путь / хакерство для правильной работы маршрутизации без переписывания частей кода маршрутизации. С локальными адресами канала вам нужно будет принимать решения о маршрутизации на основе интерфейсов источника и назначения. Поместив if_index в это место в адресе, они, вероятно, могут просто выполнить сопоставление самого длинного префикса только на 128-битном адресе, вместо того, чтобы полагаться на какие-то метаданные.

person mpontillo    schedule 05.05.2011
comment
Спасибо, Майк. Кажется, что область действия требуется для маршрутизации, но на самом деле не является частью адреса, но без нее адрес не очень полезен. - person Spaceghost; 05.05.2011
comment
@Spaceghost, да, именно так. Одна вещь, на которую также может быть полезно указать вам, заключается в том, что в своем вопросе вы сказали, что это результат автоконфигурирования интерфейсов. Это не совсем правильно. Когда вы говорите об автоматически настраиваемом адресе в IPv6, вы обычно имеете в виду глобальный одноадресный адрес, автоматически настраиваемый с помощью маршрутизатора. реклама. Локальные адреса ссылок требуются спецификацией, но на самом деле не считаются автоматически настраиваемыми. - person mpontillo; 06.05.2011