Как переполнение буфера в сокете Linux? - PullRequest
13 голосов
/ 08 июля 2010

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

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

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

Ответы [ 2 ]

8 голосов
/ 08 июля 2010

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

2 голосов
/ 09 июля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...