Provided by: manpages-pl_20060617-4_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(PF_INET, SOCK_STREAM, 0);
       udp_socket = socket(PF_INET, SOCK_DGRAM, 0);
       raw_socket = socket(PF_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  gniazdami BSD. Więcej informacji na temat gniazd
       można znaleźć, przeglądając socket(7).

       Gniazdo  IP  jest  tworzone  poprzez  wywołanie  funkcji  socket(2)  jako  socket(PF_INET,
       rodzaj_gniazda, protokół). Poprawne typy gniazd to SOCK_STREAM służące do tworzenia gniazd
       pośredniczących w obsłudze protokołu tcp(7), także SOCK_DGRAM obsługujące protokół udp(7),
       a  nawet  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 prawidłowy 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).  Do  dowolnej  lokalnej
       pary  (adres,  port)  można  podłączyć tylko jedno gniazdo IP. Gdy w wywołaniu bind podana
       jest wartość INADDR_ANY, to gniazdo zostanie dowiązane do wszystkich lokalnych interfejsów
       sieciowych.  Gdy  dla  niedowiązanego  gniazda zostanie wywołane listen(2) lub connect(2),
       gniazdo to zostanie automatycznie dowiązane do losowo wybranego wolnego portu,  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  */
             u_int16_t      sin_port;   /* port - sieciowa kolejność bajtów */
             struct in_addr sin_addr;   /* adres internetowy */
         };

         /* Adres internetowy */
         struct in_addr {
             u_int32_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
       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 hosta (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   aktualnej
       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 host  i  ze
       względów historycznych zachowuje się przy dowiązywaniu tak samo jak INADDR_ANY.

OPCJE GNIAZD

       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_OPTIONS
              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ć  za pomocą kontrolki systemowej accept_source_route. 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
              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 IP_PKTINFO zostanie użyte  jako
              źródłowy  adres  lokalny  podczas  przeszukiwania tablicy routingu i dla ustawienia
              opcji routingu wg 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_RECVTOS
              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
              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_RECVOPTS
              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.  Nie  obsługiwane  w  przypadku  gniazd  typu
              SOCK_STREAM.

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

       IP_TOS 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_TTL 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_HDRINCL
              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_RECVERR (zdefiniowane w <linux/errqueue.h>)
              Włącza zwiększoną pewność przy realizowaniu zawiadomień  o  błędach.  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 błędy
              mogą  być  odebrane  przy  użyciu  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 {
                    u_int32_t ee_errno;   /* numer błędu */
                    u_int8_t  ee_origin;  /* źródło błędu */
                    u_int8_t  ee_type;    /* typ */
                    u_int8_t  ee_code;    /* kod */
                    u_int8_t  ee_pad;
                    u_int32_t ee_info;    /* informacje dodatkowe */
                    u_int32_t ee_data;    /* inne dane */
                    /* Dalej mogą wystąpić dodatkowe informacja */
                };

                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  niedozwolone w przypadku gniazd SOCK_STREAM. Wszystkie błędy są
              przekazywane poprzez zwracaną wartość funkcji albo 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.

              Mamy tu do czynienia ze znacznikiem logicznym zapisanym za pomocą liczby całkowitej
              IP_RECVERR, domyślnie wyłączonym.

       IP_MTU_DISCOVER
              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  tego  gniazda zgodnie z definicją zawartą w RFC 1191. Znacznik zakazu
              fragmentacji jest ustawiany we wszystkich pakietach wychodzących. Ogólne,  domyślne
              zachowanie  określone dla danego systemu jest ustawiane przez "kontrolkę systemową"
              ip_no_pmtu_disc dla gniazd typu SOCK_STREAM i wyłączone dla wszystkich innych typów
              gniazd.  W  przypadku  gniazd  innych  niż  SOCK_STREAM  za  odpowiednie,  zgodne z
              wartością MTU, spakietowanie danych i za wykonanie ewentualnych  retransmisji  jest
              odpowiedzialny  program  użytkownika.  Jądro  odrzuci pakiety większe niż znane MTU
              ścieżki, gdy ten znacznik jest ustawiony (łącznie z EMSGSIZE ).

              Znaczniki badania MTU ścieżki   Znaczenia
              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

              Gdy włączone jest badanie MTU ścieżki, jądro automatycznie  namierza  wartości  MTU
              ścieżki  dla  każdego hosta docelowego. Gdy aktywne jest połączenie z danym hostem,
              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). Może
              ona  się  zmieniać  z  czasem.  Dla  gniazd  bezpołączeniowych  z  wieloma  hostami
              docelowymi,  MTU  dla  danego,  również  nowego,  hosta 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 (do 64K-nagłówek bajtów) 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.

       IP_MTU Pobiera znaną aktualnie 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_ROUTER_ALERT
              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 w oparciu
              o protokół. Wymaga liczby całkowitej jako argumentu.

       IP_MULTICAST_TTL
              Ustawia lub pobiera wartość czas-życia-pakietu  dla  wychodzących  z  tego  gniazda
              pakietów  grupowych.  Jest  bardzo  istotnym  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_MULTICAST_LOOP
              Ustawia lub  pobiera  logiczny  argument  typu  całkowitego,  mówiący  o  tym,  czy
              przesyłane pakiety grupowe powinny wracać do lokalnego gniazda.

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

              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_DROP_MEMBERSHIP
              Odłącza się od grupy  adresów.  Argumentem  jest  struktura  ip_mreqn  lub  ip_mreq
              podobna do IP_ADD_MEMBERSHIP.

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

KONTROLKI SYSTEMOWE (SYSCTL)

       Protokół IP obsługuje interfejs kontrolek systemowych  (sysctl)  i  korzysta  z  niego  do
       ustawiania niektórych opcji globalnych. Kontrolki mogą być dostępne przez zapis lub odczyt
       wykonany na plikach /proc/sys/net/ipv4/* lub poprzez użycie interfejsu w  postaci  funkcji
       sysctl(2).  Zmienne  opisane  jako  logiczne  pobierają  liczbę  całkowitą, której wartość
       niezerowa ("true") oznacza, że dana  opcja  jest  włączona,  a  wartość  zerowa  ("false")
       oznacza, że opcja jest wyłączona.

       ip_always_defrag (logiczna)
              [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; ten plik nie jest obecny
              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  host  pomiędzy  hostem  ź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 hoście. 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
              Nie udokumentowane.

       ip_default_ttl (liczba, domyślnie: 64)
              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)
              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)
              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
              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 firewallami, które  robią  pewne
              założenia  odnośnie do portów używanych lokalnie. Pierwsza liczba powinna być równa
              co najmniej >1024, a lepiej >4096, aby uniknąć konfliktów z dobrze znanymi  portami
              i zminimalizować problemy z firewallami.

       ip_no_pmtu_disc (logiczna; domyślnie: wyłączona)
              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)
              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 WEJŚCIA/WYJŚCIA (IOCTL)

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

UWAGI

       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 nieostrożnością.

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

BŁĘDY

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

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

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

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

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

       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.

       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.

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

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

       EALREADY
              Operacja łączenia na gnieździe nieblokującym już trwa.

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

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

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

       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.

       ENODEV Urządzenie sieciowe niedostępne lub niezdolne do wysyłania pakietów IP.

       ENOPKG Podsystem jądra nie był konfigurowany.

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

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

WERSJE

       IP_MTU, IP_MTU_DISCOVER, IP_PKTINFO, IP_RECVERR i  IP_ROUTER_ALERT  są  nowymi  opcjami  w
       Linuksie  2.2.  Są  one  jednocześnie  specyficzne dla Linuksa i nie powinny być używane w
       przenośnych programach.

       struct ip_mreqn jest nowa w Linuksie 2.2. Linux 2.0 wspierał jedynie ip_mreq.

       Kontrolki systemowe pojawiły się z Linuksem 2.2.

ZGODNOŚĆ

       Dla  zgodności  z  Linuksem   2.0,   wciąż   jest   dopuszczalna   przestarzała   składnia
       socket(PF_INET,  SOCK_PACKET,  protokół),  by stworzyć gniazdo typu packet(7). Nie jest to
       zbyt poprawne i powinno  być  zastępowane  przez  socket(PF_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  aktualnie  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), ipfw(4), capabilities(7), netlink(7), raw(7),  socket(7),  tcp(7),
       udp(7)

       RFC 791 zawiera pierwotną specyfikację protokołu IP.
       RFC 1122 zawiera wymagania dla hostów IPv4.
       RFC 1812 zawiera wymagania dla routerów IPv4.

INFORMACJE O TŁUMACZENIU

       Powyższe  tłumaczenie  pochodzi  z nieistniejącego już Projektu Tłumaczenia Manuali i może
       nie być aktualne. W  razie  zauważenia  różnic  między  powyższym  opisem  a  rzeczywistym
       zachowaniem  opisywanego  programu  lub  funkcji,  prosimy  o  zapoznanie się z oryginalną
       (angielską) wersją strony podręcznika.