ipv6, PF_INET6 - реализация протокола Linux IPv6
НАЗВАНИЕipv6, PF_INET6 - реализация протокола Linux IPv6
СИНТАКСИС
#include
#include
tcp6_socket = socket(PF_INET6, SOCK_STREAM, 0);
raw6_socket = socket(PF_INET6, SOCK_RAW, protocol);
udp6_socket = socket(PF_INET6, SOCK_DGRAM, protocol);
ОПИСАНИЕ
В 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 содержит индекс интерфейса (см. net-
device(7)).
IPv6 поддерживает несколько типов адресов: unicast - для
адресации одного хоста, multicast - для адресации группы
хостов, anycast - для адресации ближайшего члена группы
хостов (не реализовано в Linux), IPv4-по-IPv6 - для
адресации хоста IPv4, и несколько других зарезервированных
типов адресов.
Нотацией адреса для IPv6 будет группа из шестнадцати
2-разрядных шестнадцатеричных чисел, разделенных
двоеточием ':'. Два двоеточия '::' зарезервированы для
обозначения строки из 0 бит. Специальные адреса - ::1 для
устройства обратной петли и FFFF:: для
IPv4-преобразованного-в-IPv6.
Место в порту IPv6 разделяется с IPv4.
ОПЦИИ СОКЕТА
IPv6 поддерживает некоторые протоколы с особыми
параметрами сокетов, которые могут устанавливаться set-
sockopt(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
Определяет устройство для исходящих пакетов multi-
cast для сокета. Это разрешено только для сокетов
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. Интерфейс
ядра остается совместимым, но программа, включающая sock-
addr_in6 или in6_addr в другие структуры уже может не быть
совместимой. Это не является проблемой для 32-битных
хостов типа i386.
Поле sin6_flowinfo является нововведением в Linux 2.4.
Оно точно проходит/считывается ядром, когда длина
прошедшего адреса содержит его. Некоторые программы,
которые передают более длинный буфер адреса и затем
проверяют длину исходящего адреса могут перестать
работать.
ЗАМЕЧАНИЯ ПО ПЕРЕНОСУ НА ДРУГИЕ СИСТЕМЫ
Структура sockaddr_in6 по размеру больше, чем более
обобщенный sockaddr. Программы, которые допускают, что
все типы адреса могут быть нормально сохранены в struct-
sockaddr, требуют изменений для использования вместо него
structsockaddr_storage.
НАЙДЕННЫЕ ОШИБКИ
Расширение API для IPv6, как в RFC2292, к настоящему
времени только частично реализовано; хотя ядро 2.2 имеет
почти полную поддержку для получения параметров, макросы
для генерации параметров IPv6 пропускаются в glibc 2.1.
Поддержка IPSec для EH и АХ заголовков пропускается.
Руководство по управлению потоком не завершено и тут
незадокументировано.
Эта страница руководста не совсем полна.