Пакеты отбрасываются, если я не получаю активно от DatagramSocket? - PullRequest
6 голосов
/ 10 августа 2011

Я посетил очень много веб-сайтов и учебных пособий (и документов), но у меня все еще есть один вопрос без ответа. Что произойдет, если UDP-пакет прибудет, когда я в данный момент не запускаю socket.receive (...)? Будет ли он каким-либо образом буферизоваться до тех пор, пока я не вызову socket.receive (...), или он полностью потерян?

Кроме того, реализация Android DatagramSocket является поточно-ориентированной в том смысле, что вы можете записывать в сокет при прослушивании или нет?

1 Ответ

9 голосов
/ 10 августа 2011

Сетевой стек ядра сохраняет приемный буфер на сокет.Вы можете контролировать его размер с помощью опции SO_RCVBUF для системного вызова setsockopt(2) (вам нужно выяснить, что такое Java APIдля него).

Таким образом, входящие пакеты помещаются в очередь в ядре, если в этом буфере достаточно места. не требуется, чтобы приложение выполняло функцию «получать» в данный конкретный момент.Если приложение не удаляет из очереди (то есть читает) пакеты достаточно быстро, буфер переполняется, и ядро ​​начинает отбрасывать пакеты.В Linux (и, как правило, в Unix) вы сможете увидеть количество сбрасываний пакетов с помощью команды netstat -s.

Позвольте мне также отметить, что этот буфер - не единственное место, где пакеты могутупасть.Аппаратное обеспечение может отбрасывать пакеты, если в оперативной памяти недостаточно места.Затем драйвер устройства может отбрасывать пакеты, если ядро ​​слишком занято и не обрабатывает свою общую сетевую очередь ввода.Однако для того, чтобы это произошло, вам нужны серьезные скорости сообщений.

TCP пытается обойти все это с помощью полной последовательности и, при необходимости, повторной передачи.UDP, будучи «отправляй и забывай», ничего не делает для отброшенных пакетов для вас (за исключением угловых случаев, когда вы получаете ошибку от второго send(2) на подключенном сокете UDP и только если ICMP работает правильно).

Суть в том, что пакеты буферизуются, но до точки, затем отбрасываются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...