Wysyłał dużo małych pakietów przez UDP, zabiera więcej zasobów (procesor, kompresja przez zlib, itd.). Przeczytałem here, że wysłanie jednego dużego pakietu ~ 65kBYTE przez UDP prawdopodobnie zakończyłoby się niepowodzeniem, więc myślę, że wysyłanie wielu mniejszych pakietów mogłoby się udać częściej, ale potem pojawia się obciążenie obliczeniowe związane z wykorzystaniem większej mocy obliczeniowej (lub przynajmniej to, co ja zakładam). Pytanie jest w zasadzie to; jaki jest najlepszy scenariusz wysyłania maksymalnych udanych pakietów i utrzymywania obliczeń do minimum? Czy istnieje określony rozmiar, który działa przez większość czasu? Używam Erlanga dla serwera i Enet dla klienta (napisanego w języku C++). Korzystając również z kompresji Zlib i wysyłam te same pakiety do każdego klienta (nadawanie jest terminem, który myślę).Najbardziej niezawodny i efektywny rozmiar pakietu udp?
Odpowiedz
Maksymalny rozmiar UDP payload
, że przez większość czasu, nie powoduje fragmentacji IP jest
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
bajtów, ale chciałbym go naprawić do 508
. Jest to liczba bajtów na pewno nie powodują rozdrobnienie, ponieważ minimalny rozmiar MTU że gospodarz może ustawić się i IP header max size
może 60 bytes
(508 = 576 MTU - 60 IP - 8 UDP)
Przy okazji, spróbowałbym użyć 1472
bajtów, ponieważ 1500
jest wartością standardową.
Użyj 1492
zamiast do obliczeń, jeśli przechodzisz przez połączenie PPPoE
.
534 bajtów. Musi to zostać przekazane bez fragmentacji. Oczywiście nadal można go zgubić. Koszty ogólne wynikające z ponownej transmisji utraconych pakietów i samych kosztów sieci są o kilka rzędów wielkości większe niż jakiekolwiek koszty procesora.
Zastanawiam się, jaki jest bezpośredni wpływ na pakiet fragmentacji. W mojej aplikacji, kiedy przechodzę z 508 na 509, wydaje się, że "\ 0" jest dołączane na końcu drugiego pakietu. Zastanawiam się, czy jest to zależne od mojej konkretnej implementacji czy jest to prawda? –
@mavErick Końcowa wartość null pochodzi z kodu lub jest niepoprawnie przestrzegana przez twój kod. UDP tego nie robi. – EJP
Prawdopodobnie używasz niewłaściwego protokołu. UDP jest prawie zawsze złym wyborem dla danych, których zależy ci na przesyłaniu. Nakładasz na siebie sekwencjonowanie warstw, ponów i logikę integralności, a następnie masz TCP.
"spróbuj ponownie"? Ale myślałem, że to jest właśnie to, o ... ponownym wysyłaniu pakietów, aby wykonać zadanie. Robię to dla gry online, więc tcp najprawdopodobniej będzie zbyt powolne, lub to, co mówią inni. – pandoragami
"Wszyscy" często się mylą. Jeśli obawiasz się, że dane mogą nie dotrzeć, potrzebujesz TCP. –
OK, jaki byłby najskuteczniejszy rozmiar pakietu TCP, biorąc pod uwagę Nagel, itp. – pandoragami
Czy wysyłanie partii małych pakietów przez UDP może zająć więcej zasobów?
Tak, zdecydowanie! Właśnie przeprowadziłem eksperyment z aplikacją do przesyłania strumieniowego. Aplikacja przesyła 2000 ramek danych na sekundę, precyzyjnie w czasie. Ładunek danych dla każdej ramki wynosi 24 bajty. Użyłem UDP z sendto(), aby wysłać te dane do aplikacji słuchacza w innym węźle.
To, co znalazłem, było interesujące. Ten poziom aktywności wziął mój procesor wysyłający na kolana! Poszedłem od posiadania około 64% wolnego czasu procesora, do posiadania około 5%! To było katastrofalne dla mojej aplikacji, więc musiałem to naprawić. Postanowiłem eksperymentować z odmianami.
Po pierwsze, po prostu skomentowałem wywołanie sendto(), aby zobaczyć, jak wyglądał narzut zestawu pakietów. Około 1% trafienia czasu procesora. Nie jest zły. OK ... musi być wywołanie sendto()!
Potem zrobiłem szybki test fakeout ...Nazwa API sendto() nazywam tylko raz na 10 iteracji, ale uzupełniłem rekord danych do 10 razy jego poprzedniej długości, aby zasymulować efekt złożenia zbioru mniejszych rekordów w większym, wysyłanym rzadziej. Wyniki były całkiem zadowalające: 7% trafień procesora, w porównaniu z 59% poprzednio. Wydawać by się mogło, że przynajmniej w moim * systemie NIX-podobnym operacja wysyłania pakietu jest kosztowna właśnie w związku z wykonaniem połączenia.
Na wypadek, gdyby ktoś miał wątpliwości, czy test działa poprawnie, zweryfiowałem wszystkie wyniki z obserwacją Wiresharka rzeczywistych transmisji UDP, aby potwierdzić, że wszystko działało tak, jak powinno.
Wniosek: wykorzystuje znacznie mniej czasu procesora do wysyłania większych pakietów rzadziej, potem taką samą ilość danych w postaci mniejszych pakietów wysłanych częściej. Co prawda nie wiem, co się stanie, jeśli UDP zacznie łamać twój nadmiernie duży datagram UDP ... To znaczy, nie wiem, ile to obciążenie procesora dodaje. Postaram się dowiedzieć (sam bym chciał) i zaktualizować tę odpowiedź.
- 1. Rozmiar pustego pakietu UDP i TCP?
- 2. Najszybszy i najbardziej efektywny sposób tworzenia XML
- 3. Najbardziej efektywny sposób analizy Xml
- 4. Najbardziej efektywny sposób wektorów podzbiorczych
- 5. Najbardziej efektywny sposób odczytu pliku
- 6. Najbardziej efektywny sposób monitorowania kolejki
- 7. zapewnienie zamówienia pakietu w UDP
- 8. Najbardziej efektywny sposób na zgrupowanie boxplot matlab
- 9. Najbardziej efektywny sposób na wykonanie wyszukiwania fonetycznego
- 10. Najbardziej efektywny sposób konwersji BCD na binarny
- 11. Najbardziej efektywny sposób wykonania 22 różnych kompilacji
- 12. Najbardziej efektywny sposób analizowania tego języka skryptowego
- 13. Najbardziej efektywny sposób na indeksowanie zwróconej tablicy?
- 14. Najbardziej efektywny sposób tworzenia indeksu w Postgresie
- 15. Odrzucanie przychodzącego pakietu UDP bez czytania
- 16. najbardziej efektywny sposób do wysyłania obrazów w całej przetwarza
- 17. Wysyłanie pakietu UDP w języku C#
- 18. Linux UDP maksymalny rozmiar bufora odbiorczego
- 19. Najbardziej efektywny sposób na przechodzenie przez macierz Eigen
- 20. Najbardziej efektywny sposób obliczania całek/pochodnych wprowadzonych funkcji w Javie?
- 21. Najbardziej efektywny sposób zapisu danych do pliku csv z Julią
- 22. Najbardziej efektywny sposób na znalezienie sąsiadów na liście
- 23. Python - "xorowanie każdego bajtu w" bajtach "w najbardziej efektywny sposób
- 24. C# - Najbardziej efektywny sposób okresowego odczytywania ostatniej części pliku
- 25. Najbardziej efektywny sposób narysować kilka linii 3d w Matlab
- 26. Jaki jest najbardziej efektywny sposób na iterowanie listy w pythonie?
- 27. Najbardziej efektywny sposób testowania dwóch drzew binarnych dla równości
- 28. Python jaki jest najbardziej efektywny sposób oczekiwania na dane wejściowe
- 29. Jaki jest najbardziej efektywny sposób konwersji DataTable na obiekt [,]?
- 30. Wszystkie prawidłowe kombinacje punktów, w najbardziej efektywny sposób (prędkość)
Minimalna wartość MTU * IP * to 576. Nie obejmuje ona nagłówków sieci Ethernet, więc faktycznie dałoby 548. – EJP
Masz rację ... Poprawiłem obliczenia biorąc pod uwagę, że maksymalny rozmiar nagłówka IP może osiągnąć 60 bajtów –
508 jest niesamowity! –