Как переполнение буфера сокета Linux?

У меня есть приложение для чтения Java, которое читается из многоадресного сокета на 64-битной платформе Linux (2.6.18). Размер гнезда был установлен в 2 МБ. Когда читатель не может читать достаточно быстро, сокет "переполняется", то есть пакеты удаляются из буфера.

Что я хотел бы знать, так это то, как ядро ​​Linux выводит пакеты из буфера сокета. Я предполагаю, что сам сокет-буфера является буфером FIFO. Однако, если полно, что происходит? Отбросит ли следующий пакет (и содержимое буфера не изменится)? Или новый пакет заменит старый пакет в буфере? Если да, какой пакет (самый старый?, Самый младший?, Случайно выбранный пакет?)?

Спасибо за понимание.

Ответ 1

Когда буфер заполнен, входящие пакеты отбрасываются. Пакеты, которые уже находятся в буфере, не изменяются и не заменяются.

Ответ 2

Просто добавление к ответу JS Bangs.

Это не единственное место в сетевом стеке, где пакеты можно отбросить. Буфер приема Socket высок в иерархии и специфичен для пользовательского сокета. Еще одно место ближе к оборудованию (по крайней мере, в Linux) - это очередь между драйвером устройства и NET_RX softirq (см. netif_rx().) Эти капли будут способствовать столбцу RX-DRP в выводе netstat -i.