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

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

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

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

2 ответа

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

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

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

Другие вопросы по тегам