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

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

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

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

13
задан JSBձոգչ 8 July 2010 в 16:43
поделиться

2 ответа

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

8
ответ дан 2 December 2019 в 01:20
поделиться

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

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

2
ответ дан 2 December 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: