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