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. Patrz sockaddr_in(3type). .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 (stacji). Pole s_addr struktury in_addr(3type) zawiera adres interfejsu stacji w sieciowej kolejnosci bajtow. in_addr(3type) 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) 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 Patrz IPPROTO_IP(2const). Interfejsy /proc Patrz proc_sys_net_ipv4(5). 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 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 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. 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 IPPROTO_IP(2const), 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.rst. RFC 791 - oryginalny opis IP. RFC 1122 - wymagania stacji IPv4. RFC 1812 - wymagania rutera IPv4. TLUMACZENIE Tlumaczenie niniejszej strony podrecznika: 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.18 8 lutego 2026 r. ip(7)