udp

UDP(7)                   Podręcznik programisty Linuksa                   UDP(7)



NAZWA
       udp - Protokół datagramów użytkownika dla IPv4

SKŁADNIA
       #include <sys/socket.h>
       #include <netinet/in.h>
       #include <netinet/udp.h>

       udp_socket = socket(AF_INET, SOCK_DGRAM, 0);

OPIS
       Jest to implementacja opisanego w RFC 768 protokołu datagramów
       użytkownika. Implementuje usługę bezpołączeniowych, niepewnych pakietów
       datagramowych. Kolejność pakietów może się zmienić przed ich dotarciem do
       celu, mogą one też zostać powielone. UDP generuje i sprawdza sumy
       kontrolne, aby wykryć błędy transmisji.

       Podczas tworzenia gniazda UDP jego adresy: lokalny i zdalny są
       nieokreślone. Datagramy można wysyłać natychmiast za pomocą sendto(2) lub
       sendmsg(2), podając jako argument prawidłowy adres docelowy. Gdy dla
       gniazda jest wywołane connect(2), ustawiany jest domyślny adres docelowy
       i od tego momentu można wysyłać datagramy za pomocą send(2) lub write(2),
       nie podając adresu docelowego. Nadal możliwe jest wysyłanie do innych
       adresów docelowych, przekazując adres do funkcji sendto(2) lub
       sendmsg(2).  Aby odbierać pakiety, gniazdo może zostać najpierw
       przypisane do adresu lokalnego za pomocą 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 zwracają tylko jeden pakiet. Gdy pakiet jest
       mniejszy niż przekazany bufor, zwracane są tylko dane o rozmiarze
       pakietu; gdy pakiet jest większy niż bufor, pakiet jest obcinany i
       ustawiany jest znacznik MSG_TRUNC. MSG_WAITALL nie jest wspierane.

       Opcje IP mogą być wysyłane lub odbierane za pomocą opcji gniazda
       opisanych w ip(7). Są one przetwarzane przez jądro tylko wtedy, gdy
       włączony jest odpowiedni parametr w /proc (ale nadal są przekazywane do
       programu użytkownika, nawet gdy kontrolka jest wyłączona). Zobacz ip(7).

       Gdy przy wysyłaniu ustawiony jest znacznik MSG_DONTROUTE, adres docelowy
       musi odnosić się do lokalnego adresu interfejsu i pakiet jest wysyłany
       jedynie do tego interfejsu.

       Domyślnie UDP pod Linuksem wykrywa MTU (Maximum Transmission Unit)
       ścieżki. Oznacza to, że jądro utrzymuje informacje o MTU określonego
       docelowego adresu IP i zwraca EMSGSIZE, jeśli pakiet UDP jest większy niż
       MTU. W takim wypadku aplikacja powinna zmniejszyć rozmiar pakietu.
       Wykrywanie MTU ścieżki można wyłączyć ustawiając opcję IP_MTU_DISCOVER
       gniazda lub używając pliku /proc/sys/net/ipv4/ip_no_pmtu_disc, szczegóły
       opisano w ip(7). Jeśli jest wyłączone, UDP podzieli wychodzące pakiety
       UDP, których rozmiar przekracza MTU, na mniejsze pakiety. Jednakże
       wyłączenie wykrywania MTU ścieżki nie jest zalecane, gdyż ma negatywny
       wpływ na wydajność i niezawodność.

   Format adresu
       UDP stosuje format adresu IPv4 sockaddr_in opisany w ip(7).

   Obsługa błędów
       Wszystkie błędy krytyczne są przekazywane do programu użytkownika jako
       wartość zwracana, nawet gdy gniazdo nie jest połączone. Dotyczy to także
       błędów asynchronicznych otrzymywanych z sieci. Można też otrzymać błąd
       dotyczący pakietu wcześniej wysłanego z danego gniazda. To zachowanie
       różni się od wielu innych implementacji gniazd BSD, które nie przekazują
       żadnych błędów, gdy gniazdo nie jest połączone. Zachowanie Linuksa ma
       oparcie w RFC 1122.

       Dla zgodności z kodem odziedziczonym w wersjach 2.0 i 2.2 jądra Linuksa
       było możliwe ustawienie opcji SOL_SOCKET SO_BSDCOMPAT, aby otrzymywać
       błędy zdalne tylko wtedy, gdy gniazdo jest połączone (z wyjątkiem EPROTO
       i EMSGSIZE). Błędy wygenerowane lokalnie są zawsze przekazywane. Obsługa
       tej opcji została usunięta w kolejnych wersjach jądra; szczegóły można
       znaleźć w socket(7).

       Gdy włączona jest opcja IP_RECVERR, wszystkie błędy są przechowywane w
       kolejce błędów gniazda i mogą być odczytywane za pomocą recvmsg(2)  z
       ustawionym znacznikiem MSG_ERRQUEUE.

   Interfejsy /proc
       Systemowe ustawienia parametrów można zmieniać, używając plików z
       katalogu /proc/sys/net/ipv4/.

       udp_mem (od Linuksa 2.6.25)
              Jest wektorem trzech liczb całkowitych zawierających numery stron,
              które mogą być kolejkowane  przez wszystkie gniazda UDP.

              min    Do chwili przekroczenia podanej liczny stron, UDP nie
                     przejmuje się zużyciem pamięci. Kiedy ilość pamięci
                     zaalokowanej przez UDP przekroczy tę liczbę, UDP zaczyna
                     zmniejszać zużycie pamięci.

              pressure
                     Wartość została wprowadzona, naśladując tcp_mem (patrz
                     tcp(7))

              max    Liczba stron, które mogą być kolejkowane przez wszystkie
                     gniazda UDP.

              Domyślne wartości powyższych trzech pozycji są wyliczane podczas
              startu systemu na podstawie ilości dostępnej pamięci.

       udp_rmem_min (liczba całkowita; wartość domyślna: PAGE_SIZE; od Linuksa
       2.6.25)
              Minimalny rozmiar, bajtach, bufora otrzymywania używanego z
              umiarem przez gniazda UDP. Każde gniazdo UDP jest w stanie użyć
              tego rozmiaru do otrzymywania danych, nawet jeśli całkowita liczba
              stron gniazd UDP przekroczy udp_mem.

       udp_wmem_min (liczba całkowita; wartość domyślna: PAGE_SIZE; od Linuksa
       2.6.25)
              Minimalny rozmiar, bajtach, bufora wysyłania używanego z umiarem
              przez gniazda UDP. Każde gniazdo UDP jest w stanie użyć tego
              rozmiaru do wysyłania danych, nawet jeśli całkowita liczba stron
              gniazd UDP przekroczy udp_mem.

   Opcje gniazda
       Aby ustawić lub pobrać opcję gniazda UDP, należy wywołać getsockopt(2) w
       celu odczytania lub setsockopt(2) w celu zapisania opcji, ustawiając
       argument poziomu opcji na IPPROTO_UDP. Jeśli nie zaznaczono inaczej,
       optval jest wskaźnikiem do int.

       Following is a list of UDP-specific socket options.  For details of some
       other socket options that are also applicable for UDP sockets, see
       socket(7).

       UDP_CORK (od Linuksa 2.5.44)
              Jeśli ta opcja zostanie włączona, to wszystkie dane na wyjściu
              tego gniazda są łączone do pojedynczego datagramu, który zostanie
              wysłany, kiedy ta opcja zostanie wyłączona. Opcja ta nie powinna
              być używana w kodzie, który w zamierzeniu ma być przenośny.

   Kontrolki systemowe (ioctl)
       Do poniższych kontrolek wejścia/wyjścia można uzyskać dostęp za pomocą
       funkcji ioctl(2).  Prawidłowa składnia to:

              int value;
              error = ioctl(udp_socket, ioctl_type, &value);

       FIONREAD (SIOCINQ)
              Pobiera jako argument wskaźnik do liczby całkowitej. Zwraca w tej
              zmiennej rozmiar następnego oczekującego datagramu lub 0, w razie
              braku oczekujących datagramów. Ostrzeżenie: FIONREAD nie daje
              możliwości rozróżnienia przypadku braku datagramów od przypadku, w
              którym następny oczekujący datagram zawiera zero bajtów danych.
              Żeby rozróżnić takie sytuacje bezpieczniej jest używać select(2),
              poll(2) lub epoll(7).

       TIOCOUTQ (SIOCOUTQ)
              Returns the number of data bytes in the local send queue.
              Supported only with Linux 2.4 and above.

       Ponadto wspierane są wszystkie kontrolki wejścia/wyjścia opisane w ip(7)
       i socket(7).

BŁĘDY
       Przy wysyłaniu lub odbieraniu za pośrednictwem gniazd UDP mogą wystąpić
       wszystkie błędy zdefiniowane dla socket(7) lub ip(7).

       ECONNREFUSED
              Z adresem docelowym nie był skojarzony żaden odbiorca. Może to być
              spowodowane przez uprzednie wysłanie pakietu za pośrednictwem
              danego gniazda.

WERSJE
       IP_RECVERR pojawiło się w Linuksie 2.2.

ZOBACZ TAKŻE
       ip(7), raw(7), socket(7), udplite(7)

       The kernel source file Documentation/networking/ip-sysctl.txt.

       RFC 768 dla protokołu datagramów użytkownika.
       RFC 1122 dla wymagań hostów.
       RFC 1191 dla opisu badania MTU ścieżki.

O STRONIE
       Angielska wersja tej strony pochodzi z wydania 5.10 projektu Linux
       man-pages. Opis projektu, informacje dotyczące zgłaszania błędów oraz
       najnowszą wersję oryginału można znaleźć pod adresem
       https://www.kernel.org/doc/man-pages/.


TŁUMACZENIE
       Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Andrzej
       Krzysztofowicz <ankry@green.mf.pg.gda.pl>, Robert Luberda
       <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>

       Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o
       warunkach licencji można uzyskać zapoznając się z GNU General Public
       License w wersji 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ lub
       nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

       Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres
       manpages-pl-list@lists.sourceforge.net ⟨⟩.



Linux                          11 kwietnia 2020 r.                        UDP(7)