Provided by: manpages-pl_4.21.0-2_all bug

NAZWA

       ip - Implementacja protokołu IPv4 dla systemu Linux

SKŁADNIA

       #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);

OPIS

       Linux  implementuje  protokół  IPv4  opisany  w RFC 791 i RFC 1122. ip zawiera drugi poziom implementacji
       adresowania grupowego (multicasting) zgodny z RFC 1112. Zawiera też  router  IP,  włączając  w  to  filtr
       pakietów.

       Interfejs  programistyczny  jest zgodny z gniazdami BSD. Więcej informacji na temat gniazd można znaleźć,
       przeglądając socket(7).

       Gniazdo IP jest tworzone za pomocą 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.

       Kiedy proces chce odbierać nowe, nadchodzące pakiety lub połączenia, powinien podłączyć gniazdo do adresu
       lokalnego interfejsu za pomocą funkcji bind(2). W takim przypadku do dowolnej lokalnej pary (adres, port)
       można  podłączyć  tylko  jedno  gniazdo  IP.  Gdy  w wywołaniu bind(2) podana jest wartość INADDR_ANY, to
       gniazdo zostanie dowiązane do wszystkich lokalnych interfejsów sieciowych. Gdy do niedowiązanego  gniazda
       wywoływane jest listen(2), to gniazdo zostanie automatycznie dowiązane do losowo wybranego wolnego portu,
       przy czym adres lokalny zostanie  ustawiony  na  INADDR_ANY.  Gdy  dla  niedowiązanego  gniazda  zostanie
       wywołane connect(2), gniazdo to zostanie automatycznie dowiązane do losowo wybranego wolnego portu lub do
       używalnego portu dzielonego, przy czym adres lokalny zostanie ustawiony na INADDR_ANY.

       Przypisywanie (często w literaturze: "nazywanie") lokalnego gniazda  TCP  jest  niemożliwe  przez  pewien
       okres czasu po jego zamknięciu, chyba że zostanie dla tego gniazda ustawiony atrybut SO_REUSEADDR. Należy
       używać tego atrybutu z rozwagą, gdyż czyni on TCP mniej niezawodnym.

   Format adresu
       Adres gniazda IP jest przedstawiony za pomocą kombinacji adresu interfejsu IP i 16-bitowego numeru portu.
       Podstawowy protokół IP nie zawiera numerów portów, są one zaimplementowane w protokołach wyższej warstwy,
       takich jak udp(7) i tcp(7). Dla gniazd surowych sin_port jest ustawione na protokół IP.

           struct sockaddr_in {
               sa_family_t    sin_family; /* rodzina adresów: AF_INET  */
               in_port_t      sin_port;   /* port - sieciowa kolejność bajtów */
               struct in_addr sin_addr;   /* adres internetowy */
           };

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

       sin_family is always set to AF_INET.  This is required; in Linux 2.2  most  networking  functions  return
       EINVAL when this setting is missing.  sin_port contains the port in network byte order.  The port numbers
       below 1024 are called privileged ports (or sometimes: reserved ports).  Only  a  privileged  process  (on
       Linux: a process that has the CAP_NET_BIND_SERVICE capability in the user namespace governing its network
       namespace) may bind(2)  to these sockets.  Note that the raw IPv4 protocol as such has no  concept  of  a
       port, they are implemented only by higher protocols like tcp(7)  and udp(7).

       sin_addr is the IP host address.  The s_addr member of struct in_addr contains the host interface address
       in network byte order.  in_addr should be assigned one of the  INADDR_*  values  (e.g.,  INADDR_LOOPBACK)
       using  htonl(3)   or  set  using  the  inet_aton(3), inet_addr(3), inet_makeaddr(3)  library functions or
       directly with the name resolver (see gethostbyname(3)).

       IPv4 addresses are divided into unicast, broadcast, and multicast addresses.  Unicast addresses specify a
       single  interface  of a host, broadcast addresses specify all hosts on a network, and multicast addresses
       address all hosts in a multicast group.  Datagrams to broadcast addresses can be sent  or  received  only
       when the SO_BROADCAST socket flag is set.  In the current implementation, connection-oriented sockets are
       allowed to use only unicast addresses.

       Należy zauważyć, że dla adresu i portu zawsze jest używana sieciowa  kolejność  bajtów.  W  szczególności
       oznacza  to,  że  trzeba  używać  funkcji  htons(3)  dla  numeru przypisanego do portu. Wszystkie funkcje
       standardowej biblioteki manipulujące adresem/portem automatycznie przekształcają podaną  wartość  na  jej
       sieciową reprezentację.

       Istnieje  kilka  adresów  specjalnych:  INADDR_LOOPBACK  (127.0.0.1) zawsze odnosi się do lokalnego hosta
       poprzez  urządzenie  loopback;  INADDR_ANY   (0.0.0.0)   oznacza   przy   dowiązywaniu   dowolny   adres;
       INADDR_BROADCAST  (255.255.255.255)  oznacza  dowolny  komputer i ze względów historycznych zachowuje się
       przy dowiązywaniu tak samo, jak INADDR_ANY.

   Opcje gniazda
       IP wspiera niektóre opcje specyficzne dla protokołu, które mogą być ustawione przy użyciu setsockopt(2) i
       odczytane  z  pomocą  getsockopt(2). Poziom opcji gniazda dla IP to IPPROTO_IP. Dla każdego ze znaczników
       logicznych wartość całkowita zero oznacza fałsz, a każda inna - prawdę.

       Gdy poda się nieprawidłową opcję gniazda, getsockopt(2) i setsockopt(2) zwrócą błąd ENOPROTOOPT.

       IP_ADD_MEMBERSHIP (od Linuksa 1.2)
              Przyłącza grupę adresów. Argumentem jest struktura ip_mreqn .

           struct ip_mreqn {
               struct in_addr imr_multiaddr; /* grupowy adres IP */
               struct in_addr imr_address;   /* adres IP interfejsu
                                                lokalnego */
               int            imr_ifindex;   /* indeks interfejsu */
           };

       imr_multiaddr zawiera adres grupy, którą aplikacja chce podłączyć lub rozłączyć.  Musi  być  to  poprawny
       adres  grupowy  (multicast;  w  przeciwnym wypadku setsockopt(2) zwróci błąd EINVAL). imr_address jest to
       adres lokalnego interfejsu, przez który system powinien połączyć grupę; jeśli jest równy  INADDR_ANY,  to
       odpowiedni  interfejs  jest  wybierany przez system. imr_ifindex jest indeksem interfejsu, który powinien
       być podłączony/odłączony do obsługi grupy imr_multiaddr lub 0, by wskazać na dowolny interfejs.

              Struktura ip_mreqn jest dostępna tylko od wersji 2.2 Linuksa. Dla kompatybilności, stara struktura
              ip_mreq  wciąż  jest  obsługiwana. Różni się wprawdzie od ip_mreqn, lecz tylko tym, że nie zawiera
              pola imr_ifindex (jądro określa którą strukturę  zastosowano  na  podstawie  rozmiaru  podanego  w
              optlen).

              IP_ADD_MEMBERSHIP jest prawidłowe wyłącznie dla setsockopt(2).

       IP_ADD_SOURCE_MEMBERSHIP (since Linux 2.4.22 / Linux 2.5.68)
              Przyłącza  adres  grupowy  (multicast) i zezwala na otrzymywanie danych jedynie z podanego źródła.
              Argumentem jest struktura ip_mreq_source.

           struct ip_mreq_source {
               struct in_addr imr_multiaddr;  /* grupowy adres IP */
               struct in_addr imr_interface;  /* adres IP interfejsu
                                                 lokalnego */
               struct in_addr imr_sourceaddr; /* adres IP
                                                 grupowego źródła */
           };

       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.

              Opcja może być użyta kilkakrotnie aby otrzymywać dane z kilku źródeł.

       IP_BIND_ADDRESS_NO_PORT (od Linuksa 4.2)
              Informuje jądro, aby nie rezerwować portu efemerycznego przy korzystaniu z bind(2) z numerem portu
              0.  Port  będzie  wybrany  automatycznie  później,  w  trakcie  wykonywania  connect(2),  w sposób
              umożliwiający współdzielenie portu źródłowego tak długo, jak długo unikatowa jest czteroelementowa
              krotka.

       IP_BLOCK_SOURCE (od Linuksa 2.4.22 / 2.5.68)
              Kończy  otrzymywanie  danych  grupowych  z  podanego  źródła  i podanej grupy. Jest to odpowiednie
              jedynie   po   zapisaniu   się   do   adresu   grupowego   za   pomocą    IP_ADD_MEMBERSHIP    lub
              IP_ADD_SOURCE_MEMBERSHIP.

              Argumentem jest struktura ip_mreq_source opisana w części dotyczącej IP_ADD_SOURCE_MEMBERSHIP.

       IP_DROP_MEMBERSHIP (od Linuksa 1.2)
              Odłącza  się  od  grupy  adresów.  Argumentem  jest  struktura  ip_mreqn  lub  ip_mreq  podobna do
              IP_ADD_MEMBERSHIP.

       IP_DROP_SOURCE_MEMBERSHIP (od Linuksa 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.

              Argumentem jest struktura ip_mreq_source opisana w części dotyczącej IP_ADD_SOURCE_MEMBERSHIP.

       IP_FREEBIND (od Linuksa 2.4)
              Jeśli  jest  włączona,  to  ta  opcja  logiczna  pozwala na przypisanie do adresu nielokalnego lub
              (jeszcze) nieistniejącego. Pozwala to na nasłuchiwanie na gnieździe bez wymagania, żeby  interfejs
              sieciowy  niższej  warstwy lub podany dynamiczny adres IP były ustawione podczas próby przypisania
              gniazda przez aplikację. Ta opcja jest odpowiednikiem  -  dla  pojedynczego  gniazda  -  opisanego
              poniżej interfejsu /proc ip_nonlocal_bind.

       IP_HDRINCL (od Linuksa 2.0)
              Jeśli włączone, to dopuszczalne jest tworzenie przez użytkownika własnego nagłówka IP przed danymi
              użytkownika. Działa to jedynie dla gniazd SOCK_RAW, patrz raw(7), by  uzyskać  więcej  informacji.
              Gdy  ten  znacznik  jest  włączony,  to  wartości  ustawiane  przez IP_OPTIONS, IP_TTL i IP_TOS są
              ignorowane.

       IP_MSFILTER (od Linuksa 2.4.22 / 2.5.68)
              Opcja pozwala na  uzyskanie  dostępu  do  zaawansowanego  interfejsu  filtrowania  pełnostanowego.
              Argumentem jest struktura ip_msfilter.

           struct ip_mreqn {
               struct in_addr imsf_multiaddr; /* grupowy adres IP */
               struct in_addr imsf_interface; /* adres IP interfejsu
                                                 lokalnego */
               uint32_t       imsf_fmode;     /* tryb filtra */
           };

               uint32_t       imsf_numsrc;    /* Liczba źródeł w
                                                 kolejnej macierzy */
               struct in_addr imsf_slist[1];  /* Macierz źródeł
                                                 adresów */
           };

       Do   określenia   trybu   filtrowania   służą   dwa   makra   -   MCAST_INCLUDE  i  MCAST_EXCLUDE.  Makro
       IP_MSFILTER_SIZE(n) służy natomiast do określenia wielkości pamięci potrzebnej do przechowania  struktury
       ip_msfilter z n źródeł w liście źródeł.

              Pełny opis filtrowania źródeł adresów zawiera dokument RFC 3376.

       IP_MTU (od Linuksa 2.2)
              Pobiera bieżącą wartość MTU ścieżki obecnego gniazda. Zwraca liczbę całkowitą.

              IP_MTU  jest  poprawne  tylko  do  getsockopt(2)  i  można  go  użyć wyłącznie gdy gniazdo zostało
              połączone.

       IP_MTU_DISCOVER (od Linuksa 2.2)
              Ustawia lub pobiera opcję badania MTU ścieżki (ang. Path MTU Discovery) dla gniazda. Gdy opcja  ta
              jest  włączona, to Linux będzie przeprowadzał badanie MTU ścieżki dla gniazd SOCK_STREAM zgodnie z
              definicją  zawartą  w  RFC 1191.  W  przypadku  gniazd   nie   będących   gniazdami   SOCK_STREAM,
              IP_PMTUDISC_DO   wymusza   ustawienie   we  wszystkich  pakietach  wychodzących  znacznika  zakazu
              fragmentacji. Za  poprawne  zgodne  z  wartością  MTU,  podzielenie  na  pakiety  i  za  wykonanie
              ewentualnych  retransmisji  jest  odpowiedzialny  program  użytkownika.   Jądro  odrzuci (z błędem
              EMSGSIZE) pakiety większe niż znane MTU ścieżki. Ustawienie znacznika  IP_PMTUDISC_WANT  spowoduje
              sfragmentowanie datagramu, jeśli MTU ścieżki tego wymaga, albo - w przeciwnym wypadku - ustawienie
              znacznika zakazującego fragmentacji.

              Domyślną dla systemu wartość można ustawić na  IP_PMTUDISC_WANT lub na IP_PMTUDISC_DONT,  wpisując
              odpowiednio - zero lub wartość niezerową - do pliku /proc/sys/net/ipv4/ip_no_pmtu_disc.

              Wart. badan. MTU ścieżki   Znaczenie
              IP_PMTUDISC_WANT           Używaj ustawień zależnych od trasy.
              IP_PMTUDISC_DONT           Nie badaj MTU ścieżki.
              IP_PMTUDISC_DO             Zawsze badaj MTU ścieżki.
              IP_PMTUDISC_PROBE          Ustawia bit DF, ale ignoruje MTU ścieżki.

              Gdy  włączone  jest  badanie  MTU  ścieżki,  jądro automatycznie namierza wartości MTU ścieżki dla
              każdego komputera docelowego. Gdy aktywne jest  połączenie  z  danym  komputerem,  można  wygodnie
              odczytać  aktualnie  rozpoznaną  wartość  MTU  ścieżki za pomocą connect(2) używając opcji gniazda
              IP_MTU (np. po wystąpieniu błędu EMSGSIZE). Wartość MTU ścieżki może się zmieniać  z  czasem.  Dla
              gniazd  bezpołączeniowych  z  wieloma  komputerami  docelowymi  MTU  dla  danego,  również nowego,
              komputera docelowego można uzyskać za pomocą kolejki  błędów  (zobacz  IP_RECVERR).  Po  nadejściu
              każdej aktualizacji MTU zostanie skolejkowany nowy błąd.

              W  trakcie  rozpoznawania  MTU,  pakiety  inicjujące z gniazd datagramowych mogą zostać porzucone.
              Programy korzystające z UDP powinny być tego świadome i nie brać tego pod uwagę w swojej strategii
              retransmisji pakietów.

              To bootstrap the path MTU discovery process on unconnected sockets, it is possible to start with a
              big datagram size (headers up to 64 kilobytes long) and let it shrink by updates of the path MTU.

              Aby oszacować inicjalne MTU ścieżki, należy podłączyć gniazdo datagramowe do adresu docelowego  za
              pomocą connect(2) i pobrać MTU, wołając getsockopt(2) z opcją IP_MTU.

              Poprzez  ustawienie  wartości  w  IP_PMTUDISC_PROBE  (dostępnej  od  Linuksa  2.6.22) możliwe jest
              zaimplementowanie opisanego w RFC 4821 próbkowania MTU dla gniazd  SOCK_DGRAM lub  SOCK_RAW.  Jest
              to  szczególnie  użyteczne  w  narzędziach  diagnostycznych  typu  tracepath(8),  które  w  sposób
              zamierzony chcą wysyłać pakiety testowe większe niż zaobserwowane MTU ścieżki.

       IP_MULTICAST_ALL (od Linuksa 2.6.31)
              Tej  opcji  można  użyć  do  modyfikacji  zasad  dostarczania  wiadomości  grupowych   do   gniazd
              ograniczonych  maską  adresu INADDR_ANY. Argument wynosi 0 lub 1 (domyślnie 1). Gdy jest ustawiony
              na 1, to gniazdo otrzyma wiadomości  ze  wszystkich  grup,  które  dołączono  globalnie  z  całego
              systemu. W przeciwnym razie dostarczone będą tylko wiadomości z grup dołączonych jawnie (np. opcją
              IP_ADD_MEMBERSHIP) do tego konkretnego gniazda.

       IP_MULTICAST_IF (od Linuksa 1.2)
              Ustawia lokalne urządzenie dla gniazda grupowego. Argumentem do setsockopt(2)  jest  ip_mreqn  lub
              (od  Linuksa  3.5)  ip_mreq, struktura podobna do IP_ADD_MEMBERSHIP; albo struktura in_addr (jądro
              określa którą strukturę się podało na podstawie rozmiaru przekazanego w optlen). Do  getsockopt(2)
              argumentem jest struktura in_addr.

       IP_MULTICAST_LOOP (od Linuksa 1.2)
              Ustawia  lub  pobiera  logiczny  argument  typu  całkowitego,  określający, czy przesyłane pakiety
              grupowe powinny wracać do lokalnego gniazda.

       IP_MULTICAST_TTL (od Linuksa 1.2)
              Ustawia lub pobiera  wartość  czasu  życia  pakietu  dla  wychodzących  z  tego  gniazda  pakietów
              grupowych.  Jest  bardzo istotne w przypadku adresowania grupowego, by ustawić najmniejszą możliwą
              wartość TTL. Domyślnie jest to 1, co oznacza, że pakiety grupowe nie  opuszczają  sieci  lokalnej,
              chyba że program użytkownika wyraźnie tego żąda. Argument jest liczbą całkowitą.

       IP_NODEFRAG (od Linuksa 2.6.36)
              Jeśli  włączone  (argument jest niezerowy), łączenie pakietów wychodzących przez warstwę netfilter
              jest wyłączone. Argumentem jest liczba całkowita.

              Ta opcja jest prawidłowa tylko dla gniazd SOCK_RAW.

       IP_OPTIONS (od Linuksa 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.

              The  value  given as an argument to setsockopt(2)  and returned as the result of getsockopt(2)  is
              an integer boolean flag.

              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 (od Linuksa 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;  /* Indeks interfejsu */
                      struct in_addr ipi_spec_dst; /* Adres lokalny */
                      struct in_addr ipi_addr;     /* Nagłówek adresu
                                                      docelowego */
                  };

              ipi_ifindex  jest  unikatowym  indeksem  interfejsu,  przez  który  pakiet  został odebrany. Adres
              ipi_spec_dst jest lokalnym adresem pakietu,  a  ipi_addr  jest  adresem  docelowym  wynikającym  z
              nagłówka  pakietu.  Jeśli  IP_PKTINFO  jest  przekazane  do  sendmsg(2), a ipi_spec_dst ma wartość
              niezerową, to zostanie użyte jako źródłowy adres lokalny podczas przeszukiwania tablicy routingu i
              dla  ustawienia  opcji routingu według adresu źródłowego. Gdy ipi_ifindex ma wartość niezerową, to
              podstawowy adres lokalny interfejsu wskazywanego przez ten indeks nadpisuje  ipi_spec_dst  podczas
              przeszukiwania tablicy routingu.

       IP_RECVERR (od Linuksa 2.2)
              Włącza  przekazywanie  dodatkowych komunikatów o błędach, zwiększając niezawodność połączenia. Gdy
              jest to ustawione w gnieździe datagramowym, to  wszystkie  generowane  błędy  będą  zapamiętane  w
              specjalnej kolejce błędów przypisanej do gniazda. Gdy użytkownik (proces użytkownika) otrzyma błąd
              (przez zwrócony kod błędu operacji na gnieździe), to może go odebrać, używając funkcji  recvmsg(2)
              z  ustawionym  znacznikiem  MSG_ERRQUEUE.  Struktura  opisująca  błąd  sock_extended_err  zostanie
              przekazana w pomocniczym komunikacie o typie IP_RECVERR i poziomie IPPROTO_IP. Jest  to  niezwykle
              pomocne  przy niezawodnym przechwytywaniu błędów niepołączonych gniazd. Odbierana z kolejki błędów
              porcja danych zawiera pakiet z informacją o błędzie.

              Komunikat sterujący IP_RECVERR zawiera strukturę sock_extended_err zdefiniowaną następująco:

                  #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;   /* numer błędu */
                      uint8_t  ee_origin;  /* źródło błędu */
                      uint8_t  ee_type;    /* typ */
                      uint8_t  ee_code;    /* kod */
                      uint8_t  ee_pad;
                      uint32_t ee_info;    /* informacje dodatkowe */
                      uint32_t ee_data;    /* inne dane */
                      /* Dalej mogą wystąpić dodatkowe dane */
                  };

                  struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);

              ee_errno zawiera numer errno błędu  kolejki.  ee_origin  jest  kodem  miejsca  pochodzenia  błędu.
              Pozostałe  pola  są  zależne  od protokołu. Makro SO_EE_OFFENDER zwraca wskaźnik do adresu obiektu
              sieciowego, z którego pochodził błąd o zadanym wskaźniku do komunikatu pomocniczego. Gdy ten adres
              nie  jest  znany, pole sa_family struktury sockaddr zawiera wartość AF_UNSPEC a pozostałe pola tej
              struktury sockaddr są niezdefiniowane.

              IP  używa   struktury   sock_extended_err   w   następujący   sposób:   ee_origin   ustawione   na
              SO_EE_ORIGIN_ICMP  dla  błędów odbieranych jako pakiet ICMP albo też SO_EE_ORIGIN_LOCAL dla błędów
              generowanych lokalnie. Nieznane wartości należy ignorować. ee_type i ee_code są ustawiane  zgodnie
              z  typem  i kodem pól w nagłówku ICMP. ee_info zawiera rozpoznaną wartość MTU dla błędów EMSGSIZE.
              Komunikat zawiera również sockaddr_in węzła, który spowodował błąd, a  do  którego  można  uzyskać
              dostęp za pomocą makra SO_EE_OFFENDER. Pole sin_family adresu SO_EE_OFFENDER ma wartość AF_UNSPEC,
              gdy źródło błędu nie jest znane. Gdy błąd pochodzi z sieci, wszystkie opcje IP (IP_OPTIONS, IP_TTL
              itd.)  włączone  w gnieździe i zawarte w pakiecie błędu są przekazywane jako komunikaty kontrolne.
              Właściwe dane pakietu, który spowodował błąd są zwracane jako normalne dane. Należy  zauważyć,  że
              TCP nie ma kolejki błędów; MSG_ERRQUEUE jest nielegalne w przypadku gniazd SOCK_STREAM. IP_RECVERR
              jest poprawne dla TCP, ale wszystkie błędy są przekazywane przez  zwracaną  wartość  funkcji  albo
              przez 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

              Ustawia lub pobiera znacznik logiczny  zapisany  za  pomocą  liczby  całkowitej.  IP_RECVERR  jest
              domyślnie wyłączone.

       IP_RECVOPTS (od Linuksa 2.2)
              Przekazuje  użytkownikowi  wszystkie  nadchodzące  opcje  IP  z komunikatu sterującego IP_OPTIONS.
              Nagłówek wyboru trasy i inne opcje są już wstępnie wypełnione informacjami  o  lokalnej  maszynie.
              Nieobsługiwane w przypadku gniazd typu SOCK_STREAM.

       IP_RECVORIGDSTADDR (od Linuksa 2.6.29)
              Ta  opcja  logiczna włącza komunikat pomocniczy IP_ORIGDSTADDR w recvmsg(2), w którym jądro zwraca
              oryginalny adres docelowy otrzymywanego  właśnie  datagramu.  Ten  komunikat  pomocniczy   zawiera
              strukturę struct sockaddr_in.

       IP_RECVTOS (od Linuksa 2.2)
              Jeśli  jest  ustawione,  to  pomocniczy  komunikat IP_TOS jest przepuszczany razem z nadchodzącymi
              pakietami. Zawiera on bajt, który określa pole zdefiniowane  także  jako  bajt  znajdujące  się  w
              nagłówku  pakietu,  a zwane Typ Usługi/Pierwszeństwa. Wymaga logicznego znacznika w postaci liczby
              całkowitej.

       IP_RECVTTL (od Linuksa 2.2)
              When this flag is set, pass a IP_TTL control message with the time-to-live field of  the  received
              packet as a 32 bit integer.  Not supported for SOCK_STREAM sockets.

       IP_RETOPTS (od Linuksa 2.2)
              Działanie identyczne do IP_RECVOPTS, ale zwraca surowe, nieprzetworzone opcje, włącznie z rekordem
              opcji, mówiącym o znaczniku czasowym i trasie, niewypełnionym wartościami w tym przejściu pakietu.

       IP_ROUTER_ALERT (od Linuksa 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 (od Linuksa 1.0)
              Ustawia  lub  pobiera  pole znacznika Typ-Usługi (ang. Type-Of-Service, w skrócie TOS), które jest
              przesyłane z każdym pakietem IP pochodzącym z  danego  gniazda.  Służy  do  ustalenia  priorytetów
              pakietów  w  sieci.  TOS  jest  bajtem.  Oto  definicje  niektórych  standardowych znaczników TOS:
              IPTOS_LOWDELAY - minimalizacja opóźnienia we wzajemnym  ruchu,  IPTOS_THROUGHPUT  -  optymalizacja
              wyjścia,  IPTOS_RELIABILITY  -  optymalizacja pod kątem niezawodności, a IPTOS_MINCOST powinna być
              używana jako "dane wypełniające" tam, gdzie szybkość transmisji nie ma większego znaczenia.  Można
              podać najwyżej jedną z powyższych wartości TOS. Inne bity są niepoprawne i powinny być wyzerowane.
              Linux domyślnie wysyła  najpierw  datagram  IPTOS_LOWDELAY,  ale  dokładne  zachowanie  zależy  od
              konfiguracji  właściwości  szeregowania.  Niektóre  poziomy  o  wysokim  priorytecie  mogą wymagać
              uprawnień administratora (ustawionego atrybutu CAP_NET_ADMIN).

       IP_TRANSPARENT (od Linuksa 2.6.24)
              Ustawienie tej opcji logicznej włącza przezroczyste (ang. "transparent") proxy dla  tego  gniazda.
              Ta  opcja  gniazda  pozwala  wywołującej aplikacji przypisanie gniazda do nielokalnego adresu IP i
              operowanie jako zarówno klient, jak i  serwer  z  zewnętrznym  adresem  IP  dla  lokalnego  punktu
              docelowego. UWAGA: wymaga to takiego ustawienia reguł routingu, żeby pakiety wysyłane na ten adres
              zewnętrzny były przekazywane przez TProxy (tj. system na którym działa aplikacja korzysta z  opcji
              gniazda   IP_TRANSPARENT).   Włączenie  tej  opcji  wymaga  uprawnień  administratora  (właściwość
              CAP_NET_ADMIN).

              Przekierowanie TProxy używające celu TPROXY z iptables(8) także wymagają  włączenia  tej  opcji  w
              przekierowywanym gnieździe.

       IP_TTL (od Linuksa 1.0)
              Ustawia  lub pobiera pole "czas życia" (ang. Time-To-Live, w skrócie TTL) dla każdego wychodzącego
              z danego gniazda pakietu IP.

       IP_UNBLOCK_SOURCE (od Linuksa 2.4.22 / 2.5.68)
              Odblokowuje zablokowaną uprzednio grupę adresów. Zwraca EADDRNOTAVAIL gdy podane źródło  nie  było
              zablokowane.

              Argumentem jest struktura ip_mreq_source opisana w części dotyczącej 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.

   Interfejsy /proc
       Protokół  IP  obsługuje  zbiór  interfejsów  /proc i korzysta z niech do ustawiania niektórych parametrów
       globalnych. Parametry są  dostępne   przez  zapis  lub  odczyt  plików  z  katalogu  /proc/sys/net/ipv4/.
       Interfejsy opisane jako logiczne pobierają liczbę całkowitą, której wartość niezerowa ("prawda") oznacza,
       że dana opcja jest włączona, a zero ("fałsz"), oznacza, że opcja jest wyłączona.

       ip_always_defrag (logiczna; od Linuksa 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]

              Gdy  ten znacznik logiczny jest włączony (różny od 0), przychodzące fragmenty (części pakietów IP,
              które się pojawiają, gdy pewien komputer pomiędzy komputerem źródłowym a docelowym  zdecyduje,  że
              pakiety  były za duże i podzieli je na kawałki) będą ponownie złożone (zdefragmentowane) przed ich
              przetworzeniem, nawet jeśli mają być przekazane dalej (and. forwarded).

              Enable only if running either a firewall that is the sole link to your network  or  a  transparent
              proxy;  never ever use it for a normal router or host.  Otherwise, fragmented communication can be
              disturbed if the fragments travel over different links.  Defragmentation also has a  large  memory
              and CPU time cost.

              Jest to włączane automagicznie, gdy skonfigurowane jest maskowanie lub przezroczyste proxy.

       ip_autoconfig (since Linux 2.2 to Linux 2.6.17)
              Nie udokumentowane.

       ip_default_ttl (liczba, domyślnie: 64; od Linuksa 2.2)
              Ustawia  domyślną  wartość  "czasu  życia" (ang. time-to-live) wychodzących pakietów. Może być ona
              zmieniona dla gniazda za pomocą opcji IP_TTL.

       ip_dynaddr (logiczna; domyślnie: wyłączona; od Linuksa 2.0.31)
              Włącza dynamiczne adresowanie gniazda oraz przepisywanie adresu dla maskowania przy zmianie adresu
              interfejsu.  Jest  to  bardzo przydatne w przypadku korzystania z interfejsu sprzęgniętego z linią
              telefoniczną, którego adres  IP  może  się  zmieniać.  0  oznacza  brak  przepisywania,  1  włącza
              przepisywanie, a 2 włącza tryb rozwlekły (ang. verbose).

       ip_forward(logiczna; domyślnie: wyłączona; od Linuksa 1.2)
              Włącza  przekazywanie  (ang.  forwarding)  pakietów  przy  użyciu  logicznego  znacznika. Może być
              ustawione także na podstawie interfejsu.

       ip_local_port_range (od Linuksa 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:

              •  numer portu w adresie gniazda jest określony jako 0 w trakcie wywoływania bind(2);

              •  listen(2) jest wywoływane na gnieździe strumieniowych, które nie było wcześniej przydzielone;

              •  connect(2) była wywołana na gnieździe, które nie było wcześniej przydzielone;

              •  sendto(2) jest wywoływane na gnieździe datagramowym, które nie było wcześniej przydzielone.

              Przypisywanie portów efemerycznych rozpoczyna się od pierwszego  numeru  w  ip_local_port_range  i
              kończy  się  na  drugim  numerze.  Jeśli wyczerpie się zakres portów efemerycznych, to odpowiednie
              wywołanie systemowe zwróci błąd (ale proszę sprawdzić rozdział BŁĘDY!).

              Proszę zauważyć, że zakres portów w ip_local_port_range  nie  powinien  pokrywać  się  z  zakresem
              portów  wykorzystywanym do maskowania (chociaż taka sytuacja jest obsługiwana). Dowolny wybór może
              również powodować problemy z niektórymi zaporami sieciowymi, które robią pewne założenia  odnośnie
              do  portów  używanych  lokalnie.  Pierwsza  liczba  powinna być większa niż 1024, albo - co byłoby
              lepsze - większa niż 4096, aby uniknąć  konfliktów  z  dobrze  znanymi  portami  i  zminimalizować
              problemy z zaporami sieciowymi.

       ip_no_pmtu_disc (logiczna; domyślnie: wyłączona; od Linuksa 2.2)
              Jeśli  jest  to  włączone,  to domyślnie nie będzie wykonywane badanie MTU ścieżki dla gniazd TCP.
              Badanie MTU może się nie sprawdzać  w  przypadku  źle  skonfigurowanych  firewalli  (odrzucających
              wszelkie  pakiety  ICMP) lub źle skonfigurowanych interfejsów (np. połączenie typu point-to-point,
              gdzie oba końce nie zgadzają się na MTU). Lepiej poprawić wszelkie wadliwie skonfigurowane  rutery
              po  drodze  niż  całkowicie  wyłączyć  badanie  MTU  ścieżki, ponieważ niewykonywanie tej operacji
              pociąga za sobą duże straty w obrębie sieci.

       ip_nonlocal_bind (logiczna; domyślnie: wyłączona; od Linuksa 2.4)
              Jeżeli ustawione, pozwala procesowi na wywołanie funkcji bind() z nielokalnym adresem IP, co  może
              być całkiem przydatne, ale może popsuć niektóre aplikacje.

       ip6frag_time (liczba; domyślnie: 30)
              Czas w sekundach przetrzymywania w pamięci fragmentu IPv6.

       ip6frag_secret_interval (liczba; domyślnie: 600)
              Interwał  (w  sekundach)  odświeżania sekretnego klucza funkcji mieszkającej (lub czasu życia tego
              klucza) dla fragmentów IPv6.

       ipfrag_high_thresh (liczba), ipfrag_low_thresh (liczba)
              Jeśli  liczba   zebranych   w   kolejce   fragmentów   IP   osiągnie   wartość   określoną   przez
              ipfrag_high_thresh,  wtedy  kolejka  jest  opróżniana  do  ilości  określonej w ipfrag_low_thresh.
              Zawiera ona liczbę całkowitą z podaną liczbą bajtów.

       neigh/*
              Patrz arp(7).

   Kontrolki systemowe (ioctl)
       Do protokołu ip mają zastosowanie wszystkie kontrolki wejścia/wyjścia opisane w socket(7).

       Kontrolki konfigurowania ogólnych parametrów urządzenia są opisane w netdevice(7).

BŁĘDY

       EACCES Użytkownik próbował wykonać operację, nie mając potrzebnych praw. Obejmuje to:  wysyłanie  pakietu
              na  adres rozgłoszeniowy bez ustawionego znacznika SO_BROADCAST, wysyłanie pakietu zakazaną drogą,
              próbę modyfikacji ustawień firewalla, nie mając uprawnień  administratora  (ustawionego  znacznika
              CAP_NET_ADMIN),  próbę  przypisania  uprzywilejowanego  portu,  nie mając uprawnień administratora
              (ustawionego znacznika CAP_NET_BIND_SERVICE).

       EADDRINUSE
              Próbowano przypisać port do adresu będącego już w użyciu.

       EADDRNOTAVAIL
              Zażądano nieistniejącego interfejsu lub żądany adres źródłowy nie jest adresem lokalnym.

       EAGAIN Operacja na gnieździe z wyłączonym blokowaniem spowodowałaby zablokowanie.

       EALREADY
              A connection operation on a nonblocking socket is already in progress.

       ECONNABORTED
              Połączenie zostało zamknięte podczas accept(2).

       EHOSTUNREACH
              No valid routing table entry matches the destination address.  This error can be caused by an ICMP
              message from a remote router or for the local routing table.

       EINVAL Przypisano  niewłaściwy  argument.  W  przypadku  operacji wysyłania może to być spowodowane przez
              wysyłanie drogą przypisaną do czarnej dziury.

       EISCONN
              connect(2) była wywołana na już połączonym gnieździe.

       EMSGSIZE
              Datagram jest większy niż wartość MTU po drodze do celu i nie może być podzielony.

       ENOBUFS, ENOMEM
              Niewystarczająca ilość dostępnej  pamięci.  Często  oznacza  to,  że  przydzielanie  pamięci  jest
              ograniczone przez ograniczenia bufora gniazda, a nie przez ograniczenia pamięci systemowej. Jednak
              nie jest to pewne na 100%.

       ENOENT SIOCGSTAMP było wywołane na gnieździe, do którego nie dotarł żaden pakiet.

       ENOPKG Podsystem jądra nie był konfigurowany.

       ENOPROTOOPT i EOPNOTSUPP
              Przypisano niewłaściwą opcję gniazda.

       ENOTCONN
              Operacja może być wykonana tylko na połączonym gnieździe, a gniazdo nie zostało połączone.

       EPERM  Użytkownik nie ma praw do ustawiania  wysokiego  priorytetu,  zmiany  konfiguracji  lub  wysyłania
              sygnałów do żądanych procesów lub grup procesów.

       EPIPE  Połączenie zostało nieoczekiwanie zamknięte lub wyłączył się drugi koniec.

       ESOCKTNOSUPPORT
              Gniazdo nie jest skonfigurowane lub zażądano nieznanego typu gniazda.

       Inne  błędy  mogą  być  generowane  przez  protokoły  wyższych  warstw; obejrzyj tcp(7), raw(7), udp(7) i
       socket(7).

UWAGI

       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.

       Należy  być  bardzo  ostrożnym  przy  stosowaniu  opcji  SO_BROADCAST  -  nie  jest  ona w systemie Linux
       uprzywilejowana, jest więc łatwo przeciążyć sieć za  pomocą  niedbale  użytych  rozgłoszeń.  W  przypadku
       protokołów  nowych  aplikacji  lepiej  używać  grupy  adresowej  zamiast  rozgłoszeń.  Stosowanie adresów
       rozgłoszeniowych jest niezalecane.

       Niektóre inne implementacje gniazd BSD dopuszczają dla gniazd opcje IP_RCVDSTADDR i IP_RECVIF używane  do
       pobierania  adresu  przeznaczenia  i  interfejsu odbieranych datagramów. Linux udostępnia bardziej ogólną
       opcję IP_PKTINFO, robiącą to samo.

       Niektóre implementacja gniazd BSD także  udostępniają  opcję  IP_RECVTTL,  ale  łącznie  z  przychodzącym
       pakietem  jest  przekazywany pomocniczy komunikat o typie IP_RECVTTL. W tym właśnie różni się to od opcji
       IP_TTL, używanej w Linuksie.

       Using the SOL_IP socket options level isn't portable; BSD-based stacks use the IPPROTO_IP level.

       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.

   Zgodność
       Dla  zgodności z Linuksem 2.0, wciąż jest dopuszczalna przestarzała składnia socket(AF_INET, SOCK_PACKET,
       protokół), by stworzyć gniazdo typu packet(7). Nie jest to zbyt poprawne i powinno być zastępowane  przez
       socket(AF_PACKET,  SOCK_RAW,  protokół).  Głównym powodem jest różnica w strukturze adresowej sockaddr_ll
       przechowującej informacje dla warstwy łącza (dokładniej: warstwy kanałowej), które  kiedyś  przechowywane
       były w sockaddr_pkt.

BŁĘDY

       Jest zbyt wiele nieokreślonych wartości błędów.

       Błąd   używany   do  zdiagnozowania  wyczerpania  się  zakresu  portów  efemerycznych  różni  się  między
       poszczególnymi wywołaniami systemowymi (connect(2),  bind(2),  listen(2),  sendto(2)),  które  przypisują
       porty efemeryczne.

       Nie są opisane kontrolki wejścia/wyjścia do konfigurowania specyficznych dla IP opcji interfejsu i tabele
       ARP.

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

ZOBACZ TAKŻE

       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.

       RFC 791 - oryginalny opis IP. RFC 1122 - wymagania stacji IPv4. RFC 1812 - wymagania rutera IPv4.

TŁUMACZENIE

       Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Paweł Wilk <siefca@pl.qmail.org>, Robert
       Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>

       Niniejsze  tłumaczenie  jest  wolną  dokumentacją.  Bliższe informacje o warunkach licencji można uzyskać
       zapoznając się z GNU General Public License w wersji  3  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  lub
       nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

       Błędy  w  tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy dyskusyjnej ⟨manpages-pl-
       list@lists.sourceforge.net⟩.