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.

Linux                                              2013-04-16                                              IP(7)