В Linux 2.2 реализуется протокол Internet Protocol версии 6.
Эта страница руководства содержит описание основного API для IPv6,
которое реализовано в ядре Linux и в glibc 2.1.
Интерфейс базируется на сокетах BSD; см.
socket(7).
API для IPv6 предназначен быть в основном совместимым с
ip(7)
v4 API. На этой странице руководства описаны только различия между ними.
Для cвязки сокета
AF_INET6
c любым процессом локальный адрес должен быть скопирован из переменной
in6addr_any,
имеющей тип
in6_addr.
При статических инициализациях также может быть использовано
IN6ADDR_ANY_INIT,
которое расширено до константного выражения.
Оба они существуют в сетевом порядке.
Адрес устройства обратной петли IPv6 (::1) доступен в глобальной переменной
in6addr_loopback.
Для инициализаций надо использовать
IN6ADDR_LOOPBACK_INIT.
Соединения IPv4 могут обрабатываться API v6, используя v4-преобразованный-в-v6
тип адреса; таким образом, программе необходимо поддерживать только данный
тип API для работы с обоими протоколами. Они поддерживаются функцией,
обрабатывающей адреса в библиотеке libc.
IPv4 и IPv6 разделяют локальное пространство порта.
Когда Вы примете соединение IPv4 или пакеты на сокетах IPv6, то
его источник отобразится в v6, и в дальнейшем он будет отображаться как v6.
ФОРМАТЫ АДРЕСОВ
struct sockaddr_in6 {
u_int16_t sin6_family;/* AF_INET6 */
u_int16_t sin6_port;/* номер порта */
u_int32_t sin6_flowinfo;/* поток информации IPv6 */
struct in6_addr sin6_addr;/* адрес IPv6 */
u_int32_t sin6_scope_id; /* Область id (новое с версии 2.4) */
};
struct in6_addr {
unsigned char s6_addr[16];/* адрес IPv6 */
};
sin6_family
всегда устанавливается в
AF_INET6; sin6_port
является портом протокола (см.
sin_port
в
ip(7));
sin6_flowinfo
является идентификатором потока IPv6;
sin6_addr
является 128-битным адресом IPv6.
sin6_scope_id
является идентификатором id в зависимости от области адреса.
Это новое добавление в версии Linux 2.4.
Linux поддерживает его только для связи областей адресов, в этом случае
sin6_scope_id
содержит индекс интерфейса (см.
netdevice(7)).
IPv6 поддерживает несколько типов адресов: unicast - для адресации одного
хоста, multicast - для адресации группы хостов, anycast - для адресации
ближайшего члена группы хостов (не реализовано в Linux), IPv4-по-IPv6 -
для адресации хоста IPv4, и несколько других зарезервированных типов адресов.
Нотацией адреса для IPv6 будет группа из шестнадцати 2-разрядных
шестнадцатеричных чисел, разделенных двоеточием ':'. Два двоеточия '::'
зарезервированы для обозначения строки из 0 бит.
Специальные адреса - ::1 для устройства обратной петли и
FFFF::<адрес IPv4> для IPv4-преобразованного-в-IPv6.
Место в порту IPv6 разделяется с IPv4.
ОПЦИИ СОКЕТОВ
IPv6 поддерживает некоторые протоколы с особыми параметрами сокетов,
которые могут устанавливаться
setsockopt(2)
и считываться с помощью
getsockopt(2).
Уровни параметра сокетов IPv6 определяются
IPPROTO_IPV6.
Логический целочисленный флаг равен нулю, когда IPPROTO_IPV6 - ложь,
в противном случае - истина.
IPV6_UNICAST_HOPS
Определяет лимит хопов (hop) в unicast для сокетов.
Аргумент является указателем на целое число.
Значение -1 означает использование маршрута по умолчанию,
в противном случае его значение будет в диапазоне от 0 до 255.
IPV6_MULTICAST_HOPS
Определяет лимит хопов в multicast для сокетов.
Аргумент является указателем на целое число.
Значение -1 означает использование маршрута по умолчанию,
в противном случае его значение будет в диапазоне от 0 до 255.
IPV6_MULTICAST_IF
Определяет устройство для исходящих пакетов multicast для сокета.
Это разрешено только для сокетов
SOCK_DGRAM
и
SOCK_RAW.
Аргумент является указателем на индекс интрефейса (см.
netdevice(7))
среди целых чисел.
IPV6_ADDRFORM
Преобразует сокет
AF_INET6
в сокет другого семейства адресов. В этих ситуациях на данный момент
поддерживаются только
AF_INET.
Оно разрешено только для сокетов IPv6, которые соединены
и привязаны с адресами v4-преобразованные-в-v6. Аргумент
является указателем на целое, содержащее
AF_INET.
Полезно передавать v4-преобразованные сокеты как
описатели файлов программам, которые не понимают IPv6 API.
IPV6_PKTINFO
Установите отправку управляющего сообщения
IPV6_PKTINFO
для входящих датаграмм. Разрешено только для сокетов
SOCK_DGRAM
или
SOCK_RAW.
Аргументом является указатель на логическое значение среди целых чисел.
IPV6_RTHDR, IPV6_AUTHHDR, IPV6_DSTOPS, IPV6_HOPOPTS, IPV6_FLOWINFO, IPV6_HOPLIMIT
Устанавливают отправку управляющих сообщений для входящих датаграмм,
содержащих заголовки расширения из принятых пакетов.
IPV6_RTHDR
доставляет заголовок маршрутизации,
IPV6_AUTHHDR
доставляет заголовок аутентификации,
IPV6_DSTOPTS
доставляет параметры назначения,
IPV6_HOPOPTS
доставляет параметры хопов,
IPV6_FLOWINFO
доставляет целое, содержащее поток id,
IPV6_HOPLIMIT
доставляет целое, содержащее счетчик хопов пакета.
Управляющие сообщения имеют тот же тип, что и параметры сокета.
Все эти параметры заголовка могут также устанавливаться
для исходящих пакетов посылкой определенного управляющего сообщения
в управляющий буфер
sendmsg(2).
Разрешено только для сокетов
SOCK_DGRAM
или
SOCK_RAW.
Аргумент является указателем на логическое значение.
IPV6_MULTICAST_LOOP
Определяет, видит ли сокет пакеты multicast, которые сам и посылал.
Аргумент является указателем на логическое число.
IPV6_ADD_MEMBERSHIP, IPV6_DROP_MEMBERSHIP
Определяет членством в группах multicast.
Аргумент является указателем на структуру
structipv6_mreq.
IPV6_MTU
Устанавливает MTU, который должен использоваться для сокета.
MTU ограничивается устройством MTU или маршрутом MTU, если
включено определение пути MTU.
Аргумент является указателем на целое.
IPV6_MTU_DISCOVER
Управляет определением пути MTU для сокета. См.
IP_MTU_DISCOVER
в
ip(7)
для более детальной информации.
IPV6_RECVERR
Управляет получением асинхронных параметров ошибки. См.
IP_RECVERR
в
ip(7)
для более детальной информации.
Аргумент является указателем на логическое число.
IPV6_ROUTER_ALERT
Передает все пересланные пакеты, содержащие предупреждение параметра
маршрутизатора для сокета.
Разрешено только для датаграмм сокетов и для root.
Аргумент является указателем на логическое число.
ВЕРСИИ
Старые
libinet6
в libc5, основанные на реализации API IPv6 для Linux,
не описаны здесь и могут изменяться в конкретных деталах.
Linux 2.4 прервет двоичную совместимость для sockaddr_in6 для
64-битных хостов, изменяя выравнивание
in6_addr
и добавляя дополнительное поле
sin6_scope_id.
Интерфейс ядра остается совместимым, но программа, включающая
sockaddr_in6 или in6_addr в другие структуры уже может не быть совместимой.
Это не является проблемой для 32-битных хостов типа i386.
Поле
sin6_flowinfo
является нововведением в Linux 2.4.
Оно точно проходит/считывается ядром, когда длина прошедшего адреса
содержит его. Некоторые программы, которые передают более длинный буфер адреса
и затем проверяют длину исходящего адреса могут перестать работать.
ЗАМЕЧАНИЯ ПО ПОРТИРОВАНИЮ
Структура
sockaddr_in6
по размеру больше, чем более обобщенный
sockaddr.
Программы, которые допускают, что все типы адреса могут быть
нормально сохранены в
struct sockaddr,
требуют изменений для использования вместо него
struct sockaddr_storage.
НАЙДЕННЫЕ ОШИБКИ
Расширение API для IPv6, как в RFC2292, к настоящему времени только частично
реализовано; хотя ядро 2.2 имеет почти полную поддержку для получения
параметров, макросы для генерации параметров IPv6 пропускаются в glibc 2.1.
Поддержка IPSec для EH и АХ заголовков пропускается.
Руководство по управлению потоком не завершено и тут незадокументировано.