QUdpSocket читает - иногда пропускаются датаграммы, наблюдаемые с помощью tcpdump - PullRequest
0 голосов
/ 17 мая 2018

У меня относительно простая настройка сервера для многих клиентов.Сервер отправляет дейтаграммы с использованием многоадресной рассылки, и их получают (потенциально многие) клиенты.

Клиенты Linux (RHEL) получают / считывают поток этих дейтаграмм со скоростью примерно 3-4 Мбит / с, используя:

    QByteArray datagram;
    while (udpSocketReceiver->hasPendingDatagrams())
    {
        datagram.resize(udpSocketReceiver->pendingDatagramSize());
        udpSocketReceiver->readDatagram(datagram.data(), datagram.size());
    }

Кажется, это работает, вероятно, 99,99% времени.Тем не менее, я иногда вижу, что датаграмма пропускается (как это видно по используемым мной внутренним счетчикам / схемам).Моей первой мыслью было: «Ну, это UDP - он просто должен быть сброшен при передаче».

Однако я также отслеживаю сторону клиента / получателя с помощью tcpdump ... и я также видит присутствующие там «отсутствующие» дейтаграммы, которые пропущены приложением.Казалось бы, пропущенные дейтаграммы очень хорошо принимаются сетевым интерфейсом, но я иногда отбрасываю их, приходя на уровень приложений.Примерно в последнем месте, где я бы хотел их отбросить.

Я играл с настройкой соответствующих буферов в Linux (net.core.rmem_max, net.core.rmem_default), но безуспешно.

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 17 мая 2018

Это нормальное поведение!даже если вы видите, что на ваш компьютер приходит пакет UDP физический уровень , это не означает, что приложение обязательно его получит .. из-за ограничений буферизации ... или из-за узкого места в памяти ЦП.

UDP-пакеты отбрасываются в трех возможных слотах передачи:

Буфер отправителя На каждом сокете UDP имеется буфер отправки , который ставит пакеты в очередь.Система выбирает и отправляет пакеты как можно быстрее, но если у вас медленный сетевой интерфейс или не хватает временного интервала для 100% эффективной обработки очереди, возможно, он не сможет отправлять пакеты так быстро, как это возможно.Вы положили их в!в этом случае некоторые пакеты просто отбрасываются. Больше чтения .

Потерянные пакеты сети

Даже если отправитель успешно передает пакет UDP в (общедоступной) сети, он все равно может потерятьсяпо пути.Почему: алгоритмы маршрутизации являются сложными ... все в пути работает также на основе буфера и на основе приоритетов ... поверх этой сети нет 100% надежности ... данные пакета могут быть отброшены из-за ошибок контрольной суммы ... и т. Д.

Буфер приемника UDP-пакет может поступить на физический уровень приемника.Но приложение слушает и ждет пакет с буфером приема сокета.размер этого буфера может вызвать падение?если приложение не может обработать все буферы со скоростью, с которой они поставлены в очередь, буфер может переполниться, и пакеты будут отброшены Дальнейшее чтение , это может помочь, как установить буфер приемника.

...