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  wza,  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 moe 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.