Сетевой стек ядра сохраняет приемный буфер на сокет.Вы можете контролировать его размер с помощью опции SO_RCVBUF
для системного вызова setsockopt(2)
(вам нужно выяснить, что такое Java APIдля него).
Таким образом, входящие пакеты помещаются в очередь в ядре, если в этом буфере достаточно места. не требуется, чтобы приложение выполняло функцию «получать» в данный конкретный момент.Если приложение не удаляет из очереди (то есть читает) пакеты достаточно быстро, буфер переполняется, и ядро начинает отбрасывать пакеты.В Linux (и, как правило, в Unix) вы сможете увидеть количество сбрасываний пакетов с помощью команды netstat -s
.
Позвольте мне также отметить, что этот буфер - не единственное место, где пакеты могутупасть.Аппаратное обеспечение может отбрасывать пакеты, если в оперативной памяти недостаточно места.Затем драйвер устройства может отбрасывать пакеты, если ядро слишком занято и не обрабатывает свою общую сетевую очередь ввода.Однако для того, чтобы это произошло, вам нужны серьезные скорости сообщений.
TCP пытается обойти все это с помощью полной последовательности и, при необходимости, повторной передачи.UDP, будучи «отправляй и забывай», ничего не делает для отброшенных пакетов для вас (за исключением угловых случаев, когда вы получаете ошибку от второго send(2)
на подключенном сокете UDP и только если ICMP работает правильно).
Суть в том, что пакеты буферизуются, но до точки, затем отбрасываются.