【问题标题】:QUdpSocket reads - occasionally missing datagrams observed with tcpdumpQUdpSocket 读取 - 使用 tcpdump 观察到的数据报偶尔丢失
【发布时间】:2018-05-17 14:56:11
【问题描述】:

我有一个相对简单的服务器对多客户端设置。服务器使用多播发送数据报,(可能有很多)客户端接收它们。

Linux (RHEL) 客户端正在接收/读取这些数据报的大约 3-4 Mbps 流,使用:

    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),但没有任何运气。

感谢您的帮助。

【问题讨论】:

  • 您可能在 Qt 中发现了一个错误。尝试在bugreports.qt.io 提交错误报告

标签: linux qt networking udp


【解决方案1】:

这是正常行为!即使您看到一个 UDP 数据包到达您的计算机物理层,这并不意味着应用程序肯定会收到它......由于缓冲限制......或 CPU、内存瓶颈。

UDP 数据包在三个可能的传输槽中被丢弃:

发件人缓冲区 在每个 UDP 套接字上,都有一个 发送缓冲区 用于对数据包进行排队。系统以尽可能快的速度获取和发送数据包,但是如果您的网络接口速度较慢或获得的时隙不足以 100% 有效地处理队列,则它可能无法以尽可能快的速度发送数据包你把它们放进去!在这种情况下,一些数据包被简单地丢弃。 More reading.

网络丢失数据包

即使发送方在(公共)网络中成功传输了 UDP 数据包,它仍然可能在途中丢失。原因:路由算法很复杂 .. 方式中的所有内容也可以在缓冲区和优先级基础上运行 .. 在该网络之上不是 100% 可靠 .. 数据包数据可能由于校验和错误而被丢弃 ...等等。

接收缓冲区 UDP 数据包可能会到达接收方物理层。但是应用程序正在侦听并等待带有套接字接收缓冲区的数据包。该缓冲区的大小会导致下降吗?如果应用程序无法以队列的速率处理所有缓冲区,则缓冲区可能会溢出并且数据包会被丢弃Further reading 这有助于如何设置接收器缓冲区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 2018-08-17
    • 2020-05-02
    相关资源
    最近更新 更多