在一个线程中定期发送许多 UDP 数据报有时会导致微包突发

Posted

技术标签:

【中文标题】在一个线程中定期发送许多 UDP 数据报有时会导致微包突发【英文标题】:Sending regularly many UDP-Datagrams in a thread sometimes results in micro packetbursts 【发布时间】:2018-05-23 21:36:54 【问题描述】:

我们正在尝试通过 Wifi 将 android 7.0 中的 UDP 数据报发送到服务器。 数据报大小为 23 字节,频率约为 15 毫秒。

我们有一个队列,我们​​将 ByteArrays 放入其中。另一个发送线程从线程安全队列中拉出这些数组,并通过数据报套接字将它们以数据报的形式发送到服务器。每 10-18 毫秒调用一次 socket.send() 方法。

服务器端的 Wireshark 以大约 15 毫秒的定期稳定间隔接收大部分数据包,但有时(大多数每 150-300 个数据包)会有 1-3 个发送周期的延迟,然后延迟的数据包到达停顿 30-60 毫秒后的“爆发”。

如果在运行时我们尝试通过网络密集型任务(当我们启动 WiFi-Analyser-App 时)对 Android 手机施加压力,延迟会变得更长并且出现的频率明显更高。

增加 Sender-Thread 的 ThreadPriority 似乎对问题没有任何影响。

如果有人可以帮助我提供一些关于如何更好地控制网络接口发送过程以减少突发并获得更稳定的定期发送间隔的提示,我和我的伙伴将非常感谢。

【问题讨论】:

首先你需要确定它是来自发送端还是接收端。 每 15 毫秒写入字节不仅仅是密集的。为什么不直接发送呢? @EJP 我认为它起源于 android 端,因为我们正在一个纯粹的私有 wifi 网络中进行测试,其中服务器端计算机只是运行一个脚本来接收数据包,没有别的,他的wireshark-capture 应该非常可靠地显示正确的时间戳(正如我强烈假设的那样 - 或者我的假设可能有误?)。 @Mạnh Quyết Nguyễn - 请原谅,但我需要更多解释 - 以哪种方式强烈?你是什​​么意思直接发送它?我以为我这样做的方式已经是直接发送了 【参考方案1】:

好的。我们发现了。如果我没记错的话,问题是由后台的一些标准服务引起的,比如蓝牙(也许它也是 Wifi 或 GPS,很久以前才能正确记住)。该服务每隔几秒钟就会寻找信号及其强度,这样做会破坏我们的数据包管道。

【讨论】:

以上是关于在一个线程中定期发送许多 UDP 数据报有时会导致微包突发的主要内容,如果未能解决你的问题,请参考以下文章

什么会导致无法为 UDP 数据报计算 IP 标头校验和?

TCP/UDP区别(不定期增加内容)

通过 UDP 发送 RC4 加密数据会导致解密明文发生变化

TCP 协议如何保证可靠传输

本地主机上高 UDP 数据包丢失的原因?

TCP是如何保证可靠传输的