ip(7) Miscellaneous Information Manual ip(7) NAZWA ip - Implementacja protokolu IPv4 dla systemu Linux SKLADNIA #include #include #include /* nadzbior poprzedniego */ tcp_socket = socket(AF_INET, SOCK_STREAM, 0); udp_socket = socket(AF_INET, SOCK_DGRAM, 0); raw_socket = socket(AF_INET, SOCK_RAW, protocol); OPIS Linux implementuje protokol IPv4 opisany w RFC 791 i RFC 1122. ip zawiera drugi poziom implementacji adresowania grupowego (multicasting) zgodny z RFC 1112. Zawiera tez router IP, wlaczajac w to filtr pakietow. Interfejs programistyczny jest zgodny z gniazdami BSD. Wiecej informacji na temat gniazd mozna znalezc, przegladajac socket(7). Gniazdo IP jest tworzone za pomoca socket(2): socket(AF_INET, typ_gniazda, protokol); Prawidlowe typy gniazd obejmuja SOCK_STREAM do otwarcia gniazda strumieniowego, SOCK_DGRAM do otwarcia gniazda datagramowego i SOCK_RAW do otwarcia gniazda raw(7) w celu bezposredniego dostepu do protokolu IP. protocol jest protokolem IP w naglowku IP, ktory ma byc otrzymany lub wyslany. Prawidlowe wartosci protocol to: o 0 i IPPROTO_TCP dla gniazd strumieniowych tcp(7); o 0 i IPPROTO_UDP dla gniazd datagramowych udp(7); o IPPROTO_SCTP dla gniazd strumieniowych sctp(7); oraz o IPPROTO_UDPLITE dla gniazd datagramowych udplite(7). W przypadku SOCK_RAW mozna podac prawidlowe liczby przypisane w RFC 1700 protokolowi IP IANA. Kiedy proces chce odbierac nowe, nadchodzace pakiety lub polaczenia, powinien podlaczyc gniazdo do adresu lokalnego interfejsu za pomoca funkcji bind(2). W takim przypadku do dowolnej lokalnej pary (adres, port) mozna podlaczyc tylko jedno gniazdo IP. Gdy w wywolaniu bind(2) podana jest wartosc INADDR_ANY, to gniazdo zostanie dowiazane do wszystkich lokalnych interfejsow sieciowych. Gdy do niedowiazanego gniazda wywolywane jest listen(2), to gniazdo zostanie automatycznie dowiazane do losowo wybranego wolnego portu, przy czym adres lokalny zostanie ustawiony na INADDR_ANY. Gdy dla niedowiazanego gniazda zostanie wywolane connect(2), gniazdo to zostanie automatycznie dowiazane do losowo wybranego wolnego portu lub do uzywalnego portu dzielonego, przy czym adres lokalny zostanie ustawiony na INADDR_ANY. Przypisywanie (czesto w literaturze: "nazywanie") lokalnego gniazda TCP jest niemozliwe przez pewien okres czasu po jego zamknieciu, chyba ze zostanie dla tego gniazda ustawiony atrybut SO_REUSEADDR. Nalezy uzywac tego atrybutu z rozwaga, gdyz czyni on TCP mniej niezawodnym. Format adresu Adres gniazda IP jest przedstawiony za pomoca kombinacji adresu interfejsu IP i 16-bitowego numeru portu. Podstawowy protokol IP nie zawiera numerow portow, sa one zaimplementowane w protokolach wyzszej warstwy, takich jak udp(7) i tcp(7). Dla gniazd surowych sin_port jest ustawione na protokol IP. struct sockaddr_in { sa_family_t sin_family; /* rodzina adresow: AF_INET */ in_port_t sin_port; /* port - sieciowa kolejnosc bajtow */ struct in_addr sin_addr; /* adres internetowy */ }; /* adres internetowy */ struct in_addr { uint32_t s_addr; /* adres - sieciowa kolejnosc bajtow */ }; sin_family ma zawsze wartosc AF_INET. Jest to wymagane; w Linuksie 2.2 wiekszosc funkcji sieciowych zwraca EINVAL, jesli brakuje tego ustawienia. sin_port zawiera numer portu podany w sieciowej kolejnosci bajtow. Numery portow nizsze niz 1024 sa nazywane portami uprzywilejowanymi (lub czasem portami zarezerwowanymi). Tylko procesy uprzywilejowane (na Linuksie: proces z przywilejem CAP_NET_BIND_SERVICE w przestrzeni nazw uzytkownika zarzadzajaca swoja sieciowa przestrzenia nazw) moga wywolac bind(2) dla tego rodzaju gniazd. Nalezy zauwazyc, ze surowy protokol IPv4 jako taki nie zawiera pojecia portu (takie rozroznienie jest dopiero w warstwie transportowej, a to jest warstwa sieciowa). Numery portow wystepuja dopiero w protokolach wyzszej 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 kolejnosci bajtow. Polu in_addr nalezy albo przypisac jedna z wartosci INADDR_* (np. INADDR_LOOPBACK) za pomoca htonl(3), albo uzyc funkcji bibliotecznych inet_aton(3), inet_addr(3), inet_makeaddr(3) do ustawienia wartosci, albo ustawic bezposrednio przez funkcje obslugi nazw (patrz tez gethostbyname(3)). Adresy IPv4 dzielimy na pojedyncze (unicast), rozgloszeniowe (broadcast) i grupowe (multicast). Adresy pojedyncze okreslaja pojedynczy interfejs maszyny, adresy rozgloszeniowe okreslaja wszystkie maszyny w obrebie jakiejs sieci (podsieci), a adresy grupowe wszystkie maszyny w obrebie jakiejs grupy odbiorcow. Datagramy kierowane do adresow rozgloszeniowych trafiaja do odbiorcy tylko wtedy, gdy jego gniazdo ma ustawiony atrybut rozgloszenia SO_BROADCAST. Ten sam atrybut musi byc tez ustawiony, gdy zachodzi potrzeba wyslania datagramow rozgloszenia. W obecnej implementacji gniazda polaczeniowe moga uzywac wylacznie adresow pojedynczych. Nalezy zauwazyc, ze dla adresu i portu zawsze jest uzywana sieciowa kolejnosc bajtow. W szczegolnosci oznacza to, ze trzeba uzywac funkcji htons(3) dla numeru przypisanego do portu. Wszystkie funkcje standardowej biblioteki manipulujace adresem/portem automatycznie przeksztalcaja podana wartosc na jej sieciowa reprezentacje. Adresy specjalne i zarezerwowane Istnieje wiele adresow specjalnych: INADDR_LOOPBACK (127.0.0.1) zawsze odnosi sie do komputera lokalnego za posrednictwem urzadzenia petli zwrotnej (loopback); INADDR_ANY (0.0.0.0) oznacza kazdy adres, do kojarzenia gniazd; INADDR_BROADCAST (255.255.255.255) ma w przypadku bind(2), ze wzgledow historycznych, taki sam skutek jak INADDR_ANY. Pakiet zaadresowany do INADDR_BROADCAST za posrednictwem gniazda z ustawionym SO_BROADCAST bedzie rozglaszal do wszystkich stacji w segmencie sieci lokalnej, tak dlugo, jak polaczenie ma mozliwosc rozglaszania. Najwyzsze numery adresow Najnizsze numery adresow W kazdej podsieci lokalnej, innej niz punkt do punktu, z polaczeniem obslugujacym rozglaszanie, adres o najwyzszym mozliwym numerze (np. adres .255 w podsieci z maska sieciowa 255.255.255.0) sluzy jako adres rozgloszeniowy. Nie mozna go uzytecznie przypisac do indywidualnego interfejsu i mozna go zaadresowac jedynie gniazdem z ustawiona opcja SO_BROADCAST. Standardy internetowe historycznie rezerwowaly rowniez adres o najnizszym mozliwym numerze (np. adres .0 w podsieci z maska sieciowa 255.255.255.0) do rozglaszania, choc nazywaly go ,,przestarzalym" do tego celu (czesc zrodel odnosi sie do niego rowniez jako do ,,adresu sieci"). Od Linuksa 5.14 jest on traktowany jako standardowy adres pojedynczy i moze byc przypisany do interfejsu. Standardy internetowe tradycyjnie rezerwowaly rowniez rozne adresy do okreslonych celow, choc Linux czesci z nich nie traktuje juz w specjalny sposob. [0.0.0.1, 0.255.255.255] [240.0.0.0, 255.255.255.254] Adresy w tych zakresach (0/8 i 240/4) sa zarezerwowane globalnie. Od Linuksa 5.3 i Linuksa 2.6.25 adresy, odpowiednio, 0/8 i 240/4, inne niz INADDR_ANY i INADDR_BROADCAST sa traktowane jako zwykle adresy pojedyncze. Systemy przestrzegajace tradycyjnego zachowania moga nie wspolpracowac z tymi zakresami historycznie zarezerwowanych adresow. [127.0.0.1, 127.255.255.254] Adresy w tym zakresie (127/8) sa traktowane jako adresy petli zwrotnej, podobnie do standardowego adresu petli zwrotnej INADDR_LOOPBACK (127.0.0.1); [224.0.0.0, 239.255.255.255] Adresy w tym zakresie (224/4) sa przeznaczone do uzycia grupowego (multicast). Opcje gniazda IP wspiera niektore opcje specyficzne dla protokolu, ktore moga byc ustawione przy uzyciu setsockopt(2) i odczytane z pomoca getsockopt(2). Poziom opcji gniazda dla IP to IPPROTO_IP. Dla kazdego ze znacznikow logicznych wartosc calkowita zero oznacza falsz, a kazda inna - prawde. Gdy poda sie nieprawidlowa opcje gniazda, getsockopt(2) i setsockopt(2) zwroca blad ENOPROTOOPT. IP_ADD_MEMBERSHIP (od Linuksa 1.2) Przylacza grupe adresow. 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, ktora aplikacja chce podlaczyc lub rozlaczyc. Musi byc to poprawny adres grupowy (multicast; w przeciwnym wypadku setsockopt(2) zwroci blad EINVAL). imr_address jest to adres lokalnego interfejsu, przez ktory system powinien polaczyc grupe; jesli jest rowny INADDR_ANY, to odpowiedni interfejs jest wybierany przez system. imr_ifindex jest indeksem interfejsu, ktory powinien byc podlaczony/odlaczony do obslugi grupy imr_multiaddr lub 0, by wskazac na dowolny interfejs. Struktura ip_mreqn jest dostepna tylko od wersji 2.2 Linuksa. Dla kompatybilnosci, stara struktura ip_mreq wciaz jest obslugiwana. Rozni sie wprawdzie od ip_mreqn, lecz tylko tym, ze nie zawiera pola imr_ifindex (jadro okresla ktora strukture zastosowano na podstawie rozmiaru podanego w optlen). IP_ADD_MEMBERSHIP jest prawidlowe wylacznie dla setsockopt(2). IP_ADD_SOURCE_MEMBERSHIP (od Linuksa 2.4.22 / Linuksa 2.5.68) Przylacza adres grupowy (multicast) i zezwala na otrzymywanie danych jedynie z podanego zrodla. 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 zrodla */ }; Struktura ip_mreq_source jest podobna do ip_mreqn opisanej pod haslem IP_ADD_MEMBERSHIP. Pole imr_multiaddr zawiera adres grupowy do ktorego aplikacja ma zamiar dolaczyc lub opuscic go. Pole imr_interface jest adresem interfejsu lokalnego z ktorego system powinien dolaczyc do adresu grupowego. Pole imr_sourceaddr zawiera adres zrodlowy, z ktorego aplikacja ma zamiar otrzymywac dane. Opcja moze byc uzyta kilkakrotnie aby otrzymywac dane z kilku zrodel. IP_BIND_ADDRESS_NO_PORT (od Linuksa 4.2) Informuje jadro, aby nie rezerwowac portu efemerycznego przy korzystaniu z bind(2) z numerem portu 0. Port bedzie wybrany automatycznie pozniej, w trakcie wykonywania connect(2), w sposob umozliwiajacy wspoldzielenie portu zrodlowego tak dlugo, jak dlugo unikatowa jest czteroelementowa krotka. IP_BLOCK_SOURCE (od Linuksa 2.4.22 / 2.5.68) Konczy otrzymywanie danych grupowych z podanego zrodla i podanej grupy. Jest to odpowiednie jedynie po zapisaniu sie do adresu grupowego za pomoca IP_ADD_MEMBERSHIP lub IP_ADD_SOURCE_MEMBERSHIP. Argumentem jest struktura ip_mreq_source opisana w czesci dotyczacej IP_ADD_SOURCE_MEMBERSHIP. IP_DROP_MEMBERSHIP (od Linuksa 1.2) Odlacza sie od grupy adresow. 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) Odlacza sie od grupy z podanego zrodla -- zaprzestaje otrzymywania danych z podanej grupy adresow pochodzacej z podanego zrodla. Jesli programy zostaly przypisane do wielu zrodel z tej samej grupy, dane z pozostalych zrodel wciaz beda dostarczane. Aby zatrzymac otrzymywanie danych ze wszystkich zrodel na raz, nalezy uzyc IP_DROP_MEMBERSHIP. Argumentem jest struktura ip_mreq_source opisana w czesci dotyczacej IP_ADD_SOURCE_MEMBERSHIP. IP_FREEBIND (od Linuksa 2.4) Jesli jest wlaczona, to ta opcja logiczna pozwala na przypisanie do adresu nielokalnego lub (jeszcze) nieistniejacego. Pozwala to na nasluchiwanie na gniezdzie bez wymagania, zeby interfejs sieciowy nizszej warstwy lub podany dynamiczny adres IP byly ustawione podczas proby przypisania gniazda przez aplikacje. Ta opcja jest odpowiednikiem - dla pojedynczego gniazda - opisanego ponizej interfejsu /proc ip_nonlocal_bind. IP_HDRINCL (od Linuksa 2.0) Jesli wlaczone, to dopuszczalne jest tworzenie przez uzytkownika wlasnego naglowka IP przed danymi uzytkownika. Dziala to jedynie dla gniazd SOCK_RAW, patrz raw(7), by uzyskac wiecej informacji. Gdy ten znacznik jest wlaczony, to wartosci ustawiane przez IP_OPTIONS, IP_TTL i IP_TOS sa ignorowane. IP_LOCAL_PORT_RANGE (od Linuksa 6.3) Ustawia lub pobiera domyslny przedzial lokalnych portow przypisany do gniazda. Opcji tej mozna uzyc do zawezenia dla danego gniazda, globalnego przedzialu lokalnych portow, zdefiniowanego w interfejsie /proc ip_local_port_range opisanym ponizej. Opcja przyjmuje wartosc uint32_t, gdzie wysokie 16 bitow ustawia gorna granice przedzialu (wlacznie), a niskie 16 bitow ustawia dolna granice przedzialu (wlacznie). Wartosci 16-bitowe powinny przestrzegac kolejnosci bajtow komputera. Dolna granica przedzialu musi byc mniejsza od gornej granicy przedzialu, a zadna nie moze wynosic zero. Przy naruszeniu tych warunkow, ustawienie opcji zawiedzie z bledem EINVAL. Jesli ktoras z granic jest poza globalnym przedzialem portow lokalnych lub wynosi zero, to przedzial nie ma zastosowania. Aby zresetowac ustawienie, nalezy podac zero jako zarowno gorna jak i dolna granice przedzialu. IP_MSFILTER (od Linuksa 2.4.22 / 2.5.68) Opcja pozwala na uzyskanie dostepu do zaawansowanego interfejsu filtrowania pelnostanowego. Argumentem jest struktura ip_msfilter. struct ip_msfilter { struct in_addr imsf_multiaddr; /* grupowy adres IP struct in_addr imsf_interface; /* adres IP interfejsu lokalnego */ uint32_t imsf_fmode; /* Tryb filtrowania */ uint32_t imsf_numsrc; /* Liczba zrodel w ponizszej tablicy */ struct in_addr imsf_slist[1]; /* Tablica zrodel adresow */ }; Do okreslenia trybu filtrowania sluza dwa makra - MCAST_INCLUDE i MCAST_EXCLUDE. Makro IP_MSFILTER_SIZE(n) sluzy natomiast do okreslenia wielkosci pamieci potrzebnej do przechowania struktury ip_msfilter z n zrodel w liscie zrodel. Pelny opis filtrowania zrodel adresow zawiera dokument RFC 3376. IP_MTU (od Linuksa 2.2) Pobiera biezaca wartosc MTU sciezki obecnego gniazda. Zwraca liczbe calkowita. IP_MTU jest poprawne tylko do getsockopt(2) i mozna go uzyc wylacznie gdy gniazdo zostalo polaczone. IP_MTU_DISCOVER (od Linuksa 2.2) Ustawia lub pobiera opcje badania MTU sciezki (ang. Path MTU Discovery) dla gniazda. Gdy opcja ta jest wlaczona, to Linux bedzie przeprowadzal badanie MTU sciezki dla gniazd SOCK_STREAM zgodnie z definicja zawarta w RFC 1191. W przypadku gniazd nie bedacych gniazdami SOCK_STREAM, IP_PMTUDISC_DO wymusza ustawienie we wszystkich pakietach wychodzacych znacznika zakazu fragmentacji. Za poprawne zgodne z wartoscia MTU, podzielenie na pakiety i za wykonanie ewentualnych retransmisji jest odpowiedzialny program uzytkownika. Jadro odrzuci (z bledem EMSGSIZE) pakiety wieksze niz znane MTU sciezki. Ustawienie znacznika IP_PMTUDISC_WANT spowoduje sfragmentowanie datagramu, jesli MTU sciezki tego wymaga, albo - w przeciwnym wypadku - ustawienie znacznika zakazujacego fragmentacji. Domyslna dla systemu wartosc mozna ustawic na IP_PMTUDISC_WANT lub na IP_PMTUDISC_DONT, wpisujac odpowiednio - zero lub wartosc niezerowa - do pliku /proc/sys/net/ipv4/ip_no_pmtu_disc. Wart. badan. MTU sciezki Znaczenie IP_PMTUDISC_WANT Uzywaj ustawien zaleznych od trasy. IP_PMTUDISC_DONT Nie badaj MTU sciezki. IP_PMTUDISC_DO Zawsze badaj MTU sciezki. IP_PMTUDISC_PROBE Ustawia bit DF, ale ignoruje MTU sciezki. Gdy wlaczone jest badanie MTU sciezki, jadro automatycznie namierza wartosci MTU sciezki dla kazdego komputera docelowego. Gdy aktywne jest polaczenie z danym komputerem, mozna wygodnie odczytac aktualnie rozpoznana wartosc MTU sciezki za pomoca connect(2) uzywajac opcji gniazda IP_MTU (np. po wystapieniu bledu EMSGSIZE). Wartosc MTU sciezki moze sie zmieniac z czasem. Dla gniazd bezpolaczeniowych z wieloma komputerami docelowymi MTU dla danego, rowniez nowego, komputera docelowego mozna uzyskac za pomoca kolejki bledow (zobacz IP_RECVERR). Po nadejsciu kazdej aktualizacji MTU zostanie skolejkowany nowy blad. W trakcie rozpoznawania MTU, pakiety inicjujace z gniazd datagramowych moga zostac porzucone. Programy korzystajace z UDP powinny byc tego swiadome i nie brac tego pod uwage w swojej strategii retransmisji pakietow. Aby zainicjowac proces badania MTU sciezki dla gniazd niepolaczonych, mozna rozpoczac z duzym rozmiarem datagramu (naglowek o dlugosci do 64 kilobajtow) i pozwolic na jego zmniejszenie w wyniku aktualizacji MTU sciezki. Aby oszacowac inicjalne MTU sciezki, nalezy podlaczyc gniazdo datagramowe do adresu docelowego za pomoca connect(2) i pobrac MTU, wolajac getsockopt(2) z opcja IP_MTU. Poprzez ustawienie wartosci w IP_PMTUDISC_PROBE (dostepnej od Linuksa 2.6.22) mozliwe jest zaimplementowanie opisanego w RFC 4821 probkowania MTU dla gniazd SOCK_DGRAM lub SOCK_RAW. Jest to szczegolnie uzyteczne w narzedziach diagnostycznych typu tracepath(8), ktore w sposob zamierzony chca wysylac pakiety testowe wieksze niz zaobserwowane MTU sciezki. IP_MULTICAST_ALL (od Linuksa 2.6.31) Tej opcji mozna uzyc do modyfikacji zasad dostarczania wiadomosci grupowych. Argument wynosi 0 lub 1 (domyslnie 1). Gdy jest ustawiony na 1, to gniazdo otrzyma wiadomosci ze wszystkich grup, ktore dolaczono globalnie z calego systemu. W przeciwnym razie dostarczone beda tylko wiadomosci z grup dolaczonych jawnie (np. opcja IP_ADD_MEMBERSHIP) do tego konkretnego gniazda. IP_MULTICAST_IF (od Linuksa 1.2) Ustawia lokalne urzadzenie dla gniazda grupowego. Argumentem do setsockopt(2) jest ip_mreqn lub (od Linuksa 3.5) ip_mreq, struktura podobna do IP_ADD_MEMBERSHIP; albo struktura in_addr (jadro okresla ktora strukture sie podalo na podstawie rozmiaru przekazanego w optlen). Do getsockopt(2) argumentem jest struktura in_addr. IP_MULTICAST_LOOP (od Linuksa 1.2) Ustawia lub pobiera logiczny argument typu calkowitego, okreslajacy, czy przesylane pakiety grupowe powinny wracac do lokalnego gniazda. IP_MULTICAST_TTL (od Linuksa 1.2) Ustawia lub pobiera wartosc czasu zycia pakietu dla wychodzacych z tego gniazda pakietow grupowych. Jest bardzo istotne w przypadku adresowania grupowego, by ustawic najmniejsza mozliwa wartosc TTL. Domyslnie jest to 1, co oznacza, ze pakiety grupowe nie opuszczaja sieci lokalnej, chyba ze program uzytkownika wyraznie tego zada. Argument jest liczba calkowita. IP_NODEFRAG (od Linuksa 2.6.36) Jesli wlaczone (argument jest niezerowy), laczenie pakietow wychodzacych przez warstwe netfilter jest wylaczone. Argumentem jest liczba calkowita. Ta opcja jest prawidlowa tylko dla gniazd SOCK_RAW. IP_OPTIONS (od Linuksa 2.0) Ustawia lub pobiera opcje IP, ktore beda wysylane z kazdym pakietem z danego gniazda. Argumenty sa wskaznikiem do bufora pamieci zawierajacego opcje i ich dlugosci. setsockopt(2) ustawia opcje IP skojarzone z gniazdem. Maksymalny rozmiar opcji dla IPv4 to 40 bajtow. Zobacz RFC 791, by poznac mozliwe opcje. Gdy pakiet wstepnego potwierdzenia polaczenia (ACK) dla gniazda typu SOCK_STREAM zawiera opcje IP, to opcje wychodzacego pakietu IP beda automatycznie pobrane z opcji IP pobranego pakietu z odwroconymi naglowkami mowiacymi o trasie. Po ustanowieniu polaczenia przychodzace pakiety nie sa uprawnione do zmiany swoich opcji. Przetwarzanie wszystkich przychodzacych opcji zrodla jest domyslnie wylaczone, ale mozna je wlaczyc ustawiajac accept_source_route w interfejsie /proc. W przypadku gniazd datagramowych opcje IP moga byc ustawione jedynie przez uzytkownika lokalnego. Funkcja getsockopt(2) z argumentem IP_OPTIONS zwroci obecnie wyslane opcje przez umieszczenie ich w dostarczonym buforze. IP_PASSSEC (od Linuksa 2.6.17) Jesli na stacjach wysylajacych i przyjmujacych skonfigurowano etykietowany IPSEC lub NetLabel, opcja ta wlacza kontekst bezpieczenstwa drugiego gniazda, w komunikacie pomocniczym typu SCM_SECURITY, odbieranym za pomoca recvmsg(2). Opcja jest wspierana tylko dla gniazd UDP; w przypadku gniazd TCP lub SCTP prosze przeczytac opis opcji SO_PEERSEC ponizej. Podana wartosc jest argumentem do setsockopt(2), a zwracana jako wynik getsockopt(2) jest flaga logiczna bedaca liczba calkowita. Kontekst bezpieczenstwa zwrocony przez komunikat pomocniczy SCM_SECURITY ma ten sam format, jak opisany przy opcji SO_PEERSEC ponizej. Uwaga: ponowne uzycie typu komunikatu SCM_SECURITY dla opcji gniazda IP_PASSSEC bylo prawdopodobnie pomylka, jako ze pozostale komunikaty kontrolne IP maja swoj schemat numeracji w przestrzeni nazw IP i czesto uzywaja wartosci opcji gniazda jako typu komunikatu. Obecnie nie wystepuje konflikt, poniewaz opcja IP z taka sama wartoscia jak SCM_SECURITY jest IP_HDRINCL, a ona nigdy nie jest uzywana do typu komunikatow kontrolnych. IP_PKTINFO (od Linuksa 2.2) Przekazuje pomocniczy komunikat IP_PKTINFO zawierajacy strukture pktinfo dostarczajaca troche informacji o przychodzacym pakiecie. Dziala to jedynie dla gniazd datagramowych. Argument jest znacznikiem mowiacym gniazdu, czy nalezy przekazac komunikat IP_PKTINFO, czy tez nie. Sam komunikat moze zostac przeslany/otrzymany wraz z pakietem jedynie jako komunikat sterujacy za pomoca 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; /* Naglowek adresu docelowego */ }; ipi_ifindex jest unikatowym indeksem interfejsu, przez ktory pakiet zostal odebrany. Adres ipi_spec_dst jest lokalnym adresem pakietu, a ipi_addr jest adresem docelowym wynikajacym z naglowka pakietu. Jesli IP_PKTINFO jest przekazane do sendmsg(2), a ipi_spec_dst ma wartosc niezerowa, to zostanie uzyte jako zrodlowy adres lokalny podczas przeszukiwania tablicy trasowania i dla ustawienia opcji trasowania wedlug adresu zrodlowego. Gdy ipi_ifindex ma wartosc niezerowa, to podstawowy adres lokalny interfejsu wskazywanego przez ten indeks nadpisuje ipi_spec_dst podczas przeszukiwania tablicy trasowania. IP_RECVERR (od Linuksa 2.2) Wlacza przekazywanie dodatkowych komunikatow o bledach, zwiekszajac niezawodnosc polaczenia. Gdy jest to ustawione w gniezdzie datagramowym, to wszystkie generowane bledy beda zapamietane w specjalnej kolejce bledow przypisanej do gniazda. Gdy uzytkownik (proces uzytkownika) otrzyma blad (przez zwrocony kod bledu operacji na gniezdzie), to moze go odebrac, uzywajac funkcji recvmsg(2) z ustawionym znacznikiem MSG_ERRQUEUE. Struktura opisujaca blad sock_extended_err zostanie przekazana w pomocniczym komunikacie o typie IP_RECVERR i poziomie IPPROTO_IP. Jest to niezwykle pomocne przy niezawodnym przechwytywaniu bledow niepolaczonych gniazd. Odbierana z kolejki bledow porcja danych zawiera pakiet z informacja o bledzie. Komunikat sterujacy IP_RECVERR zawiera strukture sock_extended_err zdefiniowana nastepujaco: #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 bledu */ uint8_t ee_origin; /* zrodlo bledu */ 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 moga wystapic dodatkowe dane */ }; struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *); ee_errno zawiera numer errno bledu kolejki. ee_origin jest kodem miejsca pochodzenia bledu. Pozostale pola sa zalezne od protokolu. Makro SO_EE_OFFENDER zwraca wskaznik do adresu obiektu sieciowego, z ktorego pochodzil blad o zadanym wskazniku do komunikatu pomocniczego. Gdy ten adres nie jest znany, pole sa_family struktury sockaddr zawiera wartosc AF_UNSPEC a pozostale pola tej struktury sockaddr sa niezdefiniowane. IP uzywa struktury sock_extended_err w nastepujacy sposob: ee_origin ustawione na SO_EE_ORIGIN_ICMP dla bledow odbieranych jako pakiet ICMP albo tez SO_EE_ORIGIN_LOCAL dla bledow generowanych lokalnie. Nieznane wartosci nalezy ignorowac. ee_type i ee_code sa ustawiane zgodnie z typem i kodem pol w naglowku ICMP. ee_info zawiera rozpoznana wartosc MTU dla bledow EMSGSIZE. Komunikat zawiera rowniez sockaddr_in wezla, ktory spowodowal blad, a do ktorego mozna uzyskac dostep za pomoca makra SO_EE_OFFENDER. Pole sin_family adresu SO_EE_OFFENDER ma wartosc AF_UNSPEC, gdy zrodlo bledu nie jest znane. Gdy blad pochodzi z sieci, wszystkie opcje IP (IP_OPTIONS, IP_TTL itd.) wlaczone w gniezdzie i zawarte w pakiecie bledu sa przekazywane jako komunikaty kontrolne. Wlasciwe dane pakietu, ktory spowodowal blad sa zwracane jako normalne dane. Nalezy zauwazyc, ze TCP nie ma kolejki bledow; MSG_ERRQUEUE jest nielegalne w przypadku gniazd SOCK_STREAM. IP_RECVERR jest poprawne dla TCP, ale wszystkie bledy sa przekazywane przez zwracana wartosc funkcji albo przez SO_ERROR. Dla gniazd surowych, IP_RECVERR wlacza przepuszczanie do aplikacji wszystkich odebranych komunikatow ICMP o bledach. W przeciwnym przypadku bledy sa zglaszane tylko dla gniazd polaczonych. Ustawia lub pobiera znacznik logiczny zapisany za pomoca liczby calkowitej. IP_RECVERR jest domyslnie wylaczone. IP_RECVOPTS (od Linuksa 2.2) Przekazuje uzytkownikowi wszystkie nadchodzace opcje IP z komunikatu sterujacego IP_OPTIONS. Naglowek wyboru trasy i inne opcje sa juz wstepnie wypelnione informacjami o lokalnej maszynie. Nieobslugiwane w przypadku gniazd typu SOCK_STREAM. IP_RECVORIGDSTADDR (od Linuksa 2.6.29) Ta opcja logiczna wlacza komunikat pomocniczy IP_ORIGDSTADDR w recvmsg(2), w ktorym jadro zwraca oryginalny adres docelowy otrzymywanego wlasnie datagramu. Ten komunikat pomocniczy zawiera strukture struct sockaddr_in. IP_RECVTOS (od Linuksa 2.2) Jesli jest ustawione, to pomocniczy komunikat IP_TOS jest przepuszczany razem z nadchodzacymi pakietami. Zawiera on bajt, ktory okresla pole zdefiniowane takze jako bajt znajdujace sie w naglowku pakietu, a zwane Typ Uslugi/Pierwszenstwa. Wymaga logicznego znacznika w postaci liczby calkowitej. IP_RECVTTL (od Linuksa 2.2) Gdy ten znacznik jest ustawiony, przepuszczany jest komunikat pomocniczy IP_TTL, zawierajacy pole okreslane mianem ,,czas zycia" odbieranego pakietu w postaci 32-bitowej liczby. Nie jest to wspierane w przypadku strumieniowych gniazd typu SOCK_STREAM. IP_RETOPTS (od Linuksa 2.2) Dzialanie identyczne do IP_RECVOPTS, ale zwraca surowe, nieprzetworzone opcje, wlacznie z rekordem opcji, mowiacym o znaczniku czasowym i trasie, niewypelnionym wartosciami w tym przejsciu pakietu. IP_ROUTER_ALERT (od Linuksa 2.2) Przekazuje wszystkie pakiety z opcja alarmu rutera IP, ktore mialyby byc przekazywane (ang. forwarded) do tego gniazda. Dziala tylko dla gniazd surowych. Jest to przydatne na przyklad dla demonow RSVP dzialajacych w przestrzeni uzytkownika. Wykorzystane pakiety nie sa przekazywane (ang. forwarded) przez jadro. Ponowne ich wyslanie nalezy do obowiazkow programu uzytkownika. Dowiazywanie gniazda jest w tym przypadku ignorowane, pakiety te sa filtrowane jedynie na podstawie protokolu. Wymaga liczby calkowitej jako argumentu. IP_TOS (od Linuksa 1.0) Ustawia lub pobiera pole znacznika Typ-Uslugi (ang. Type-Of-Service, w skrocie TOS), ktore jest przesylane z kazdym pakietem IP pochodzacym z danego gniazda. Sluzy do ustalenia priorytetow pakietow w sieci. TOS jest bajtem. Oto definicje niektorych standardowych znacznikow TOS: IPTOS_LOWDELAY - minimalizacja opoznienia we wzajemnym ruchu, IPTOS_THROUGHPUT - optymalizacja wyjscia, IPTOS_RELIABILITY - optymalizacja pod katem niezawodnosci, a IPTOS_MINCOST powinna byc uzywana jako ,,dane wypelniajace" tam, gdzie szybkosc transmisji nie ma wiekszego znaczenia. Mozna podac najwyzej jedna z powyzszych wartosci TOS. Inne bity sa niepoprawne i powinny byc wyzerowane. Linux domyslnie wysyla najpierw datagram IPTOS_LOWDELAY, ale dokladne zachowanie zalezy od konfiguracji wlasciwosci szeregowania. Niektore poziomy o wysokim priorytecie moga wymagac uprawnien administratora (ustawionego atrybutu CAP_NET_ADMIN). IP_TRANSPARENT (od Linuksa 2.6.24) Ustawienie tej opcji logicznej wlacza przezroczyste (ang. ,,transparent") proxy dla tego gniazda. Ta opcja gniazda pozwala wywolujacej aplikacji przypisanie gniazda do nielokalnego adresu IP i operowanie jako zarowno klient, jak i serwer z zewnetrznym adresem IP dla lokalnego punktu docelowego. UWAGA: wymaga to takiego ustawienia regul trasowania, zeby pakiety wysylane na ten adres zewnetrzny byly przekazywane przez TProxy (tj. system na ktorym dziala aplikacja korzysta z opcji gniazda IP_TRANSPARENT). Wlaczenie tej opcji wymaga uprawnien administratora (przywilej CAP_NET_ADMIN). Przekierowanie TProxy uzywajace celu TPROXY z iptables(8) takze wymagaja wlaczenia tej opcji w przekierowywanym gniezdzie. IP_TTL (od Linuksa 1.0) Ustawia lub pobiera pole ,,czas zycia" (ang. Time-To-Live, w skrocie TTL) dla kazdego wychodzacego z danego gniazda pakietu IP. IP_UNBLOCK_SOURCE (od Linuksa 2.4.22 / 2.5.68) Odblokowuje zablokowana uprzednio grupe adresow. Zwraca EADDRNOTAVAIL gdy podane zrodlo nie bylo zablokowane. Argumentem jest struktura ip_mreq_source opisana w czesci dotyczacej IP_ADD_SOURCE_MEMBERSHIP. SO_PEERSEC (od Linuksa 2.6.17) Jesli na stacjach wysylajacych i przyjmujacych skonfigurowano etykietowany IPSEC lub NetLabel, ta opcja gniazda tylko do odczytu zwraca kontekst bezpieczenstwa drugiego gniazda polaczonego z tym gniazdem. Domyslnie bedzie to taka sama wartosc jak wartosc kontekstu procesu tworzacego drugie gniazdo, chyba ze zostanie przesloniona zasadami lub procesem z wymaganymi uprawnieniami. Argumentem do getsockopt(2) jest wskaznik do bufora okreslonej dlugosci w bajtach, ktorego lancuch kontekstu bezpieczenstwa ma zostac skopiowany. Jesli dlugosc bufora jest mniejsza niz dlugosc lancucha kontekstu bezpieczenstwa, to getsockopt(2) zwroci -1, ustawi errno na ERANGE i zwroci wymagana dlugosc za pomoca optlen. Wywolujacy powinien poczatkowo przydzielic co najmniej NAME_MAX bajtow dla bufora, choc nie ma gwarancji, ze bedzie to wielkosc wystarczajaca. Moze zajsc koniecznosc dostosowania wielkosci bufora do zwroconej dlugosci i wykonanie drugiego podejscia. Lancuch kontekstu bezpieczenstwa moze zawierac konczacy znak null w zwracanej dlugosci, ale nie jest to gwarantowane. Kontekst bezpieczenstwa "foo" moze byc reprezentowany jako {'f','o','o'} o dlugosci 3 lub {'f','o','o','\0'} o dlugosci 4, oba te warianty sa uwazane za rownorzedne. Lancuch jest drukowalny, nie zawiera znakow null innych niz konczace lancuch oraz ma nieokreslone kodowanie (w szczegolnosci, nie gwarantuje sie kodowania ASCII lub UTF-8). Uzycie tej opcji do gniazd w rodzinie adresowej AF_INET jest obslugiwane od Linuksa 2.6.17 w przypadku gniazd TCP, a od Linuksa 4.17 w przypadku gniazd SCTP. W przypadku SELinuksa, NetLabel przenosi jedynie czesc MLS kontekstu bezpieczenstwa partnera poprzez lacze, pozostala czesc kontekstu bezpieczenstwa uzyskuje wartosci domyslne, zdefiniowane w poczatkowym identyfikatorze bezpieczenstwa (SID) netmsg. NetLabel mozna jednak skonfigurowac, w celu przesylania pelnego kontekstu bezpieczenstwa petla zwrotna. Etykietowany IPSEC zawsze przekazuje pelny kontekst bezpieczenstwa, jako czesc ustanawiania powiazania bezpieczenstwa (ang. security association - SA) i sprawdza je w zaleznosci od powiazania dla kazdego pakietu. Interfejsy /proc Protokol IP obsluguje zbior interfejsow /proc i korzysta z niech do ustawiania niektorych parametrow globalnych. Parametry sa dostepne przez zapis lub odczyt plikow z katalogu /proc/sys/net/ipv4/. Interfejsy opisane jako logiczne pobieraja liczbe calkowita, ktorej wartosc niezerowa (,,prawda") oznacza, ze dana opcja jest wlaczona, a zero (,,falsz"), oznacza, ze opcja jest wylaczona. ip_always_defrag (logiczna; od Linuksa 2.2.13) [Nowa w Linuksie 2.2.13; we wczesniejszych wersjach jadra funkcja ta sterowalo sie w czasie kompilacji za pomoca opcji CONFIG_IP_ALWAYS_DEFRAG, ktora nie jest juz obecna w Linuksie 2.4.x i kolejnych] Gdy ten znacznik logiczny jest wlaczony (rozny od 0), przychodzace fragmenty (czesci pakietow IP, ktore sie pojawiaja, gdy pewien komputer pomiedzy komputerem zrodlowym a docelowym zdecyduje, ze pakiety byly za duze i podzieli je na kawalki) beda ponownie zlozone (zdefragmentowane) przed ich przetworzeniem, nawet jesli maja byc przekazane dalej (and. forwarded). Nalezy wlaczac jedynie przy dzialajacej zaporze sieciowej, stanowiacej glowne wejscie do danej sieci lub dzialajacym przezroczystym proxy; nigdy nie nalezy tego wlaczac na zwyklym routerze lub komputerze. W przeciwnym przypadku lacznosc moze zostac zaklocona, gdy fragmenty beda podrozowac innymi laczami. Defragmentacja powoduje rowniez znaczne wykorzystanie pamieci i czasu procesora. Jest to wlaczane automagicznie, gdy skonfigurowane jest maskowanie lub przezroczyste proxy. ip_autoconfig (od Linuksa 2.2 do Linuksa 2.6.17) Nie udokumentowane. ip_default_ttl (liczba, domyslnie: 64; od Linuksa 2.2) Ustawia domyslna wartosc ,,czasu zycia" (ang. time-to-live) wychodzacych pakietow. Moze byc ona zmieniona dla gniazda za pomoca opcji IP_TTL. ip_dynaddr (logiczna; domyslnie: wylaczona; od Linuksa 2.0.31) Wlacza dynamiczne adresowanie gniazda oraz przepisywanie adresu dla maskowania przy zmianie adresu interfejsu. Jest to bardzo przydatne w przypadku korzystania z interfejsu sprzegnietego z linia telefoniczna, ktorego adres IP moze sie zmieniac. 0 oznacza brak przepisywania, 1 wlacza przepisywanie, a 2 wlacza tryb rozwlekly (ang. verbose). ip_forward(logiczna; domyslnie: wylaczona; od Linuksa 1.2) Wlacza przekazywanie (ang. forwarding) pakietow przy uzyciu logicznego znacznika. Moze byc ustawione takze na podstawie interfejsu. ip_local_port_range (od Linuksa 2.2) Plik zawierajacy dwa liczby calkowite okreslajace domyslny zakres lokalnych portow przypisanych do gniazd niebedacych bezposrednio przydzielonych do portu -- tj. zakres ten jest uzywany do portow efemerycznych (portow przypisywanych dynamicznie). Port efemeryczny jest przydzielany do gniazda w nastepujacych sytuacjach: o numer portu w adresie gniazda jest okreslony jako 0 w trakcie wywolywania bind(2); o listen(2) jest wywolywane na gniezdzie strumieniowym, ktore nie bylo wczesniej przydzielone; o connect(2) byla wywolana na gniezdzie, ktore nie bylo wczesniej przydzielone; o sendto(2) jest wywolywane na gniezdzie datagramowym, ktore nie bylo wczesniej przydzielone. Przypisywanie portow efemerycznych rozpoczyna sie od pierwszego numeru w ip_local_port_range i konczy sie na drugim numerze. Jesli wyczerpie sie zakres portow efemerycznych, to odpowiednie wywolanie systemowe zwroci blad (ale prosze sprawdzic rozdzial USTERKI!). Prosze zauwazyc, ze zakres portow w ip_local_port_range nie powinien pokrywac sie z zakresem portow wykorzystywanym do maskowania (chociaz taka sytuacja jest obslugiwana). Dowolny wybor moze rowniez powodowac problemy z niektorymi zaporami sieciowymi, ktore robia pewne zalozenia odnosnie do portow uzywanych lokalnie. Pierwsza liczba powinna byc wieksza niz 1024, albo - co byloby lepsze - wieksza niz 4096, aby uniknac konfliktow z dobrze znanymi portami i zminimalizowac problemy z zaporami sieciowymi. ip_no_pmtu_disc (logiczna; domyslnie: wylaczona; od Linuksa 2.2) Jesli jest to wlaczone, to domyslnie nie bedzie wykonywane badanie MTU sciezki dla gniazd TCP. Badanie MTU moze sie nie sprawdzac w przypadku zle skonfigurowanych zapor sieciowych (odrzucajacych wszelkie pakiety ICMP) lub zle skonfigurowanych interfejsow (np. polaczenie typu point-to-point, gdzie oba konce nie zgadzaja sie na MTU). Lepiej poprawic wszelkie wadliwie skonfigurowane rutery po drodze niz calkowicie wylaczyc badanie MTU sciezki, poniewaz niewykonywanie tej operacji pociaga za soba duze straty w obrebie sieci. ip_nonlocal_bind (logiczna; domyslnie: wylaczona; od Linuksa 2.4) Jezeli ustawione, pozwala procesowi na wywolanie funkcji bind() z nielokalnym adresem IP, co moze byc calkiem przydatne, ale moze popsuc niektore aplikacje. ip6frag_time (liczba; domyslnie: 30) Czas w sekundach przetrzymywania w pamieci fragmentu IPv6. ip6frag_secret_interval (liczba; domyslnie: 600) Interwal (w sekundach) odswiezania sekretnego klucza funkcji mieszajacej (lub czasu zycia tego klucza) dla fragmentow IPv6. ipfrag_high_thresh (liczba) ipfrag_low_thresh (liczba) Jesli liczba zebranych w kolejce fragmentow IP osiagnie wartosc okreslona przez ipfrag_high_thresh, wtedy kolejka jest oprozniana do ilosci okreslonej w ipfrag_low_thresh. Zawiera ona liczbe calkowita z podana liczba bajtow. neigh/* Patrz arp(7). Kontrolki systemowe (ioctl) Do protokolu ip maja zastosowanie wszystkie kontrolki wejscia/wyjscia opisane w socket(7). Kontrolki konfigurowania ogolnych parametrow urzadzenia sa opisane w netdevice(7). BLEDY EACCES Uzytkownik probowal wykonac operacje, nie majac potrzebnych praw. Obejmuje to: wysylanie pakietu na adres rozgloszeniowy bez ustawionego znacznika SO_BROADCAST, wysylanie pakietu zakazana droga, probe modyfikacji ustawien zapory sieciowej, nie majac uprawnien administratora (ustawionego przywileju CAP_NET_ADMIN), probe przypisania uprzywilejowanego portu, nie majac uprawnien administratora (ustawionego przywileju CAP_NET_BIND_SERVICE). EADDRINUSE Probowano przypisac port do adresu bedacego juz w uzyciu. EADDRNOTAVAIL Zazadano nieistniejacego interfejsu lub zadany adres zrodlowy nie jest adresem lokalnym. EAGAIN Operacja na gniezdzie z wylaczonym blokowaniem spowodowalaby zablokowanie. EALREADY Operacja laczenia na gniezdzie nieblokujacym juz trwa. ECONNABORTED Polaczenie zostalo zamkniete podczas accept(2). EHOSTUNREACH Brak wpisu okreslajacego adres docelowy w tabeli trasowania. Blad ten moze byc wywolany przez komunikat ICMP od zdalnego routera lub dla lokalnej tabeli trasowania. EINVAL Przypisano niewlasciwy argument. W przypadku operacji wysylania moze to byc spowodowane przez wysylanie droga przypisana do czarnej dziury. EISCONN connect(2) byla wywolana na juz polaczonym gniezdzie. EMSGSIZE Datagram jest wiekszy niz wartosc MTU po drodze do celu i nie moze byc podzielony. ENOBUFS ENOMEM Niewystarczajaca ilosc dostepnej pamieci. Czesto oznacza to, ze przydzielanie pamieci jest ograniczone przez ograniczenia bufora gniazda, a nie przez ograniczenia pamieci systemowej. Jednak nie jest to pewne na 100%. ENOENT SIOCGSTAMP bylo wywolane na gniezdzie, do ktorego nie dotarl zaden pakiet. ENOPKG Podsystem jadra nie byl konfigurowany. ENOPROTOOPT i EOPNOTSUPP Przypisano niewlasciwa opcje gniazda. ENOTCONN Operacja moze byc wykonana tylko na polaczonym gniezdzie, a gniazdo nie zostalo polaczone. EPERM Uzytkownik nie ma praw do ustawiania wysokiego priorytetu, zmiany konfiguracji lub wysylania sygnalow do zadanych procesow lub grup procesow. EPIPE Polaczenie zostalo nieoczekiwanie zamkniete lub wylaczyl sie drugi koniec. ESOCKTNOSUPPORT Gniazdo nie jest skonfigurowane lub zazadano nieznanego typu gniazda. Inne bledy moga byc generowane przez protokoly wyzszych warstw; obejrzyj tcp(7), raw(7), udp(7) i socket(7). UWAGI IP_FREEBIND, IP_MSFILTER, IP_MTU, IP_MTU_DISCOVER, IP_RECVORIGDSTADDR, IP_PASSSEC, IP_PKTINFO, IP_RECVERR, IP_ROUTER_ALERT, and IP_TRANSPARENT sa typowo Linuksowe. Nalezy byc bardzo ostroznym przy stosowaniu opcji SO_BROADCAST - nie jest ona w systemie Linux uprzywilejowana, jest wiec latwo przeciazyc siec za pomoca niedbale uzytych rozgloszen. W przypadku protokolow nowych aplikacji lepiej uzywac grupy adresowej zamiast rozgloszen. Stosowanie adresow rozgloszeniowych jest niezalecane. W RFC 6762 pokazany jest przyklad protokolu (mDNS) korzystajacego z nowoczesniejszego podejscia do komunikacji z otwarta grupa stacji w sieci lokalnej. Niektore inne implementacje gniazd BSD dopuszczaja dla gniazd opcje IP_RCVDSTADDR i IP_RECVIF uzywane do pobierania adresu przeznaczenia i interfejsu odbieranych datagramow. Linux udostepnia bardziej ogolna opcje IP_PKTINFO, robiaca to samo. Niektore implementacja gniazd BSD takze udostepniaja opcje IP_RECVTTL, ale lacznie z przychodzacym pakietem jest przekazywany pomocniczy komunikat o typie IP_RECVTTL. W tym wlasnie rozni sie to od opcji IP_TTL, uzywanej w Linuksie. Uzywanie poziomu opcji gniazd SOL_IP jest nieprzenosne; gniazda oparte na BSD uzywaja poziomu IPPROTO_IP. INADDR_ANY (0.0.0.0) i INADDR_BROADCAST (255.255.255.255) sa neutralne pod katem kolejnosci bajtow. Oznacza to, ze nie wplywa na nie htonl(3). Zgodnosc Dla zgodnosci z Linuksem 2.0, wciaz jest dopuszczalna przestarzala skladnia socket(AF_INET, SOCK_PACKET, protokol), by stworzyc gniazdo typu packet(7). Nie jest to zbyt poprawne i powinno byc zastepowane przez socket(AF_PACKET, SOCK_RAW, protokol). Glownym powodem jest roznica w strukturze adresowej sockaddr_ll przechowujacej informacje dla warstwy lacza (dokladniej: warstwy kanalowej), ktore kiedys przechowywane byly w sockaddr_pkt. USTERKI Jest zbyt wiele nieokreslonych wartosci bledow. Blad uzywany do zdiagnozowania wyczerpania sie zakresu portow efemerycznych rozni sie miedzy poszczegolnymi wywolaniami systemowymi (connect(2), bind(2), listen(2), sendto(2)), ktore przypisuja porty efemeryczne. Nie sa opisane kontrolki wejscia/wyjscia do konfigurowania specyficznych dla IP opcji interfejsu i tabele ARP. Pobieranie pierwotnego adresu docelowego za pomoca wywolania recvmsg(2) z MSG_ERRQUEUE w msg_name nie dziala w niektorych jadrach Linux 2.2. ZOBACZ TAKZE recvmsg(2), sendmsg(2), byteorder(3), capabilities(7), icmp(7), ipv6(7), netdevice(7), netlink(7), raw(7), socket(7), tcp(7), udp(7), ip(8) Plik zrodel jadra Documentation/networking/ip-sysctl.txt. RFC 791 - oryginalny opis IP. RFC 1122 - wymagania stacji IPv4. RFC 1812 - wymagania rutera IPv4. TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Pawel Wilk , Robert Luberda i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.06 31 pazdziernika 2023 r. ip(7)