ipv6

IPV6(7)                  Руководство программиста Linux                  IPV6(7)



ИМЯ
       ipv6  - реализация протокола IPv6 в Linux

ОБЗОР
       #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) не завершено и здесь
       не описано.

       Эта справочная страница не полна.

СМОТРИТЕ ТАКЖЕ
       cmsg(3), ip(7)

       RFC 2553: IPv6 BASIC API; Linux пытается быть совместимым с этим
       стандартом. RFC 2460: спецификация IPv6.



Linux                              2015-03-29                            IPV6(7)