У меня есть приложение читателя Java, которое читает из многоадресного сокета на Linux 64-разрядную платформу (2.6.18). Размер сокета был установлен на 2 МБ. Когда читатель не может считать достаточно быстро сокет "переполнение", т.е. пакеты отбрасываются от буфера.
То, что я хотел бы знать, - то, как ядро Linux отбрасывает пакеты из буфера сокета. Я предполагаю, что сам буфер сокета является буфером FIFO. Однако, если это полно, что происходит? Следующий пакет будет отброшен (и содержимое буфера не изменяется)? Или новый пакет заменит старый пакет в буфере? Если да, который пакет (самое старое?, самое молодое?, случайным образом выбранный пакет?)?
Спасибо за любое понимание.
Когда буфер заполнен, входящие пакеты отбрасываются. Пакеты, которые уже находятся в буфере, не изменяются и не заменяются.
Просто дополнение к ответу JS Bangs.
Это не единственное место в сетевом стеке, где пакеты могут быть отброшены. Буфер приема сокета находится на высоком уровне иерархии и зависит от пользовательского сокета. Еще одно место ближе к оборудованию (по крайней мере, в Linux) - это очередь между драйвером устройства и NET_RX
softirq (см. netif_rx ()
). Эти отбрасывания будут способствовать Столбец RX-DRP
в выводе netstat -i
.