oracular (7) udp.7.gz

Provided by: manpages-pl_4.23.1-1_all bug

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.

       Poniższa lista dotyczy opcji gniazd charakterystycznych dla UDP. W podręczniku  socket(7)  opisano  pewne
       inne opcje gniazd, które dotyczą również gniazd UDP.

       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.

       UDP_SEGMENT (od Linuksa 4.18)
              Włącza   odciążanie   segmentacji  UDP.  Odciążanie  segmentacji  zmniejsza  koszt  send(2)  przez
              transferowanie danych wielu datagramów w pojedynczym, dużym pakiecie, za pomocą ścieżki transmisji
              jądra,  nawet  gdy  przekracza to MTU. Duży pakiet jest dzielony według rozmiaru segmentu na serię
              datagramów tak późno, jak to możliwe. Ten krok odciążania segmentacji jest  wykonywany  sprzętowo,
              jeśli  jest  to  obsługiwane  albo  programowo,  w  innym  przypadku. Opcja ta przyjmuje wartość w
              zakresie [0, USHRT_MAX], która ustawia rozmiar segmentu: rozmiar całego datagramu,  z  wyłączeniem
              nagłówka  UDP.  Rozmiar  segmentu  należy  wybrać  w taki sposób, aby w pojedynczym wywołaniu były
              wysłane co najwyżej 64 datagramy i aby datagramy po segmentacji  spełniały  te  same  reguły  MTU,
              które dotyczą datagramów wysyłanych bez tej opcji. Odciążanie segmentacji zależy od odciążania sum
              kontrolnych, ponieważ sumy kontrolne datagramów  są  obliczane  po  segmentacji.  Opcję  tę  można
              ustawić  również dla poszczególnych wywołań sendmsg(2), przekazując ją jako cmsg(3). Wartość równa
              zero wyłącza tę funkcję. Opcji tej nie należy używać w kodzie, który ma być przenośny.

       UDP_GRO (od Linuksa 5.0)
              Włącza odciążanie odbiorcze UDP. Po włączeniu, gniazdo może otrzymywać dane wielu datagramów  jako
              pojedynczy,  duży  bufor,  razem  z  cmsg(3),  który  zawiera  rozmiar  segmentu.  Opcja  ta  jest
              odwrotnością odciążania  segmentacji.  Redukuje  koszt  obsługi  odbioru,  obsługując  dane  wielu
              datagramów  jako  pojedynczy, duży pakiet w ścieżce odbiorczej jądra nawet, gdy przekracza to MTU.
              Opcji tej nie należy używać w kodzie, który 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)
              Zwraca  liczbę  bajtów danych w lokalnej kolejce pakietów wychodzących.  Obsługiwane jedynie przez
              Linuksa 2.4 i późniejsze wersje.

       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)

       Plik źródeł jądra 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.

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  listy dyskusyjnej ⟨manpages-pl-
       list@lists.sourceforge.net⟩.