Provided by: manpages-ru_4.19.0-7_all bug

ИМЯ

       ip - реализация протокола IPv4 в Linux

СИНТАКСИС

       #include <sys/socket.h>
       #include <netinet/in.h>
       #include <netinet/ip.h> /* superset of previous */

       tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
       udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
       raw_socket = socket(AF_INET, SOCK_RAW, protocol);

ОПИСАНИЕ

       В  Linux  реализован  протокол  Интернета  (Internet  Protocol,  IP) версии 4, описанный в
       RFC 791  и  RFC 1122.  В  модуле  ip  содержится  реализация  второго   уровня   групповых
       многоадресных  сообщений,  которая  соответствует  RFC 1112.  Кроме  того,  в  нём имеется
       маршрутизатор IP с фильтрацией пакетов.

       Программный интерфейс совместим с интерфейсом  сокетов  BSD.  Более  подробную  информацию
       смотрите в socket(7).

       Сокет IP создаётся с помощью socket(2):

           socket(AF_INET, socket_type, protocol);

       Valid  socket  types  include  SOCK_STREAM  to  open a stream socket, SOCK_DGRAM to open a
       datagram socket, and SOCK_RAW to open a raw(7) socket to access the IP protocol directly.

       protocol is the IP protocol in the IP header to be received or  sent.   Valid  values  for
       protocol include:

       •  0 and IPPROTO_TCP for tcp(7)  stream sockets;

       •  0 and IPPROTO_UDP for udp(7)  datagram sockets;

       •  IPPROTO_SCTP for sctp(7)  stream sockets; and

       •  IPPROTO_UDPLITE for udplite(7)  datagram sockets.

       For  SOCK_RAW  you  may  specify  a  valid  IANA  IP protocol defined in RFC 1700 assigned
       numbers.

       Если процесс хочет принимать новые входящие пакеты или соединения, то  он  должен  связать
       сокет с адресом локального интерфейса с помощью bind(2). Каждый IP-сокет может быть связан
       только с одной задаваемой локальной парой (адрес, порт). Если  в  вызове  bind(2)  указать
       INADDR_ANY,  то  сокет будет связан со всеми локальными интерфейсами. При вызове listen(2)
       для несвязанного  сокета  происходит  автоматическая  привязка  к  произвольно  выбранному
       свободному  порту  с  локальным адресом INADDR_ANY. При вызове connect(2) для несвязанного
       сокета происходит автоматическая привязка к произвольно выбранному  свободному  порту  или
       используемому общему порту с локальным адресом INADDR_ANY.

       После  закрытия  связанного  локального  TCP-сокета  его  адрес будет недоступен в течение
       некоторого времени, если только не был установлен  флаг  SO_REUSEADDR.  Следует  проявлять
       осторожность при использовании этого флага, поскольку это делает TCP менее надежным.

   Формат адреса
       Адрес  IP-сокета  определяется как комбинация IP-адреса интерфейса и номера порта. В самом
       протоколе IP нет номеров  портов,  они  реализуются  протоколами  более  высокого  уровня,
       например  udp(7)  и  tcp(7).  У  неструктурированных  (raw)  сокетов  номер  протокола  IP
       указывается в sin_port.

           struct sockaddr_in {
               sa_family_t    sin_family; /* семейство адресов: AF_INET */
               in_port_t      sin_port;   /* порт сокета в сетевом порядке
                                             байт */
               struct in_addr sin_addr;   /* Интернет-адрес */
           };

           /* Internet address */
           struct in_addr {
               uint32_t       s_addr;     /* address in network byte order */
           };

       Значение sin_family всегда устанавливается в AF_INET. Это обязательно; в Linux 2.2 большая
       часть  сетевых  функций  возвращает  код ошибки EINVAL, если это условие не выполняется. В
       sin_port указывается номер порта в сетевом порядке  байт.  Порты,  номера  которых  меньше
       1024,  называются  привилегированными  портами  (или, иногда, зарезервированными портами).
       Только привилегированные процессы (в Linux: процессы  с  мандатом  CAP_NET_BIND_SERVICE  в
       пользовательском пространстве имён, управляющим его сетевым пространством имён) могут быть
       связаны с этими сокетами с помощью bind(2). Заметим, что у неструктурированного  протокола
       IPv4  нет  понятия  портов  как таковых, они реализуются только протоколами более высокого
       уровня, типа tcp(7) и udp(7).

       В sin_addr указывается IP-адрес узла. В поле s_addr структуры  struct  in_addr  содержится
       адрес  интерфейса  узла  в  сетевом  порядке  байт.  Значение in_addr должно быть одним из
       INADDR_* (например, INADDR_LOOPBACK) установленное htonl(3), или  с  помощью  библиотечных
       функций    inet_aton(3),   inet_addr(3),   inet_makeaddr(3)   или   напрямую   с   помощью
       преобразователя имён (смотрите gethostbyname(3)).

       Адреса  IPv4  делятся  на   однозначные   (unicast),   широковещательные   (broadcast)   и
       многоадресные   (multicast).   Однозначный   адрес   указывает  на  один  интерфейс  узла,
       широковещательный адрес указывает на  все узлы в сети, а многоадресный  указывает  на  все
       узлы  многоадресной  (multicast  group).  Дейтаграммы  могут посылаться или приниматься по
       широковещательным адресам только, если для сокета установлен флаг SO_BROADCAST. В  текущей
       реализации  сокетам,  ориентированным  на  соединения,  разрешено иметь только однозначные
       адреса.

       Заметим, что значение адреса и порта всегда хранится в сетевом порядке байт. В  частности,
       это  означает,  что требуется вызывать htons(3) для числа, обозначающего порт. Все функции
       из стандартной библиотеки, используемые для работы с адресами/портами, используют  сетевой
       порядок байт.

       Есть  несколько  специальных  адресов:  INADDR_LOOPBACK  (127.0.0.1)  всегда  ссылается на
       локальный узел через интерфейс обратной петли; INADDR_ANY (0.0.0.0) означает  любой  адрес
       для  связывания; INADDR_BROADCAST (255.255.255.255) означает любой узел и, по историческим
       причинам, при связывании подобен INADDR_ANY.

   Параметры сокета
       IP поддерживает некоторые параметры сокета, относящиеся к протоколу,  которые  могут  быть
       установлены  с помощью setsockopt(2) и прочитаны с помощью getsockopt(2). Значением уровня
       (level) параметров сокета для IP является IPPROTO_IP. Логический флаг в виде целого  числа
       со значением ноль означает «ложь», другие значения — «истина».

       Если сокету передается неправильный параметр, то getsockopt(2) и setsockopt(2) завершаются
       с ошибкой ENOPROTOOPT.

       IP_ADD_MEMBERSHIP (начиная с Linux 1.2)
              Присоединиться к многоадресной группе. В аргументе указывается структура ip_mreqn.

           struct ip_mreqn {
               struct in_addr imr_multiaddr; /* IP-адрес группы */
               struct in_addr imr_address;   /* IP локального
                                                интерфейса */
               int            imr_ifindex;   /* индекс интерфейса */
           };

       В imr_multiaddr содержится адрес многоадресной группы, в которую  приложение  хочет  войти
       или  выйти.  Это  должен быть правильный адрес многоадресной рассылки (иначе setsockopt(2)
       завершится с ошибкой EINVAL). В imr_address указывается адрес локального интерфейса, через
       который  система должна войти в многоадресную группу; если указано значение INADDR_ANY, то
       нужный интерфейс выбирается системой  самостоятельно.  В  imr_ifindex  указывается  индекс
       интерфейса,  через который нужно войти/выйти в группу imr_multiaddr, или 0, если интерфейс
       может быть любым.

              Структура ip_mreqn доступна только начиная с Linux 2.2. Для  совместимости,  старая
              структура   ip_mreq  (существует  с  Linux  1.2)  по-прежнему  поддерживается;  она
              отличается от ip_mreqn только  отсутствием  поля  imr_ifindex  (при  передаче  ядро
              определяет нужную структуру исходя из размера, переданного в optlen).

              IP_ADD_MEMBERSHIP допустим только для setsockopt(2).

       IP_ADD_SOURCE_MEMBERSHIP (since Linux 2.4.22 / Linux 2.5.68)
              Присоединиться  к  многоадресной  группе  и  разрешить  принимать  данные только из
              указанного источника. Аргументом является структура ip_mreq_source.

           struct ip_mreq_source {
               struct in_addr imr_multiaddr;  /* IP многоадресной
                                                 группы */
               struct in_addr imr_interface;  /* IP-адрес локального
                                                 интерфейса */
               struct in_addr imr_sourceaddr; /* IP-адрес многоадресного
                                                 источника */
           };

       The ip_mreq_source structure is similar to  ip_mreqn  described  under  IP_ADD_MEMBERSHIP.
       The  imr_multiaddr field contains the address of the multicast group the application wants
       to join or leave.  The imr_interface field is the address  of  the  local  interface  with
       which  the  system  should  join  the  multicast group.  Finally, the imr_sourceaddr field
       contains the address of the source the application wants to receive data from.

              Для приёма  данных  из  нескольких  источников  этот  параметр  можно  использовать
              несколько раз.

       IP_BIND_ADDRESS_NO_PORT (начиная с Linux 4.2)
              Информирует  ядро,  что не требуется резервировать эфемерный порт при использовании
              bind(2) с номером порта 0. Позднее, порт будет автоматически выбран при connect(2);
              это позволяет использовать общий исходящий порт пока уникальна связка 4-х значений.

       IP_BLOCK_SOURCE (начиная с Linux 2.4.22 / 2.5.68)
              Прекратить  приём многоадресных данных из указанного источника заданной группы. Это
              допустимо,  если  приложение  подписывалось  на  многоадресную  группу  с   помощью
              IP_ADD_MEMBERSHIP или IP_ADD_SOURCE_MEMBERSHIP.

              Аргументом    является    структура   ip_mreq_source,   описанная   в   разделе   о
              IP_ADD_SOURCE_MEMBERSHIP.

       IP_DROP_MEMBERSHIP (начиная с Linux 1.2)
              Выйти из многоадресной группы. Аргументом является структура ip_mreqn или  ip_mreq,
              описана в IP_ADD_MEMBERSHIP.

       IP_DROP_SOURCE_MEMBERSHIP (начиная с Linux 2.4.22 / 2.5.68)
              Leave  a  source-specific group—that is, stop receiving data from a given multicast
              group that come from a given source.  If the application has subscribed to multiple
              sources  within  the  same  group,  data  from  the remaining sources will still be
              delivered.   To   stop   receiving   data   from   all   sources   at   once,   use
              IP_DROP_MEMBERSHIP.

              Аргументом    является    структура   ip_mreq_source,   описанная   в   разделе   о
              IP_ADD_SOURCE_MEMBERSHIP.

       IP_FREEBIND (начиная с Linux 2.4)
              Этот логический параметр позволяет привязаться (если  значение  равно  «истина»)  к
              IP-адресу,  который  не  является локальным или (пока) не существует. Это позволяет
              прослушивать сокет, не  имея  нижележащего  сетевого  интерфейса  или  назначенного
              динамического  IP-адреса,  которых  может  ещё  не  быть, когда приложение пытается
              связаться с ним.  Этот  параметр  имеет  эквивалентный  интерфейс  ip_nonlocal_bind
              (описан далее) в /proc на каждый сокет.

       IP_HDRINCL (начиная с Linux 2.0)
              Если  значение  равно «истина», то это означает, что пользователь добавил заголовок
              IP в начало своих данных. Допустим только для  сокетов  SOCK_RAW;  более  подробную
              информацию  смотрите  в  raw(7).  Если  этот флаг установлен, то значения, заданные
              параметрами IP_OPTIONS, IP_TTL и IP_TOS, игнорируются.

       IP_MSFILTER (начиная с Linux 2.4.22 / 2.5.68)
              Этот  параметр  предоставляет  доступ  к   расширенному   программному   интерфейсу
              фильтрации. Аргументом является структура ip_msfilter.

           struct ip_msfilter {
               struct in_addr imsf_multiaddr; /* IP-адрес
                                                 многоадресной группы */
               struct in_addr imsf_interface; /* IP-адрес локального
                                                 интерфейса */
               uint32_t       imsf_fmode;     /* Режим фильтрации */

               uint32_t       imsf_numsrc;    /* Количество источников в
                                                 следующем массиве */
               struct in_addr imsf_slist[1];  /* Массив адресов
                                                 источников */
           };

       Для  задания  режима  фильтрации  существует  два макроса — MCAST_INCLUDE и MCAST_EXCLUDE.
       Также, существует макрос IP_MSFILTER_SIZE(n), которым можно определить количество  памяти,
       требуемой для хранения структуры ip_msfilter с n источниками в списке источников.

              Полное описание фильтрации многоадресных источников групп смотрите в RFC 3376.

       IP_MTU (начиная с Linux 2.2)
              Возвращает  известное  в  данный  момент  значение  MTU  маршрута  текущего сокета.
              Возвращается целое число.

              Параметр IP_MTU допускается только для getsockopt(2) и может использоваться  только
              для подключённого сокета.

       IP_MTU_DISCOVER (начиная с Linux 2.2)
              Устанавливает  или возвращает значение Path MTU Discovery (обнаружение значения MTU
              маршрута) для сокета. Если он установлен, то Linux  будет  производить  обнаружение
              значения  MTU  маршрута  для  сокетов SOCK_STREAM согласно RFC 1191. Для сокетов не
              SOCK_STREAM  при  значении  IP_PMTUDISC_DO   у   всех   исходящих   пакетов   будет
              устанавливаться  флаг  запрета  фрагментации. Ответственность за разбивку данных на
              пакеты согласно размеру MTU, и за выполнение, при необходимости, повторной передачи
              данных,  лежит  на  пользователе. Ядро будет отвергать пакеты (с ошибкой EMSGSIZE),
              размер  которых  больше  текущего   значения   MTU   у   маршрута.   При   значении
              IP_PMTUDISC_WANT   дейтаграмма   будет   фрагментироваться  по  размеру  MTU,  если
              требуется, иначе устанавливается флаг запрета фрагментации.

              Системное  значение  по  умолчанию  можно  переключать  между  IP_PMTUDISC_WANT   и
              IP_PMTUDISC_DONT,  записывая,  соответственно,  нулевое и ненулевое значение в файл
              /proc/sys/net/ipv4/ip_no_pmtu_disc.

              Значение определения маршрута MTU   Смысл
              IP_PMTUDISC_WANT                    Использовать для каждого маршрута своё значение.
              IP_PMTUDISC_DONT                    Никогда не выполнять обнаружение значения MTU маршрута.
              IP_PMTUDISC_DO                      Всегда выполнять обнаружение значения MTU маршрута.
              IP_PMTUDISC_PROBE                   Установить DF, но игнорировать маршрут MTU.

              Если значение Path MTU Discovery  задано,  то  ядро  автоматически  следит  за  MTU
              маршрута   для  каждого  удалённого  узла.  Когда  с  некоторым  узлом  установлено
              соединение с помощью connect(2), текущее значение MTU маршрута можно легко получить
              через  параметр  сокета  IP_MTU  (например,  после  возникновения ошибки EMSGSIZE).
              Значение MTU может со временем меняться. Для сокетов без  установления  соединения,
              которые  имеют  несколько  узлов-получателей, новое значение MTU для заданного узла
              назначения может быть получено с помощью очереди ошибок (смотрите IP_RECVERR).  При
              каждом  входящем  сообщении  об  обновлении  MTU  в очередь будет добавляться новая
              ошибка.

              Во время процесса обнаружения MTU начальные пакеты от  дейтаграмных  сокетов  могут
              быть отброшены. Приложения, использующие UDP, должны учитывать это и не думать, что
              эти пакеты будут переданы повторно.

              Чтобы запустить процесс обнаружения  MTU  маршрута  для  сокетов  без  установления
              соединения   сначала  можно  установить  большой  размер  дейтаграммы  (с  размером
              заголовка до 64 килобайт) и сокращать его при изменении MTU маршрута.

              Чтобы получить начальную  оценку  MTU  маршрута,  соедините  дейтаграмный  сокет  с
              адресом  назначения,  используя  connect(2),  и  узнайте  значение MTU путем вызова
              getsockopt(2) с параметром IP_MTU.

              Возможно реализовать обнаружение MTU согласно  RFC  4821  с  помощью  сокетов  типа
              SOCK_DGRAM  или SOCK_RAW, установив значение IP_PMTUDISC_PROBE (доступно, начиная с
              Linux 2.6.22). В частности, это также полезно для инструментов  диагностики,  таких
              как  tracepath(8),  которым  нужно  умышленно  посылать проверочные пакеты большего
              размера, чем исследуемый Path MTU.

       IP_MULTICAST_ALL (since Linux 2.6.31)
              Может использоваться для изменения  политики  доставки  многоадресных  сообщений  в
              сокеты,  подсоединённые  к  шаблонному  (wildcard)  адресу  INADDR_ANY.  Аргументом
              является логическое целое (по умолчанию 1). Если значение равно 1, то  сокет  будет
              принимать сообщения от всех групп, к которым было выполнено присоединение глобально
              всей системы. В противном случае будут доставляться сообщения от групп,  к  которым
              было  выполнено  присоединение явным образом(например, с помощью IP_ADD_MEMBERSHIP)
              на этом сокете.

       IP_MULTICAST_IF (начиная с Linux 1.2)
              Назначает локальное устройство  для  многоадресного  группового  сокета  (multicast
              socket).  Аргументом  для  setsockopt(2)  является  структура  ip_mreqn или ip_mreq
              (начиная с Linux  3.5),  подобная  IP_ADD_MEMBERSHIP  или  структуре  in_addr  (при
              передаче ядро определяет нужную структуру исходя из размера, переданного в optlen).
              Для getsockopt(2) аргументом является структура in_addr.

       IP_MULTICAST_LOOP (начиная с Linux 1.2)
              Устанавливает или возвращает логический флаг в виде целого числа, в зависимости  от
              того,  будут  ли  пакеты, использующие многоадресную адресацию, закольцовываться на
              локальные сокеты.

       IP_MULTICAST_TTL (начиная с Linux 1.2)
              Устанавливает или возвращает  значение  времени  существования  (time-to-live)  для
              многоадресных   исходящих  из  этого  сокета  пакетов,  использующих  многоадресную
              адресацию.  Для  подобных  пакетов  очень  важно  установить  наименьшее  возможное
              значение  TTL.  По  умолчанию  оно равно 1, это значит, что многоадресные пакеты не
              выйдут за пределы локальной сети, если только пользовательская  программа  явно  не
              попросит этого. Значением аргумента является целое число.

       IP_NODEFRAG (начиная с Linux 2.6.36)
              Если  установлен  (аргумент  не  равен  нулю),  то  на уровне netfilter запрещается
              выполнять переборку (reassembly) исходящих пакетов.  Значением  аргумента  является
              целое число.

              Этот параметр допускается только для сокетов с типом SOCK_RAW.

       IP_OPTIONS (начиная с Linux 2.0)
              Set  or  get  the  IP  options  to be sent with every packet from this socket.  The
              arguments are a pointer to a memory buffer containing the options  and  the  option
              length.  The setsockopt(2)  call sets the IP options associated with a socket.  The
              maximum option size for IPv4 is 40 bytes.  See RFC 791  for  the  allowed  options.
              When  the  initial  connection  request packet for a SOCK_STREAM socket contains IP
              options, the IP options will be set automatically to the options from  the  initial
              packet  with  routing headers reversed.  Incoming packets are not allowed to change
              options after the connection is established.  The processing of all incoming source
              routing   options  is  disabled  by  default  and  can  be  enabled  by  using  the
              accept_source_route /proc interface.   Other  options  like  timestamps  are  still
              handled.   For  datagram  sockets,  IP  options  can be set only by the local user.
              Calling getsockopt(2)  with IP_OPTIONS puts the current IP options used for sending
              into the supplied buffer.

       IP_PASSSEC (since Linux 2.6.17)
              If labeled IPSEC or NetLabel is configured on the sending and receiving hosts, this
              option enables receiving of the security context of the peer socket in an ancillary
              message  of type SCM_SECURITY retrieved using recvmsg(2).  This option is supported
              only for UDP sockets;  for  TCP  or  SCTP  sockets,  see  the  description  of  the
              SO_PEERSEC option below.

              Значение   передаётся   в  аргументе  setsockopt(2)  и  возвращается  в  результате
              getsockopt(2) в виде целочисленного логического флага.

              The security context returned in the SCM_SECURITY ancillary message is of the  same
              format as the one described under the SO_PEERSEC option below.

              Note:  the  reuse of the SCM_SECURITY message type for the IP_PASSSEC socket option
              was likely a mistake, since other IP  control  messages  use  their  own  numbering
              scheme  in  the  IP  namespace and often use the socket option value as the message
              type.  There is no conflict currently since the IP option with the  same  value  as
              SCM_SECURITY is IP_HDRINCL and this is never used for a control message type.

       IP_PKTINFO (начиная с Linux 2.2)
              Pass  an  IP_PKTINFO  ancillary  message  that  contains  a  pktinfo structure that
              supplies some information about the incoming packet.  This works only for  datagram
              oriented  sockets.   The  argument  is  a  flag  that  tells the socket whether the
              IP_PKTINFO  message  should  be  passed  or  not.   The  message  itself   can   be
              sent/retrieved  only  as  a  control  message  with  a  packet using recvmsg(2)  or
              sendmsg(2).

                  struct in_pktinfo {
                      unsigned int   ipi_ifindex;  /* индекс интерфейса */
                      struct in_addr ipi_spec_dst; /* локальный адрес */
                      struct in_addr ipi_addr;     /* заголовок адреса
                                                      назначения */
                  };

              ipi_ifindex это уникальный индекс интерфейса, из которого был получен  этот  пакет.
              ipi_spec_dst это локальный адрес пакета, а ipi_addr это адрес назначения, указанный
              в заголовке пакета. Если параметр IP_PKTINFO передаётся в sendmsg(2) и ipi_spec_dst
              не  равно нулю, то ipi_spec_dst будет использован как локальный адрес источника при
              просмотре таблицы маршрутизации и  для  установки  IP-параметров  маршрутизации  от
              источника.  Если  значение  ipi_ifindex  не  равно  нулю,  то  при поиске в таблице
              маршрутизации вместо значения ipi_spec_dst используется первичный  локальный  адрес
              интерфейса с указанным индексом.

       IP_RECVERR (начиная с Linux 2.2)
              Делает  передачу сообщений об ошибках более надёжной. Если этот параметр установлен
              для дейтаграмного сокета, то все возникающие  ошибки  будут  поставлены  в  очередь
              ошибок,  свою  для  каждого  сокета.  Для  получения  ошибки при операции с сокетом
              пользователь  может  воспользоваться  вызовом  recvmsg(2)  с  установленным  флагом
              MSG_ERRQUEUE.  Структура  sock_extended_err,  описывающая  ошибку, будет передана в
              вспомогательном сообщении с типом IP_RECVERR и уровнем  IPPROTO_IP.  Этот  параметр
              полезен  для  надежной  обработки ошибок для сокетов без установления соединения. В
              пакете с ошибкой из очереди ошибок, также содержится порция полученных данных.

              Вспомогательное сообщение IP_RECVERR содержит структуру sock_extended_err:

                  #define SO_EE_ORIGIN_NONE    0
                  #define SO_EE_ORIGIN_LOCAL   1
                  #define SO_EE_ORIGIN_ICMP    2
                  #define SO_EE_ORIGIN_ICMP6   3

                  struct sock_extended_err {
                      uint32_t ee_errno;   /* номер ошибки */
                      uint8_t  ee_origin;  /* где возникла ошибка */
                      uint8_t  ee_type;    /* тип */
                      uint8_t  ee_code;    /* код */
                      uint8_t  ee_pad;
                      uint32_t ee_info;    /* дополнительная информация */
                      uint32_t ee_data;    /* другие данные */
                      /* Дальше могут следовать данные */
                  };

                  struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);

              В ee_errno содержится номер ошибки в очереди. В ee_origin содержится код  источника
              ошибки.  Значение  остальных  полей  зависит  от  протокола.  Макрос SO_EE_OFFENDER
              возвращает указатель на адрес сетевого объекта, в котором возникла ошибка, согласно
              указанному  указателю  на вспомогательное сообщение. Если адрес неизвестен, то поле
              sa_family структуры sockaddr содержит  AF_UNSPEC,  и  остальные  поля  sockaddr  не
              определены.

              Для  IP  структура  sock_extended_err используется следующим образом: значение поля
              ee_origin устанавливается в SO_EE_ORIGIN_ICMP, если ошибка получена из пакета ICMP,
              или  в  SO_EE_ORIGIN_LOCAL,  если  возникла  локальная ошибка. Неизвестные значения
              следует игнорировать. Значения полей ee_type и ee_code  устанавливаются  исходя  из
              значений  полей  типа  и  кода  заголовка  ICMP.  При ошибках EMSGSIZE поле ee_info
              содержит обнаруженную величину MTU. Сообщение также содержит структуру  sockaddr_in
              узла,  вызвавшего  ошибку,  которая  доступна  через  макрос  SO_EE_OFFENDER.  Если
              источник  неизвестен,   то   поле   sin_family   адреса,   возвращённого   макросом
              SO_EE_OFFENDER,  содержит  значение AF_UNSPEC. Если ошибка  возникла в сети, то все
              параметры IP (IP_OPTIONS, IP_TTL и т.д.), которые используются сокетом и содержатся
              в  пакете  с  описанием ошибки, передаются в управляющих сообщениях. Данные пакета,
              вызвавшего ошибку, возвращаются как нормальные данные.  Заметьте,  что  у  TCP  нет
              очереди ошибок; флаг MSG_ERRQUEUE нельзя использовать для сокетов типа SOCK_STREAM.
              Параметр IP_RECVERR допустим для TCP,  но  все  ошибки  возвращаются  только  через
              функцию сокета или через параметр SO_ERROR.

              For  raw  sockets,  IP_RECVERR  enables  passing of all received ICMP errors to the
              application, otherwise errors are reported only on connected sockets

              Этот параметр устанавливается или возвращается как логический флаг  в  виде  целого
              числа. По умолчанию, параметр IP_RECVERR выключен.

       IP_RECVOPTS (начиная с Linux 2.2)
              Передает  пользователю  все  входящие параметры IP с помощью управляющего сообщения
              IP_OPTIONS. Для  локального  узла  заполняется  заголовок  маршрутизации  и  другие
              параметры. Не поддерживается сокетами типа SOCK_STREAM.

       IP_RECVORIGDSTADDR (начиная с Linux 2.6.29)
              Данный  логический  параметр  включает  вспомогательное  сообщение IP_ORIGDSTADDR в
              recvmsg(2), в котором ядро возвращает первоначальный  адрес  назначения  полученной
              дейтаграммы. Вспомогательное сообщение содержит структуру struct sockaddr_in.

       IP_RECVTOS (начиная с Linux 2.2)
              Если  включён,  то вместе с входящими пакетами передаётся вспомогательное сообщение
              IP_TOS. В нём содержится байт, в котором указано поле  типа  сервиса/приоритета  из
              заголовка пакета. Ожидается логическое значение в виде целого числа.

       IP_RECVTTL (начиная с Linux 2.2)
              Если указан этот флаг, то передаётся управляющее сообщение IP_TTL с байтом значения
              поля времени существования из полученного  пакета  в  виде  32-битного  целого.  Не
              поддерживается сокетами типа SOCK_STREAM.

       IP_RETOPTS (начиная с Linux 2.2)
              Идентичен параметру IP_RECVOPTS, но возвращает необработанные параметры, причём без
              заполненных временных меток и записи о маршрутизации до этой точки (hop).

       IP_ROUTER_ALERT (начиная с Linux 2.2)
              Pass all to-be forwarded packets with the  IP  Router  Alert  option  set  to  this
              socket.   Valid only for raw sockets.  This is useful, for instance, for user-space
              RSVP daemons.  The tapped packets are not forwarded by the kernel; it is the user's
              responsibility to send them out again.  Socket binding is ignored, such packets are
              filtered only by protocol.  Expects an integer flag.

       IP_TOS (начиная с Linux 1.0)
              Устанавливает или получает значение поля Type-Of-Service (TOS, тип сервиса) каждого
              IP-пакета,  который  отсылается  с этого сокета. Это поле используется для указания
              приоритета пакета в сети. Значение TOS хранится в одном байте. Существует несколько
              стандартных  флагов  TOS:  IPTOS_LOWDELAY  — для минимизации задержки передаваемого
              трафика,   IPTOS_THROUGHPUT   —    для    оптимизации    пропускной    способности,
              IPTOS_RELIABILITY  —  для  увеличения  надёжности,  IPTOS_MINCOST  —  при пересылки
              данных, для которых неважна скорость передачи. Может быть указано не  более  одного
              из  этих  значений  TOS.  Все  другие биты являются недействительными и должны быть
              обнулены. По умолчанию, Linux посылает дейтаграммы  с  IPTOS_LOWDELAY  первыми,  но
              точное поведение зависит от настроенного порядка очередности (queueing discipline).
              Для установки некоторых высокоприоритетных типов сервиса могут потребоваться  права
              суперпользователя (мандат CAP_NET_ADMIN).

       IP_TRANSPARENT (начиная с Linux 2.6.24)
              Установка этого логического параметра включает прозрачное проксирование на заданный
              сокет.  Данный  параметр  сокета  позволяет  вызвавшему  приложению  привязаться  к
              нелокальному  IP-адресу  и  работать  клиентом  и  сервером с внешним адресом как с
              локальной конечной точкой. ЗАМЕЧАНИЕ: требуется настройка маршрутизации пакетов для
              внешнего  адреса  через  TProxy (то есть, системы, на которой находится приложение,
              применяющее параметр сокета IP_TRANSPARENT). Для установки данного параметра сокета
              требуются права суперпользователя (мандат CAP_NET_ADMIN).

              Также,   для  установки  данного  параметра  на  перенаправляемый  сокет  требуется
              перенаправление TProxy с помощью цели TPROXY в iptables.

       IP_TTL (начиная с Linux 1.0)
              Устанавливает или получает текущее значение поля  времени  существования  (time  to
              live), которое указывается в каждом пакете, отсылаемом с этого сокета.

       IP_UNBLOCK_SOURCE (начиная с Linux 2.4.22 / 2.5.68)
              Разблокировать    ранее    заблокированный   многоадресный   источник.   Возвращает
              EADDRNOTAVAIL, если указанный источник не заблокирован.

              Аргументом   является   структура   ip_mreq_source,   описанная   в    разделе    о
              IP_ADD_SOURCE_MEMBERSHIP.

       SO_PEERSEC (since Linux 2.6.17)
              If labeled IPSEC or NetLabel is configured on both the sending and receiving hosts,
              this read-only socket option returns  the  security  context  of  the  peer  socket
              connected  to  this  socket.   By  default,  this  will be the same as the security
              context of the process that created the peer socket unless overridden by the policy
              or by a process with the required permissions.

              The  argument to getsockopt(2)  is a pointer to a buffer of the specified length in
              bytes into which the security context string will be copied.  If the buffer  length
              is less than the length of the security context string, then getsockopt(2)  returns
              -1, sets errno to ERANGE, and returns the required length via optlen.   The  caller
              should  allocate at least NAME_MAX bytes for the buffer initially, although this is
              not guaranteed to be sufficient.  Resizing the buffer to the  returned  length  and
              retrying may be necessary.

              The  security  context  string  may  include  a  terminating  null character in the
              returned length, but is not guaranteed to do so: a security context "foo" might  be
              represented  as either {'f','o','o'} of length 3 or {'f','o','o','\0'} of length 4,
              which are considered to be interchangeable.  The  string  is  printable,  does  not
              contain  non-terminating  null  characters,  and  is in an unspecified encoding (in
              particular, it is not guaranteed to be ASCII or UTF-8).

              The use of this option for sockets in the AF_INET address family is supported since
              Linux 2.6.17 for TCP sockets, and since Linux 4.17 for SCTP sockets.

              For  SELinux,  NetLabel conveys only the MLS portion of the security context of the
              peer across the wire, defaulting the rest of the security  context  to  the  values
              defined  in  the policy for the netmsg initial security identifier (SID).  However,
              NetLabel can be configured to pass full security contexts over  loopback.   Labeled
              IPSEC  always  passes  full  security contexts as part of establishing the security
              association (SA) and looks them up based on the association for each packet.

   Интерфейс /proc
       Настройку глобальных параметров протокола IP можно осуществлять через интерфейс /proc. Все
       параметры  доступны  посредством чтения или записи файлов из каталога /proc/sys/net/ipv4/.
       Для логических (Boolean) параметров значения указываются в  виде  целых  чисел:  ненулевое
       значение («истина») означает включает параметра, а нулевое значение («ложь») — выключение.

       ip_always_defrag (Boolean; начиная с Linux 2.2.13)
              [New  with  Linux 2.2.13; in earlier kernel versions this feature was controlled at
              compile time by the CONFIG_IP_ALWAYS_DEFRAG option; this option is not  present  in
              Linux 2.4.x and later]

              Если  этот  флаг  включён  (не  равен  0), то входящие фрагменты (части IP-пакетов,
              которые  образуются,  если  некоторый  узел,  находящийся  между   отправителем   и
              получателем,  решает,  что  пакеты  слишком велики и разделяет их на кусочки) будут
              снова собраны (дефрагментированны)  перед  дальнейшей  обработкой,  даже  если  они
              должны быть пересланы дальше.

              Включайте  этот параметр только на межсетевом экране, который является единственной
              связью с вашей сетью, или на прозрачном прокси; никогда не включайте его на обычном
              маршрутизаторе  или  узле. В противном случае, соединение может быть нарушено, если
              фрагменты передаются по различным линиям. Дефрагментация также требует много памяти
              и процессорного времени.

              Этот  параметр  включается автоматически при настройке маскарадинга или прозрачного
              проксирования.

       ip_autoconfig (since Linux 2.2 to Linux 2.6.17)
              Не описан.

       ip_default_ttl (integer; по умолчанию: 64; начиная с Linux 2.2)
              Устанавливает  значение  time-to-live  по  умолчанию  для  исходящих  пакетов.  Это
              значение  может  быть  изменено  для  каждого отдельного сокета с помощью параметра
              IP_TTL.

       ip_dynaddr (Boolean; по умолчанию: выключен; начиная с Linux 2.0.31)
              Включает динамическую адресацию  сокета  и  подмену  (masquerading)  при  изменении
              адреса  интерфейса. Это полезно для интерфейсов коммутируемых соединений (dialup) с
              изменяющимися IP-адресами. Значение 0 означает не подменять, 1 включает подмену и 2
              включает режим подробностей работы.

       ip_forward (Boolean; по умолчанию: выключен; начиная с Linux 1.2)
              Включает/выключает пересылку (forwarding) IP-пакетов. Пересылка IP также может быть
              включена для каждого интерфейса в отдельности.

       ip_local_port_range (начиная с Linux 2.2)
              This file contains two integers that define the default local port range  allocated
              to  sockets  that are not explicitly bound to a port number—that is, the range used
              for ephemeral ports.  An ephemeral port is allocated to a socket in  the  following
              circumstances:

              •  при вызове bind(2) в номере порта адреса сокета указан 0;

              •  Вызов listen(2) вызван для потокового сокета, который ещё не привязан;

              •  Вызов connect(2) вызван для сокета, который ещё не привязан;

              •  Вызов sendto(2) вызван для дейтаграмного сокета, который ещё не привязан.

              Выделение  эфемерных  портов  начинается  с  первого  числа в ip_local_port_range и
              заканчивается  вторым  числом.  Если  диапазон  эфемерных  портов  закончился,   то
              соответствующий системный вызов вернёт ошибку (но смотрите ДЕФЕКТЫ).

              Заметим,  что  диапазон  портов  в  ip_local_port_range  не  должен конфликтовать с
              портами, используемыми для маскарадинг (хотя это проверяется). Также,  произвольные
              значения  могут  вызвать  проблемы  с  некоторыми  пакетными  фильтрами  межсетевых
              экранов, которые делают предположения  об  используемых  локальных  портах.  Первое
              число должно быть не менее 1024, или лучше более 4096, чтобы не пересекаться с всем
              известными портами и минимизировать проблемы с межсетевыми экранами.

       ip_no_pmtu_disc (Boolean; по умолчанию: выключен; начиная с Linux 2.2)
              Если включён, то, по умолчанию, не производится обнаружение значения MTU у маршрута
              для  TCP  сокетов.  Обнаружение  MTU  маршрута  может  завершиться  с ошибкой из-за
              встретившихся на пути неверно настроенных межсетевых экранов  (которые  отбрасывают
              все  пакеты  ICMP)  или из-за неверно настроенных интерфейсов (например, соединение
              точка-точка,  у  которого  оба  конца  не  договорились  о  MTU).  Лучше  исправить
              встреченные на пути неисправные маршрутизаторы, чем глобально отключать обнаружение
              MTU маршрута, потому что это отключение приведёт к высокой нагрузке на сеть.

       ip_nonlocal_bind (Boolean; по умолчанию: выключен; начиная с Linux 2.4)
              Если установлен, то это позволяет процессам привязываться (bind(2))  к  нелокальным
              IP-адресам,   что  полезно,  но  может  привести  к  неработоспособности  некоторых
              приложений.

       ip6frag_time (integer; по умолчанию: 30)
              Время в секундах, на которое фрагмент IPv6 остаётся в памяти.

       ip6frag_secret_interval (integer; по умолчанию: 600)
              Интервал регенерации (в секундах) контрольной  суммы  секрета  (hash  secret)  (или
              время существования контрольной суммы секрета) фрагментов IPv6.

       ipfrag_high_thresh (integer), ipfrag_low_thresh (integer)
              Если   количество   фрагментов   IP,   стоящих   в   очереди,   достигает  значения
              ipfrag_high_thresh,  то  очередь  укорачивается  до   значения   ipfrag_low_thresh.
              Содержит целое число, означающее количество байт.

       neigh/*
              Смотрите в arp(7).

   Вызовы ioctl
       Все вызовы ioctl, описанные в socket(7), применимы к ip.

       Вызовы ioctl для настройки общих параметров устройств описаны в netdevice(7).

ОШИБКИ

       EACCES Пользователь  попытался  выполнить действие, не имея на это необходимых полномочий.
              Примеры  таких  действий:  посылка  пакета   по   широковещательному   адресу   без
              предварительной  установки  флага  SO_BROADCAST;  посылка  пакета  по  запрещённому
              маршруту; изменение настроек межсетевого  экрана  не  имея  прав  суперпользователя
              (мандата CAP_NET_ADMIN); связывание сокета с зарезервированным портом, не имея прав
              суперпользователя (мандата CAP_NET_BIND_SERVICE).

       EADDRINUSE
              Попытка связать сокет с уже используемым адресом.

       EADDRNOTAVAIL
              Был запрошен несуществующий интерфейс или запрошенный исходящий адрес  не  является
              локальным.

       EAGAIN Действие над неблокирующим сокетом привело бы к его блокировке.

       EALREADY
              Операция соединения на неблокирующем сокете уже находится в процессе выполнения.

       ECONNABORTED
              Соединение закрыто во время accept(2).

       EHOSTUNREACH
              В  таблице маршрутизации нет допустимых записей, соответствующих адресу назначения.
              Эта ошибка может возникнуть из-за ICMP-сообщения от удалённого  маршрутизатора  или
              из-за локальной таблицы маршрутизации.

       EINVAL Передан  недопустимый  аргумент. При операциях отправки эта ошибка может возникнуть
              из-за передачи по маршруту чёрная дыра (blackhole).

       EISCONN
              Вызов connect(2) запущен для сокета, уже установившего соединение.

       EMSGSIZE
              Дейтаграмма больше значения MTU на маршруте, и она не может быть фрагментирована.

       ENOBUFS, ENOMEM
              Недостаточно свободной памяти. Часто это означает, что выделение памяти  ограничено
              не размером системной памяти, а границами буфера сокета, но это не всегда так.

       ENOENT Для сокета вызван SIOCGSTAMP, но он ещё не получил ни одного пакета.

       ENOPKG Не настроена подсистема ядра.

       ENOPROTOOPT и EOPNOTSUPP
              Передан недопустимый параметр сокета.

       ENOTCONN
              Операция  определена  только  для сокета, установившего соединение, а этот сокет не
              соединён.

       EPERM  У пользователя нет  достаточных  полномочий,  чтобы  повысить  приоритет,  изменить
              настройку или послать сигнал запрашиваемому процессу или группе процессов.

       EPIPE  Соединение неожиданно закрылось или завершено (shut down) другой стороной.

       ESOCKTNOSUPPORT
              Сокет не настроен или запрошен неизвестный тип сокета.

       Протоколами  более  высокого  уровня  могут генерироваться другие ошибки; смотрите tcp(7),
       raw(7), udp(7) и socket(7).

ЗАМЕЧАНИЯ

       IP_FREEBIND,  IP_MSFILTER,  IP_MTU,   IP_MTU_DISCOVER,   IP_RECVORIGDSTADDR,   IP_PASSSEC,
       IP_PKTINFO, IP_RECVERR, IP_ROUTER_ALERT, and IP_TRANSPARENT are Linux-specific.

       Будьте  осторожны  при  использовании  параметра  SO_BROADCAST  —  в  Linux он не является
       привилегированным. Если небрежно относиться к широковещательным сообщениям, то можно легко
       перегрузить  сеть.  В  новых  протоколах  для  приложений лучше использовать многоадресные
       рассылки вместо широковещательных. Не используйте широковещание.

       Для  определения  адреса  назначения  и  интерфейса  полученных  дейтаграмм  в   некоторые
       реализациях  сокетов  BSD введены параметры сокетов IP_RCVDSTADDR и IP_RECVIF. В Linux для
       этой цели есть общий параметр IP_PKTINFO.

       В некоторых реализациях сокетов BSD также есть  параметр  IP_RECVTTL,  но  вспомогательное
       сообщение  с  типом  IP_RECVTTL  передаётся с входным пакетом. В этом отличие от параметра
       IP_TTL, используемого в Linux.

       Использование уровня параметров сокета SOL_IP непереносимо  —  в  BSD-стеках  используется
       уровень IPPROTO_IP.

       INADDR_ANY  (0.0.0.0) and INADDR_BROADCAST (255.255.255.255) are byte-order-neutral.  This
       means htonl(3)  has no effect on them.

   Совместимость
       Для совместимости с Linux 2.0 устаревший синтаксис socket(AF_INET, SOCK_PACKET,  protocol)
       всё  ещё  поддерживается  для  открытия  сокетов  типа  packet(7).  Такое использование не
       поощряется и должно быть  заменено  на  socket(AF_PACKET,  SOCK_RAW,  protocol).  Основное
       различие  между  ними  в  новой  адресной  структуре  sockaddr_ll (вместо старой структуры
       sockaddr_pkt), хранящей информацию обобщённого уровня соединения.

ДЕФЕКТЫ

       Слишком много противоречий в значениях ошибок.

       Ошибка, используемая при диагностике исчерпания диапазона эфемерных портов,  отличается  в
       различных  системных  вызовах  (connect(2),  bind(2),  listen(2),  sendto(2)),  из-за чего
       эфемерные порты могут быть назначены.

       Не описаны ioctl для настройки специальных параметров IP для интерфейса и таблиц ARP.

       Receiving the original destination address with MSG_ERRQUEUE  in  msg_name  by  recvmsg(2)
       does not work in some Linux 2.2 kernels.

СМ. ТАКЖЕ

       recvmsg(2),  sendmsg(2),  byteorder(3),  capabilities(7),  icmp(7), ipv6(7), netdevice(7),
       netlink(7), raw(7), socket(7), tcp(7), udp(7), ip(8)

       The kernel source file Documentation/networking/ip-sysctl.txt.

       Первоначальная спецификация IP описана в RFC 791. В  RFC 1122  определены  требования  для
       узлов IPv4. В RFC 1812 определены требования для маршрутизаторов IPv4.

ПЕРЕВОД

       Русский    перевод    этой    страницы    руководства    был    сделан   Azamat   Hackimov
       <azamat.hackimov@gmail.com>,   Dmitriy   S.   Seregin   <dseregin@59.ru>,   Yuri    Kozlov
       <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

       Этот  перевод  является  бесплатной  документацией;  прочитайте  Стандартную  общественную
       лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если  вы  обнаружите  ошибки  в  переводе этой страницы руководства, пожалуйста, отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.