Provided by: manpages-pl_0.5-1_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  przez  wywołanie  funkcji  socket(2)   jako   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ę.

       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. Działa tylko z 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_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. Jest to poprawne tylko, gdy
              gniazdo zostało połączone. Zwraca liczbę całkowitą. Działa tylko z getsockopt(2).

       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  jest  struktura
              ip_mreqn lub ip_mreq podobna do IP_ADD_MEMBERSHIP.

              Gdy podana jest niepoprawna opcja gniazda, to zwracaną wartością jest ENOPROTOOPT.

       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. Opcje jest poprawna tylko dla gniazd SOCK_RAW.
              Argumentem jest liczba całkowita.

       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).  Priorytet  można  też  ustawić  w  sposób  niezależny od
              protokołu poprzez opcję gniazda (SOL_SOCKET, SO_PRIORITY) (patrz też socket(7)).

       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.  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)
              Zawiera dwie liczby całkowite, które definiują lokalny zakres portów przydzielanych
              gniazdom. Przydzielanie zaczyna się od  pierwszej  podanej  wartości  i  kończy  na
              drugiej. Należy zauważyć, że zakres ten 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.

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

       Niektóre  wersje glibc zapominają zadeklarować in_pktinfo. Można to obejść, kopiując ją do
       programu z niniejszej strony podręcznika.

       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  3.52  projektu Linux man-pages. Opis
       projektu  oraz  informacje  dotyczące  zgłaszania  błędów  można   znaleźć   pod   adresem
       http://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ą    3.52
       oryginału.