Provided by: manpages-pl_0.7-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> /* nadzbiór poprzedniego */

       tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
       udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
       raw_socket = socket(AF_INET, SOCK_RAW, protokół);

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, typ_gniazda, protokół);

       Poprawne typy gniazd  to:  SOCK_STREAM  służące  do  tworzenia  gniazd  pośredniczących  w
       obsłudze   protokołu   tcp(7),   SOCK_DGRAM  obsługujące  protokół  udp(7)  oraz  SOCK_RAW
       pozwalające tworzyć gniazda raw(7) (surowe) umożliwiające bezpośredni dostęp do  protokołu
       IP. protokół jest protokołem bazującym na IP. Informacja o nim jest umieszczana w nagłówku
       wysyłanego bądź odbieranego pakietu IP. Dla gniazd TCP poprawnymi wartościami są tylko 0 i
       IPPROTO_TCP, a dla gniazd UDP — 0 i IPPROTO_UDP. Dla SOCK_RAW można podać dowolny poprawny
       numer protokołu IP określony przez IANA w RFC 1700.

       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 */
           };

           /* Adres internetowy */
           struct in_addr {
               uint32_t     s_addr;     /* adres - sieciowa kolejność bajtów */
           };

       sin_family  ma  zawsze wartość AF_INET. Jest to wymagane; w Linuksie 2.2 większość funkcji
       sieciowych zwraca EINVAL, jeśli brakuje tego  ustawienia.  sin_port  zawiera  numer  portu
       podany  w  sieciowej  kolejności bajtów. Numery portów niższe niż 1024 są nazywane portami
       uprzywilejowanymi (lub czasem portami zarezerwowanymi). Tylko procesy uprzywilejowane (tj.
       z ustawionym atrybutem CAP_NET_BIND_SERVICE) mogą wywołać bind(2) dla tego rodzaju gniazd.
       Należy zauważyć, że surowy protokół IPv4  jako  taki  nie  zawiera  pojęcia  portu  (takie
       rozróżnienie  jest  dopiero  w warstwie transportowej, a to jest warstwa sieciowa). Numery
       portów występują dopiero w protokołach wyższej warstwy, takich jak tcp(7) i udp(7).

       sin_addr to adres IP komputera (maszyny). Pole s_addr  struktury  struct  in_addr  zawiera
       adres interfejsu maszyny w sieciowej kolejności bajtów. Polu in_addr należy albo przypisać
       jedną z wartości INADDR_* (np. INADDR_ANY), albo użyć funkcji bibliotecznych inet_aton(3),
       inet_addr(3),  inet_makeaddr(3)  do  ustawienia  wartości, albo ustawić bezpośrednio przez
       resolvera (patrz też gethostbyname(3)).

       Adresy IPv4  dzielimy  na  pojedyncze  (unicast),  rozgłoszeniowe  (broadcast)  i  grupowe
       (multicast).   Adresy   pojedyncze   określają   pojedynczy   interfejs   maszyny,  adresy
       rozgłoszeniowe określają wszystkie maszyny w obrębie jakiejś sieci  (podsieci),  a  adresy
       grupowe  wszystkie  maszyny  w  obrębie  jakiejś  grupy  odbiorców. Datagramy kierowane do
       adresów rozgłoszeniowych trafiają do odbiorcy tylko wtedy, gdy jego gniazdo  ma  ustawiony
       atrybut  rozgłoszenia  SO_BROADCAST.  Ten sam atrybut musi być też ustawiony, gdy zachodzi
       potrzeba wysłania datagramów rozgłoszenia. W obecnej  implementacji  gniazda  połączeniowe
       mogą używać wyłącznie adresów pojedynczych.

       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 (od Linuksa 2.4.22 / 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 */
                  };

              Sktruktura   ip_mreq_source   jest   podobna   do   ip_mreqn  opisanej  pod  hasłem
              IP_ADD_MEMBERSIP. Pole imr_multiaddr zawiera adres grupowy do którego aplikacja  ma
              zamiar  dołączyć  lub  opuścić  go.  Pole  imr_interface  jest  adresem  interfejsu
              lokalnego  z  którego  system  powinien  dołączyć   do   adresu   grupowego.   Pole
              imr_sourceaddr  zawiera  adres  źródłowy,  z którego aplikacja ma zamiar otrzymywać
              dane.

              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)
              Odłącza  się od grupy z podanego źródła - zaprzestaje otrzymywania danych z podanej
              grupy adresów pochodzącej z podanego źródła. Jeśli programy zostały  przypisane  do
              wielu  źródeł  z tej samej grupy, dane z pozostałych źródeł wciąż będą dostarczane.
              Aby zatrzymać  otrzymywanie  danych  ze  wszystkich  źródeł  na  raz,  należy  użyć
              IP_LEAVE_GROUP.

              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 ign. 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.

              Aby zainicjować  proces  badania  MTU  ścieżki  dla  gniazd  niepołączonych,  można
              rozpocząć  z  dużym  rozmiarem  datagramu  (o  długości  do  64K bajtów nagłówka) i
              pozwolić na jego zmniejszenie w wyniku aktualizacji MTU ścieżki.

              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)
              Ustawia  lub  pobiera  opcje  IP,  które  będą  wysyłane z każdym pakietem z danego
              gniazda. Argumenty są wskaźnikiem do  bufora  pamięci  zawierającego  opcje  i  ich
              długości.  setsockopt(2) ustawia opcje IP skojarzone z gniazdem. Maksymalny rozmiar
              opcji dla IPv4 to 40 bajtów. Zobacz RFC 791, by poznać możliwe  opcje.  Gdy  pakiet
              wstępnego potwierdzenia połączenia (ACK) dla gniazda typu SOCK_STREAM zawiera opcje
              IP, to opcje  wychodzącego  pakietu  IP  będą  automatycznie  pobrane  z  opcji  IP
              pobranego  pakietu  z  odwróconymi  nagłówkami  mówiącymi o trasie. Po ustanowieniu
              połączenia  przychodzące  pakiety  nie  są  uprawnione  do  zmiany  swoich   opcji.
              Przetwarzanie  wszystkich przychodzących opcji źródła jest domyślnie wyłączone, ale
              można je włączyć ustawiając accept_source_route w interfejsie  /proc.  W  przypadku
              gniazd  datagramowych  opcje  IP  mogą  być  ustawione  jedynie  przez  użytkownika
              lokalnego. Funkcja getsockopt(2) z argumentem  IP_OPTIONS  zwróci  obecnie  wysłane
              opcje przez umieszczenie ich w dostarczonym buforze.

       IP_PKTINFO (od Linuksa 2.2)
              Przekazuje   pomocniczy   komunikat   IP_PKTINFO   zawierający   strukturę  pktinfo
              dostarczającą trochę informacji o przychodzącym pakiecie.  Działa  to  jedynie  dla
              gniazd  datagramowych.  Argument  jest  znacznikiem  mówiącym  gniazdu,  czy należy
              przekazać  komunikat  IP_PKTINFO,  czy  też  nie.   Sam   komunikat   może   zostać
              przesłany/otrzymany  wraz  z  pakietem  jedynie  jako komunikat sterujący za pomocą
              recvmsg(2) lub 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.

              Dla gniazd surowych,  IP_RECVERR  włącza  przepuszczanie  do  aplikacji  wszystkich
              odebranych  komunikatów  ICMP  o błędach. W przeciwnym przypadku błędy są zgłaszane
              tylko dla gniazd połączonych.

              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)
              Gdy  ten  znacznik  jest ustawiony, przepuszczany jest komunikat pomocniczy IP_TTL,
              zawierający pole określane mianem "czas życia" odbieranego pakietu w postaci bajtu.
              Nie jest to wspierane w przypadku strumieniowych gniazd typu SOCK_STREAM.

       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)
              Przekazuje   wszystkie  pakiety  z  opcją  alarmu  rutera  IP,  które  miałyby  być
              przekazywane (ang. forwarded) do tego gniazda. Działa tylko  dla  gniazd  surowych.
              Jest  to  przydatne  na  przykład  dla  demonów  RSVP  działających  w  przestrzeni
              użytkownika. Wykorzystane pakiety nie są przekazywane (ang. forwarded) przez jądro.
              Ponowne  ich  wysłanie  należy  do  obowiązków  programu  użytkownika. Dowiązywanie
              gniazda jest w tym przypadku  ignorowane,  pakiety  te  są  filtrowane  jedynie  na
              podstawie protokołu. Wymaga liczby całkowitej jako argumentu.

       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.

   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)
              [Nowa  w jądrze 2.2.13; we wcześniejszych wersjach jądra funkcją tą sterowało się w
              czasie kompilacji za pomocą  opcji  CONFIG_IP_ALWAYS_DEFRAG,  która  nie  jest  już
              obecna w 2.4.x i kolejnych]

              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).

              Należy  włączać  jedynie  przy działającym firewallu, stanowiącym główne wejście do
              danej sieci lub działającym przezroczystym proxy; nigdy nie należy tego włączać  na
              zwykłym  routerze  lub  komputerze.  W  przeciwnym  przypadku  łączność może zostać
              zakłócona, gdy fragmenty będą podróżować innymi  łączami.  Defragmentacja  powoduje
              również znaczne wykorzystanie pamięci i czasu procesora.

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

       ip_autoconfig (od Linuksa 2.2 do 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)
              Plik zawierający dwa liczby całkowite określające domyślny zakres lokalnych  portów
              przypisanych  do  gniazd  niebędących  bezpośrednio  przydzielonych  do portu - tj.
              zakres  ten  jest  używany   do   portów   efemerycznych   (portów   przypisywanych
              dynamicznie).  Port  efemeryczny  jest  przydzielany  do  gniazda  w  następujących
              sytuacjach:

              *  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
              Operacja łączenia na gnieździe nieblokującym już trwa.

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

       EHOSTUNREACH
              Brak wpisu określającego adres docelowy  w  tabeli  routingu.  Błąd  ten  może  być
              wywołany przez komunikat ICMP od zdalnego routera lub dla lokalnej tabeli routingu.

       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_PKTINFO,
       IP_RECVERR, IP_ROUTER_ALERT i IP_TRANSPARENT są typowo linuksowe.

       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.

       Używanie  poziomu  opcji  gniazd  SOL_IP  jest nieprzenośne, gniazda oparte na BSD używają
       poziomu IPPROTO_IP.

   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.

       Pobieranie pierwotnego adresu docelowego za pomocą wywołania recvmsg(2) z  MSG_ERRQUEUE  w
       msg_name nie działa w niektórych jądrach 2.2.

ZOBACZ TAKŻE

       recvmsg(2),   sendmsg(2),   byteorder(3),   ipfw(4),  capabilities(7),  icmp(7),  ipv6(7),
       netlink(7), raw(7), socket(7), tcp(7), udp(7)

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

O STRONIE

       Angielska  wersja  tej  strony  pochodzi  z  wydania  4.05  projektu Linux man-pages. Opis
       projektu, informacje dotyczące zgłaszania błędów oraz  najnowszą  wersję  oryginału  można
       znaleźć pod adresem https://www.kernel.org/doc/man-pages/.

TŁUMACZENIE

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

       Polskie  tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów na
       stronie  http://sourceforge.net/projects/manpages-pl/.  Jest   zgodne   z   wersją    4.05
       oryginału.