2011-08-10 5 views
6

Odwiedziłem wiele stron internetowych i samouczków (i dokumentów), ale wciąż mam jedno pytanie bez odpowiedzi. Co się stanie, jeśli nadejdzie pakiet UDP, gdy nie korzystam obecnie z socket.receive (...)? Czy będzie się jakoś zbuforować, dopóki nie wywołam socket.receive (...) lub jest on całkowicie zagubiony?Czy pakiety zostały upuszczone, jeśli nie otrzymuję aktywnej informacji z DatagramSocket?

Również implementacja DatagramSocket w Androidzie jest bezpieczna w znaczeniu, co można zapisać w gnieździe podczas słuchania, czy nie?

Odpowiedz

9

Stos sieciowy jądra utrzymuje dla każdego gniazda bufor odbiorczy. Masz kontrolę nad jego wielkością z opcją SO_RCVBUF do wywołania systemowego setsockopt(2) (będziesz musiał dowiedzieć się, jaki jest dla niej API Java).

Tak więc przychodzące pakiety są umieszczane w kolejce w jądrze, o ile w buforze jest wystarczająco dużo miejsca. Aby aplikacja mogła uruchomić funkcję "Odbierz" w danym momencie, wymagane jest , a nie. Jeżeli aplikacja nie odradza się (tzn. Nie odczytuje) pakietów wystarczająco szybko, przepełnienie bufora i jądro zaczyna upuszczać pakiety. W systemie Linux (i ogólnie w systemie Unix) powinna być widoczna liczba zrzutów pakietów za pomocą polecenia netstat -s.

Pozwolę sobie również zauważyć, że ten bufor nie jest jedynym miejscem, w którym można upuścić pakiety. Sprzęt może upuszczać pakiety, jeśli w jego pamięci NIC jest za mało miejsca. Następnie sterownik urządzenia może upuszczać pakiety, jeśli jądro jest zbyt obciążone i nie przetwarza swojej ogólnej kolejki wejściowej sieci. Potrzebne są jednak poważne wskaźniki wiadomości, aby tak się stało.

TCP próbuje ominąć to wszystko, łącząc sekwencję i, jeśli to konieczne, retransmisję. UDP, będąc barebones "wyślij i zapomnij", nie robi nic dla upuszczonych pakietów dla ciebie (z wyjątkiem przypadków narożnych, gdzie pojawia się błąd z drugiego send(2) na podłączonym gnieździe UDP i tylko wtedy, gdy ICMP działa poprawnie).

Najważniejsze jest to, że pakiety są buforowane, ale do pewnego momentu, a następnie odrzucane.

+1

Kudos do ciebie! Sprawdzono dokumenty systemu Android, domyślny rozmiar bufora gniazda to 4098 bajtów. Dzięki temu koncepcja gniazda jest bardziej przejrzysta. – LordTwaroog

Powiązane problemy