UDP-Lite - UDP-Lite

UDP-Lite ( Lightweight User Datagram Protocol ) to bezpołączeniowy protokół, który umożliwia dostarczenie potencjalnie uszkodzonego ładunku danych do aplikacji zamiast odrzucania go przez stację odbiorczą. Jest to przydatne, ponieważ umożliwia podejmowanie decyzji o integralności danych w warstwie aplikacji (aplikacja lub kodek ), gdzie znaczenie bitów jest zrozumiałe. UDP-Lite jest opisany w RFC  3828 .

Protokół

UDP-Lite jest oparty na protokole User Datagram Protocol (UDP), ale w przeciwieństwie do UDP, gdzie albo cały pakiet, albo żaden z pakietów jest chroniony przez sumę kontrolną, UDP-Lite pozwala na częściowe sumy kontrolne, które obejmują tylko część datagramu (dowolna liczba oktetów na początku pakietu) i dlatego dostarczy pakiety, które zostały częściowo uszkodzone. Jest przeznaczony do protokołów multimedialnych, takich jak Voice over IP (VoIP) lub strumieniowego wideo, w których odbieranie pakietu z uszkodzonym ładunkiem jest lepsze niż odbieranie żadnego pakietu. W przypadku konwencjonalnego protokołu UDP i protokołu sterowania transmisją (TCP) pojedynczy błędny bit spowoduje „złą” sumę kontrolną, co oznacza, że ​​cały pakiet musi zostać odrzucony: w ten sposób błędy bitowe są „zamieniane” na błędy całego pakietu, nawet jeśli uszkodzenie danych jest trywialne. Do obliczenia sumy kontrolnej UDP-Lite używa tego samego algorytmu sumy kontrolnej, który jest używany dla UDP (i TCP).

Nowoczesne kodeki multimedialne, takie jak G.718 i Adaptive Multi-Rate (AMR) dla dźwięku oraz H.264 i MPEG-4 dla wideo, mają wbudowane funkcje odporności w składnię i strukturę strumienia. Pozwala to kodekowi (a) wykryć błędy w strumieniu i (b) potencjalnie poprawić lub przynajmniej ukryć błąd podczas odtwarzania. Kodeki te są idealnymi partnerami dla UDP-Lite, ponieważ są zaprojektowane do pracy z uszkodzonym strumieniem danych i lepiej jest, aby te kodeki odbierały około 200 bajtów, w których kilka bitów jest uszkodzonych, niż muszą ukrywać utratę całego pakiet, który został odrzucony z powodu złej sumy kontrolnej. Warstwa aplikacji rozumie znaczenie danych, gdzie transport widzi tylko pakiety UDP. Oznacza to, że w razie potrzeby można dodać ochronę przed błędami w wyższej warstwie, na przykład za pomocą schematu korekcji błędów w przód . Aplikacja jest najlepszym miejscem, aby zdecydować, które części strumienia są najbardziej wrażliwe na błędy i odpowiednio je chronić, zamiast mieć pojedynczą sumę kontrolną „brute force”, która obejmuje wszystko w równym stopniu. Przykład tego można zobaczyć w badaniach Hammer et al. gdzie UDP-Lite jest sprzężony z kodekiem AMR, aby zapewnić lepszą jakość mowy w stratnych warunkach sieciowych.

Ponieważ większość nowoczesnych warstw łączy chroni przesyłane dane za pomocą silnej cyklicznej kontroli nadmiarowej (CRC) i odrzuca uszkodzone ramki, efektywne wykorzystanie UDP Lite wymaga, aby warstwa łącza była świadoma przesyłanych danych warstwy sieciowej. Ponieważ nie ma prądu stosy IP wdrożenie takich cross-layer interakcje, efektywne wykorzystanie UDP-Lite obecnie wymaga specjalnie zmodyfikowanych sterowników urządzeń.

Identyfikatorem protokołu IP jest 136. UDP-Lite używa tego samego zestawu numerów portów, które są przypisane przez Internet Assigned Numbers Authority (IANA) do użytku przez UDP.

Wsparcie dla UDP-Lite zostało dodane w jądrze Linux w wersji 2.6.20.

Wsparcie dla UDP-Lite zostało dodane w jądrze FreeBSD od r264212. Zestaw zmian został również przywrócony do MFC do stable/10 i stał się dostępny w FreeBSD 10.1-RELEASE.

Interfejs API gniazd BSD został rozszerzony o obsługę UDP-Lite przez trzeci parametr wywołania systemowego gniazda : Ustaw go na IPPROTO_UDPLITE, aby zażądać gniazda UDP-Lite:

int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDPLITE);

Można też łatwo ustawić, jaka część pakietu będzie objęta sumą kontrolną (od początku włącznie z nagłówkiem):

int val = 20; /* 8 octets of header + 12 octets of the application protocol. */
(void)setsockopt(fd, SOL_UDPLITE, UDPLITE_SEND_CSCOV, &val, sizeof val);

Jeśli w takiej konfiguracji zostanie wysłany pakiet mniejszy niż 12 oktetów, suma kontrolna obejmie cały pakiet.

Po stronie odbiorczej gniazdo domyślnie odrzuca wszystkie pakiety, które nie są w pełni pokryte (emulacja UDP). Aby umożliwić mniejsze pokrycie można użyć:

int val = 20; /* 8 octets of header + 12 octets of the application protocol. */
(void)setsockopt(fd, SOL_UDPLITE, UDPLITE_RECV_CSCOV, &val, sizeof val);

Pozwoli to na pakiety, w których suma kontrolna wynosi co najmniej 12 oktetów danych użytkownika. Każdy pakiet o mniejszym zasięgu zostanie po cichu odrzucony jako zły. Jeśli pakiet ma zasięg co najmniej 20 oktetów (łącznie z nagłówkiem) i jego suma kontrolna jest poprawna, zostanie dostarczony do aplikacji (całość lub część ładunku nadal może być uszkodzona, ponieważ może nie być objęty sumą kontrolną lub ponieważ suma kontrolna była poprawna przypadkowo, ale ta druga jest bardzo mało prawdopodobna). pakiet mógłby być przeznaczony dla innego programu.

Najmniejsze możliwe pokrycie to 8 oktetów. Suma kontrolna musi zawierać nagłówki. Pakiety o mniejszym zasięgu będą zawsze odrzucane niezależnie od jakichkolwiek ustawień (ignorując snifferów zainteresowanych całym ruchem) jako niezgodne ze standardem.

Wsparcie

UDP-Lite jest obsługiwany przez następujące systemy operacyjne:

  • FreeBSD od wersji 10.1-RELEASE
  • Linux , od wersji jądra 2.6.20
  • Dostępne również w systemie Windows za pośrednictwem biblioteki innej firmy, WULL

Bibliografia

Zewnętrzne linki

  • RFC  3828 — lekki protokół datagramów użytkownika (UDP-Lite)
  • RFC  5097 — MIB dla protokołu UDP-Lite
  • RFC  4019 — RObust Header Compression (ROHC): profile dla protokołu User Datagram Protocol (UDP) Lite
  • RFC  5405 — Wytyczne dotyczące używania Unicast UDP dla projektantów aplikacji