ОБЗОР
#include <sys/socket.h>
#include <netinet/in.h>
tcp6_socket = socket(AF_INET6, SOCK_STREAM, 0);
raw6_socket = socket(AF_INET6, SOCK_RAW, protocol);
udp6_socket = socket(AF_INET6, SOCK_DGRAM, protocol);
ОПИСАНИЕ
В Linux 2.2 реализован протокол Интернета версии 6. Эта справочная страница
содержит описание основного программного интерфейса IPv6, который реализован
в ядре Linux и в glibc 2.1. Программный интерфейс основан на интерфейсе
сокетов BSD; смотрите socket(7).
Программный интерфейс IPv6, по большей части, совместим с IPv4 (смотрите ip(7)). В этой справочной странице описаны только различия между ними.
Чтобы привязать сокет AF_INET6 к любому процессу нужно скопировать локальный адрес из переменной in6addr_any, имеющей тип in6_addr. При статической инициализации также может быть использован макрос IN6ADDR_ANY_INIT, который раскрывается в константное выражение. В обоих значениях используется сетевой порядок байт.
Адрес устройства обратной петли IPv6 (::1) доступен в глобальной переменной in6addr_loopback. Для инициализации нужно использовать IN6ADDR_LOOPBACK_INIT.
Соединения IPv4 могут обрабатываться программным интерфейсом v6 с помощью адресного типа v4-преобразованный-в-v6; то есть программе необходимо поддерживать только данный тип программного интерфейса для работы с обоими протоколами. Прозрачная работа с адресами реализована в функциях библиотеки Си.
IPv4 и IPv6 совместно используют локальное портовое пространство. При установлении соединения IPv4 или приёма пакета на сокете IPv6, адрес его источника отобразится в v6, и в дальнейшем он будет отображаться как v6.
Формат адреса
struct sockaddr_in6 { sa_family_t sin6_family; /* AF_INET6 */ in_port_t sin6_port; /* номер порта */ uint32_t sin6_flowinfo; /* информация о потоке IPv6 */ struct in6_addr sin6_addr; /* адрес IPv6 */ uint32_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 является идентификатор, зависящий от области адреса. Это новое поле, появившееся в версии Linux 2.4. Linux поддерживает его только для адресов локальной связи (link local); в этом случае sin6_scope_id содержит индекс интерфейса (смотрите netdevice(7)).
IPv6 поддерживает несколько типов адресов: однозначные (unicast) — для адресации одного узла, многоадресные (multicast) — для адресации группы узлов, anycast — для адресации ближайшего члена группы узлов (не реализовано в Linux), IPv4-on-IPv6 — для адресации узла IPv4, и несколько других зарезервированных типов адресов.
Адрес IPv6 представляет собой группу из 8 4-разрядных шестнадцатеричных чисел, разделённых двоеточием «:». Два двоеточия «::» обозначают строку 0 бит. Специальные адреса: ::1 (для устройства обратной петли) и FFFF::<адрес IPv4> — для IPv4-преобразованного-в-IPv6.
В IPv6 используется единое с IPv4 пространство портов.
Параметры сокета
IPv6 поддерживает некоторые параметры сокета, относящиеся к протоколу, которые могут быть установлены с помощью setsockopt(2) и прочитаны с помощью getsockopt(2). Значением уровня (level) параметров сокета для IPv6 является IPPROTO_IPV6. Логический флаг в виде целого числа со значением 0 означает «ложь», другие значения — «истина».IPV6_ADDRFORM Преобразует сокет AF_INET6 в сокет другого семейства адресов. На данный момент поддерживается только AF_INET. Разрешено только для сокетов IPv6, которые подсоединены и привязаны к адресам v4-преобразованные-в-v6. В аргументе задаётся указатель на целое со значением AF_INET. Это полезно для передачи v4-преобразованных сокетов в виде дескрипторов файлов программам, которые не понимают программного интерфейса IPv6.
IPV6_ADD_MEMBERSHIP, IPV6_DROP_MEMBERSHIP Определяет членство в многоадресных (multicast) группах. Аргументом является указатель на struct ipv6_mreq.
IPV6_MTU getsockopt(): Возвращает известное в данный момент значение MTU маршрута текущего сокета. Только для подключённых сокетов. Возвращается целое число.
setsockopt(): Устанавливает MTU, который должен использоваться для сокета. MTU ограничивается значением MTU устройства или MTU пути, если включено определение пути MTU. Аргументом является указатель на целое.
IPV6_MTU_DISCOVER Управляет определением пути MTU для сокета. Смотрите описание IP_MTU_DISCOVER в ip(7).
IPV6_MULTICAST_HOPS Определяет лимит многоадресных пересылок (hop) для сокета. Аргументом является указатель на целое число. Значение -1 означает использование маршрута по умолчанию, в противном случае значение должно быть в диапазоне от 0 до 255.
IPV6_MULTICAST_IF Назначает устройство для исходящих многоадресных пакетов для сокета. Это разрешено только для сокетов SOCK_DGRAM и SOCK_RAW. Аргументом является указатель на индекс интерфейса (смотрите netdevice(7)) в виде целого числа.
IPV6_MULTICAST_LOOP Определяет, видит ли сокет многоадресные пакеты, которые сам и посылал. Аргументом является указатель на логическое значение.
IPV6_RECVPKTINFO (начиная с Linux 2.6.14)
Задаёт отправку управляющего сообщения IPV6_PKTINFO для входящих
дейтаграмм. Такие управляющие сообщения содержат структуру struct
in6_pktinfo, описанную в RFC 3542. Разрешено только для сокетов
SOCK_DGRAM или SOCK_RAW. Аргументом является указатель на логическое
значение в виде целого числа.
IPV6_RTHDR, IPV6_AUTHHDR, IPV6_DSTOPTS, IPV6_HOPOPTS, IPV6_FLOWINFO,
IPV6_HOPLIMIT
Задают отправку управляющих сообщений для входящих дейтаграмм, содержащих
заголовки расширения из принятых пакетов. IPV6_RTHDR доставляет заголовок
маршрутизации, IPV6_AUTHHDR доставляет заголовок аутентификации,
IPV6_DSTOPTS доставляет параметры назначения, IPV6_HOPOPTS доставляет
параметры пересылок (hop), IPV6_FLOWINFO доставляет целое, содержащее ID
потока, IPV6_HOPLIMIT доставляет целое, содержащее счётчик пересылок
пакета. Управляющие сообщения имеют тот же тип, что и параметры сокета. Все
эти параметры заголовка могут также устанавливаться для исходящих пакетов
посылкой определённого управляющего сообщения в управляющий буфер
sendmsg(2). Разрешено только для сокетов SOCK_DGRAM или
SOCK_RAW. Аргументом является указатель на логическое значение.
IPV6_RECVERR Управляет получением асинхронных параметров ошибки. Смотрите описание IP_RECVERR в ip(7). Аргументом является указатель на логическое значение.
IPV6_ROUTER_ALERT Передаёт все пересланные пакеты, содержащие предупреждающий параметр hop-by-hop маршрутизатора в сокет. Разрешено только для сокетов SOCK_RAW. Выявленные пакеты не пересылаются ядром, пользователь должен отправить заново самостоятельно. Аргументом является указатель на целое. Положительное число означает перехват значения предупреждающего параметра маршрутизатора. Пакеты, содержащие предупреждающий параметр маршрутизатора с таким значением поля, будут доставлены в сокет. Отрицательное значение отключает доставку пакетов с предупреждающим параметром маршрутизатора в сокет.
IPV6_UNICAST_HOPS Определяет лимит однозначных (unicast) пересылок (hop) для сокета. Аргументом является указатель на целое число. Значение -1 означает использование маршрута по умолчанию, в противном случае его значение должно быть в диапазоне от 0 до 255.
IPV6_V6ONLY (начиная с Linux 2.4.21 и 2.6) Если этот флаг установлен (не равен 0), то сокет отправляет и принимает только пакеты IPv6. В этом случае приложение IPv4 и IPv6 может привязать один порт за раз.
Если этот флаг сброшен (равен 0), то сокет можно использовать для отправки и приёма пакетов с и на адрес IPv6 или адрес IPv4-преобразованный-в-IPv6.
Аргументом является указатель на логическое значение в виде целого числа.
Значение этого флага по умолчанию определяется из содержимого файла /proc/sys/net/ipv6/bindv6only. По умолчанию значение в файле 0.
ОШИБКИ
ENODEV Пользователь пытался выполнить bind(2) на адрес локальной связи IPv6, но sin6_scope_id в переданной структуре sockaddr_in6 содержит некорректный индекс интерфейса.
ВЕРСИИ
В 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.
Параметры сокета SOL_IP, SOL_IPV6, SOL_ICMPV6 и другие SOL_* являются непереносимыми вариантами IPPROTO_*. Смотрите также ip(7).
ДЕФЕКТЫ
Расширенный программный интерфейс IPv6, описанный в RFC 2292, к настоящему времени реализован частично; хотя ядро версии 2.2 имеет почти полную поддержку параметров приёма, макросы для генерации параметров IPv6 в glibc 2.1 отсутствуют.Поддержка IPSec для заголовков EH и АХ отсутствует.
Описание управления потоком на основе меток (label) не завершено и здесь не описано.
Эта справочная страница не полна.