udp(7) Miscellaneous Information Manual udp(7) NAZWA udp - Protokol datagramow uzytkownika dla IPv4 SKLADNIA #include #include #include udp_socket = socket(AF_INET, SOCK_DGRAM, 0); OPIS Jest to implementacja opisanego w RFC 768 protokolu datagramow uzytkownika. Implementuje usluge bezpolaczeniowych, niepewnych pakietow datagramowych. Kolejnosc pakietow moze sie zmienic przed ich dotarciem do celu, moga one tez zostac powielone. UDP generuje i sprawdza sumy kontrolne, aby wykryc bledy transmisji. Podczas tworzenia gniazda UDP jego adresy: lokalny i zdalny sa nieokreslone. Datagramy mozna wysylac natychmiast za pomoca sendto(2) lub sendmsg(2), podajac jako argument prawidlowy adres docelowy. Gdy dla gniazda jest wywolane connect(2), ustawiany jest domyslny adres docelowy i od tego momentu mozna wysylac datagramy za pomoca send(2) lub write(2), nie podajac adresu docelowego. Nadal mozliwe jest wysylanie do innych adresow docelowych, przekazujac adres do funkcji sendto(2) lub sendmsg(2). Aby odbierac pakiety, gniazdo moze zostac najpierw przypisane do adresu lokalnego za pomoca bind(2). W przeciwnym przypadku, warstwa gniazd automatycznie przypisze wolny port lokalny spoza zakresu zdefiniowanego przez /proc/sys/net/ipv4/ip_local_port_range i przypisze gniazdo do INADDR_ANY. Wszystkie operacje odbioru zwracaja tylko jeden pakiet. Gdy pakiet jest mniejszy niz przekazany bufor, zwracane sa tylko dane o rozmiarze pakietu; gdy pakiet jest wiekszy niz bufor, pakiet jest obcinany i ustawiany jest znacznik MSG_TRUNC. MSG_WAITALL nie jest wspierane. Opcje IP moga byc wysylane lub odbierane za pomoca opcji gniazda opisanych w ip(7). Sa one przetwarzane przez jadro tylko wtedy, gdy wlaczony jest odpowiedni parametr w /proc (ale nadal sa przekazywane do programu uzytkownika, nawet gdy kontrolka jest wylaczona). Zobacz ip(7). Gdy przy wysylaniu ustawiony jest znacznik MSG_DONTROUTE, adres docelowy musi odnosic sie do lokalnego adresu interfejsu i pakiet jest wysylany jedynie do tego interfejsu. Domyslnie UDP pod Linuksem wykrywa MTU (Maximum Transmission Unit) sciezki. Oznacza to, ze jadro utrzymuje informacje o MTU okreslonego docelowego adresu IP i zwraca EMSGSIZE, jesli pakiet UDP jest wiekszy niz MTU. W takim wypadku aplikacja powinna zmniejszyc rozmiar pakietu. Wykrywanie MTU sciezki mozna wylaczyc ustawiajac opcje IP_MTU_DISCOVER gniazda lub uzywajac pliku /proc/sys/net/ipv4/ip_no_pmtu_disc, szczegoly opisano w ip(7). Jesli jest wylaczone, UDP podzieli wychodzace pakiety UDP, ktorych rozmiar przekracza MTU, na mniejsze pakiety. Jednakze wylaczenie wykrywania MTU sciezki nie jest zalecane, gdyz ma negatywny wplyw na wydajnosc i niezawodnosc. Format adresu UDP stosuje format adresu IPv4 sockaddr_in opisany w ip(7). Obsluga bledow Wszystkie bledy krytyczne sa przekazywane do programu uzytkownika jako wartosc zwracana, nawet gdy gniazdo nie jest polaczone. Dotyczy to takze bledow asynchronicznych otrzymywanych z sieci. Mozna tez otrzymac blad dotyczacy pakietu wczesniej wyslanego z danego gniazda. To zachowanie rozni sie od wielu innych implementacji gniazd BSD, ktore nie przekazuja zadnych bledow, gdy gniazdo nie jest polaczone. Zachowanie Linuksa ma oparcie w RFC 1122. Dla zgodnosci z kodem odziedziczonym w wersjach 2.0 i 2.2 jadra Linuksa bylo mozliwe ustawienie opcji SOL_SOCKET SO_BSDCOMPAT, aby otrzymywac bledy zdalne tylko wtedy, gdy gniazdo jest polaczone (z wyjatkiem EPROTO i EMSGSIZE). Bledy wygenerowane lokalnie sa zawsze przekazywane. Obsluga tej opcji zostala usunieta w kolejnych wersjach jadra; szczegoly mozna znalezc w socket(7). Gdy wlaczona jest opcja IP_RECVERR, wszystkie bledy sa przechowywane w kolejce bledow gniazda i moga byc odczytywane za pomoca recvmsg(2) z ustawionym znacznikiem MSG_ERRQUEUE. Interfejsy /proc Systemowe ustawienia parametrow mozna zmieniac, uzywajac plikow z katalogu /proc/sys/net/ipv4/. udp_mem (od Linuksa 2.6.25) Jest wektorem trzech liczb calkowitych zawierajacych numery stron, ktore moga byc kolejkowane przez wszystkie gniazda UDP. min Do chwili przekroczenia podanej liczny stron, UDP nie przejmuje sie zuzyciem pamieci. Kiedy ilosc pamieci zaalokowanej przez UDP przekroczy te liczbe, UDP zaczyna zmniejszac zuzycie pamieci. pressure Wartosc zostala wprowadzona, nasladujac tcp_mem (patrz tcp(7)) max Liczba stron, ktore moga byc kolejkowane przez wszystkie gniazda UDP. Domyslne wartosci powyzszych trzech pozycji sa wyliczane podczas startu systemu na podstawie ilosci dostepnej pamieci. udp_rmem_min (liczba calkowita; wartosc domyslna: PAGE_SIZE; od Linuksa 2.6.25) Minimalny rozmiar, bajtach, bufora otrzymywania uzywanego z umiarem przez gniazda UDP. Kazde gniazdo UDP jest w stanie uzyc tego rozmiaru do otrzymywania danych, nawet jesli calkowita liczba stron gniazd UDP przekroczy udp_mem. udp_wmem_min (liczba calkowita; wartosc domyslna: PAGE_SIZE; od Linuksa 2.6.25) Minimalny rozmiar, bajtach, bufora wysylania uzywanego z umiarem przez gniazda UDP. Kazde gniazdo UDP jest w stanie uzyc tego rozmiaru do wysylania danych, nawet jesli calkowita liczba stron gniazd UDP przekroczy udp_mem. Opcje gniazda Aby ustawic lub pobrac opcje gniazda UDP, nalezy wywolac getsockopt(2) w celu odczytania lub setsockopt(2) w celu zapisania opcji, ustawiajac argument poziomu opcji na IPPROTO_UDP. Jesli nie zaznaczono inaczej, optval jest wskaznikiem do int. Ponizsza lista dotyczy opcji gniazd charakterystycznych dla UDP. W podreczniku socket(7) opisano pewne inne opcje gniazd, ktore dotycza rowniez gniazd UDP. UDP_CORK (od Linuksa 2.5.44) Jesli ta opcja zostanie wlaczona, to wszystkie dane na wyjsciu tego gniazda sa laczone do pojedynczego datagramu, ktory zostanie wyslany, kiedy ta opcja zostanie wylaczona. Opcja ta nie powinna byc uzywana w kodzie, ktory w zamierzeniu ma byc przenosny. UDP_SEGMENT (od Linuksa 4.18) Wlacza odciazanie segmentacji UDP. Odciazanie segmentacji zmniejsza koszt send(2) przez transferowanie danych wielu datagramow w pojedynczym, duzym pakiecie, za pomoca sciezki transmisji jadra, nawet gdy przekracza to MTU. Duzy pakiet jest dzielony wedlug rozmiaru segmentu na serie datagramow tak pozno, jak to mozliwe. Ten krok odciazania segmentacji jest wykonywany sprzetowo, jesli jest to obslugiwane albo programowo, w innym przypadku. Opcja ta przyjmuje wartosc w zakresie [0, USHRT_MAX], ktora ustawia rozmiar segmentu: rozmiar calego datagramu, z wylaczeniem naglowka UDP. Rozmiar segmentu nalezy wybrac w taki sposob, aby w pojedynczym wywolaniu byly wyslane co najwyzej 64 datagramy i aby datagramy po segmentacji spelnialy te same reguly MTU, ktore dotycza datagramow wysylanych bez tej opcji. Odciazanie segmentacji zalezy od odciazania sum kontrolnych, poniewaz sumy kontrolne datagramow sa obliczane po segmentacji. Opcje te mozna ustawic rowniez dla poszczegolnych wywolan sendmsg(2), przekazujac ja jako cmsg(3). Wartosc rowna zero wylacza te funkcje. Opcji tej nie nalezy uzywac w kodzie, ktory ma byc przenosny. UDP_GRO (od Linuksa 5.0) Wlacza odciazanie odbiorcze UDP. Po wlaczeniu, gniazdo moze otrzymywac dane wielu datagramow jako pojedynczy, duzy bufor, razem z cmsg(3), ktory zawiera rozmiar segmentu. Opcja ta jest odwrotnoscia odciazania segmentacji. Redukuje koszt obslugi odbioru, obslugujac dane wielu datagramow jako pojedynczy, duzy pakiet w sciezce odbiorczej jadra nawet, gdy przekracza to MTU. Opcji tej nie nalezy uzywac w kodzie, ktory ma byc przenosny. Kontrolki systemowe (ioctl) Do ponizszych kontrolek wejscia/wyjscia mozna uzyskac dostep za pomoca funkcji ioctl(2). Prawidlowa skladnia to: int value; error = ioctl(udp_socket, ioctl_type, &value); FIONREAD (SIOCINQ) Pobiera jako argument wskaznik do liczby calkowitej. Zwraca w tej zmiennej rozmiar nastepnego oczekujacego datagramu lub 0, w razie braku oczekujacych datagramow. Ostrzezenie: FIONREAD nie daje mozliwosci rozroznienia przypadku braku datagramow od przypadku, w ktorym nastepny oczekujacy datagram zawiera zero bajtow danych. Zeby rozroznic takie sytuacje bezpieczniej jest uzywac select(2), poll(2) lub epoll(7). TIOCOUTQ (SIOCOUTQ) Zwraca liczbe bajtow danych w lokalnej kolejce pakietow wychodzacych. Obslugiwane jedynie przez Linuksa 2.4 i pozniejsze wersje. Ponadto wspierane sa wszystkie kontrolki wejscia/wyjscia opisane w ip(7) i socket(7). BLEDY Przy wysylaniu lub odbieraniu za posrednictwem gniazd UDP moga wystapic wszystkie bledy zdefiniowane dla socket(7) lub ip(7). ECONNREFUSED Z adresem docelowym nie byl skojarzony zaden odbiorca. Moze to byc spowodowane przez uprzednie wyslanie pakietu za posrednictwem danego gniazda. WERSJE IP_RECVERR pojawilo sie w Linuksie 2.2. ZOBACZ TAKZE ip(7), raw(7), socket(7), udplite(7) Plik zrodel jadra Documentation/networking/ip-sysctl.rst. RFC 768 dla protokolu datagramow uzytkownika. RFC 1122 dla wymagan hostow. RFC 1191 dla opisu badania MTU sciezki. TLUMACZENIE Tlumaczenie niniejszej strony podrecznika: Andrzej Krzysztofowicz , 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.17 8 lutego 2026 r. udp(7)