Niejawne pytanie brzmi: jeśli Linux blokuje wywołanie send()
, gdy bufor wysyłania gniazda jest pełny, dlaczego mają być jakieś utracone pakiety?W systemie Linux, dlaczego tracę pakiety UDP, jeśli wywołuję send() tak szybko, jak to możliwe?
Więcej szczegółów: Napisałem małe narzędzie w C, aby wysłać pakiety UDP tak szybko jak to możliwe do adresu i portu emisji pojedynczej. Wysyłam ładunek UDP 1450 bajtów za każdym razem, a pierwsze bajty są licznikiem, który zwiększa się o 1 dla każdego pakietu. Uruchamiam go na Fedorze 20 wewnątrz VirtualBox na komputerze stacjonarnym z nickiem 1Gb (= dość powolnym).
Potem napisałem małe narzędzie do odczytywania pakietów UDP z danego portu, które sprawdzają licznik pakietu względem jego własnego licznika i wypisują komunikat, jeśli są różne (to znaczy, że utracono 1 lub więcej pakietów). Uruchomiłem go na serwerze bi-xeon Fedory 20 z 1Gb ethernet nic (= super szybki). Pokazuje wiele utraconych pakietów.
Obie maszyny są w sieci lokalnej. Nie wiem dokładnie ile przeskoków między nimi, ale nie sądzę, że istnieje między nimi więcej niż 2 routery.
Czego próbowałem:
- Dodaj opóźnienia po każdej
send()
. Jeśli ustawię opóźnienie na 1ms, to żadne pakiety nie zostaną utracone. Opóźnienie 100us zacznie tracić pakiety. - Zwiększ rozmiar bufora gniazda odbiorczego do 4 MB za pomocą
setsockopt()
. To nie ma znaczenia ...
Proszę mnie oświecić!
Nie sądzę, że to naprawdę jest pytanie programistyczne. Jest jednak trochę mętny. – unwind