Najbardziej niezawodny i wydajny rozmiar pakietów udp?

Wysyłanie małych pakietów przez UDP wymagałoby większej ilości zasobów (cpu, kompresji przez zlib, itp...). Czytałem tutaj że wysłanie jednego dużego pakietu ~65kbajtów przez UDP prawdopodobnie by się nie powiodło, więc myślę, że wysyłanie wielu mniejszych pakietów częściej by się powiodło, ale potem przychodzi obliczeniowy narzut użycia większej mocy obliczeniowej (a przynajmniej to zakładam). Pytanie jest w zasadzie takie; jaki jest najlepszy scenariusz wysyłania maksymalnie udanych pakietów i ograniczenie obliczeń do minimum? Czy istnieje określony rozmiar, który działa przez większość czasu? Używam Erlang dla serwera i Enet dla klienta (napisany w c++). Używając kompresji Zlib również i wysyłam te same pakiety do każdego klienta(broadcasting to chyba termin).

Author: Community, 2013-02-21

4 answers

Maksymalny rozmiar UDP payload, który przez większość czasu nie spowoduje fragmentacji ip, to

MTU size of the host handling the PDU (most of the case it will be 1500) -
size of the IP header (20 bytes) -
size of UDP header (8 bytes)

1500 MTU - 20 IP hdr - 8 UDP hdr  = 1472 bytes

@EJP mówił o 534 bajtach, ale ja bym to poprawił na 508. Jest to liczba bajtów, które na pewno nie spowodują fragmentacji, ponieważ minimalny rozmiar MTU jaki host może ustawić to 576 i IP header max size może być 60 bytes (508 = 576 MTU-60 IP-8 UDP)

Przy okazji spróbowałbym użyć 1472 bajtów, ponieważ 1500 jest standardem-wystarczy wartość.

Użyj 1492 zamiast 1500 do obliczeń, jeśli przechodzisz przez połączenie PPPoE.

 23
Author: Davide Berra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-22 08:22:11

czy wysyłanie wielu małych pakietów przez UDP wymaga więcej zasobów ?

Tak, na pewno! Właśnie przeprowadziłem eksperyment z aplikacją do przesyłania strumieniowego. Aplikacja wysyła 2000 klatek danych na sekundę, precyzyjnie w czasie. Ilość danych dla każdej klatki wynosi 24 bajty. Używałem UDP z sendto () Aby wysłać te dane do aplikacji listener na innym węźle.

To co znalazłem było interesujące. Ten poziom aktywności powalił mój procesor na kolana! Przeszedłem od posiadania około 64% wolnego procesora czas, aby mieć około 5%! To było katastrofalne dla mojej aplikacji, więc musiałem to naprawić. Postanowiłem eksperymentować z wariacjami.

Po pierwsze, po prostu skomentowałem wywołanie SendTo () , aby zobaczyć, jak wyglądał zestaw pakietów. Około 1% hit na czas procesora. Nieźle. OK... musi być SendTo () call!

Potem zrobiłem szybki test fakeout... Wywołałem API sendto () tylko raz na 10 iteracji, ale wypełniłem rekord danych do 10 razy jego poprzednia długość, aby symulować efekt złożenia zbioru mniejszych rekordów w większy, wysyłany rzadziej. Wyniki były dość zadowalające: 7% CPU hit, w porównaniu do 59% wcześniej. Wydawałoby się, że przynajmniej w moim systemie *Nix-like, operacja wysłania pakietu jest kosztowna tylko w napowietrznych wykonywania połączenia.

Na wszelki wypadek, gdyby ktoś miał wątpliwości, czy test działał poprawnie, zweryfikowałem wszystkie wyniki obserwacją Wireshark rzeczywistego UDP transmisje, aby potwierdzić, że wszystko działa tak, jak powinno.

Wniosek: zużywa znacznie mniej czasu procesora, aby wysyłać większe pakiety rzadziej, a następnie taką samą ilość danych w postaci mniejszych pakietów wysyłanych częściej. przyznaję, że Nie wiem, co się stanie, jeśli UDP zacznie fragmentować Twój zbyt duży datagram UDP... To znaczy, Nie wiem, ile CPU napowietrza to dodaje. Postaram się dowiedzieć (sam chciałbym się dowiedzieć) i zaktualizować tę odpowiedź.

 8
Author: JoGusto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-21 10:47:19

534 bajtów Musi być ona przekazywana bez fragmentacji. Oczywiście można go całkowicie stracić. Koszty ogólne wynikające z retransmisji utraconych pakietów i same koszty ogólne sieci są o kilka rzędów wielkości bardziej znaczące niż jakikolwiek koszt procesora.

 4
Author: user207421,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-21 01:32:58

Prawdopodobnie używasz niewłaściwego protokołu. UDP jest prawie zawsze złym wyborem dla danych, które chcesz transmitować. Kończysz układając sekwencjonowanie, ponawianie i logikę integralności na szczycie, a potem masz TCP.

 -11
Author: Ross Patterson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-21 12:09:01