gpt4 book ai didi

linux - QUdpSocket 读取 - 使用 tcpdump 观察到偶尔丢失数据报

转载 作者:太空宇宙 更新时间:2023-11-04 12:06:49 24 4
gpt4 key购买 nike

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

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

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

这似乎在 99.99% 的时间里都有效。但是,我偶尔会看到数据报丢失(正如我正在使用的内部计数器/模式所观察到的那样)。我的第一个想法是“好吧,它是 UDP - 它一定是在传输过程中被丢弃了。”

但是,我也在使用 tcpdump 监视客户端/接收端......而且我看到那里存在“丢失”的数据报,这些数据报被应用程序遗漏了。网络接口(interface)似乎可以很好地接收丢失的数据报,但我偶尔会将它们丢弃到应用程序层。几乎是我最不希望放弃它们的地方。

我一直在调整 Linux 中适用的缓冲区(net.core.rmem_max、net.core.rmem_default),但没有任何运气。

感谢您的帮助。

最佳答案

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

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

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

网络丢包

即使发送方在(公共(public))网络中成功传输了一个 UDP 数据包,它仍然可能在途中丢失。为什么:路由算法很复杂.. 一切都在缓冲区和优先级基础上工作.. 在该网络之上不是 100% 可靠.. 数据包数据可能由于校验和错误而被丢弃......等等。

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

关于linux - QUdpSocket 读取 - 使用 tcpdump 观察到偶尔丢失数据报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50394554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com