如何测量和最小化 UDP 数据包丢失

如何测量和最小化 UDP 数据包丢失

我有时通过 VOIP 应用程序拨打电话时会遇到语音中断的情况。由于所有 VOIP 应用程序都使用 UDP 进行数据传输,Linux 中是否有任何工具可以测量数据包丢失量并测量网络性能。

UDP 数据包丢失的一般原因是什么?当出现大量数据包丢失时我需要采取什么措施?

答案1

UDP 丢失的主要原因之一是缓冲区溢出,尤其是在 LAN 中。这些可能发生在交换机中,也可能发生在发送或接收服务器中。在 Linux 上,您可以使用一种机制来验证数据包丢失,即运行以下命令:

watch -n 1 -d 'cat /proc/net/udp'

这将显示类似以下内容的输出,其中最后一列是丢弃的数据包数:

Every 1.0s: cat /proc/net/udp                                                                                                                                 Mon Sep 28 15:01:00 2015

  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode ref pointer drops
11362: 00000000:3443 00000000:0000 07 00000000:00000000 00:00000000 00000000     0        0 18224 2 ffff880808040000 0
19543: 00000000:D438 00000000:0000 07 00000000:00000000 00:00000000 00000000     0        0 3809742 2 ffff8808060c8400 0
30819: 00000000:0044 00000000:0000 07 00000000:00000000 00:00000000 00000000     0        0 12644 2 ffff88100f2b0400 0

然后,您可以尝试多种不同的技巧来解决这些问题(再次使用 Linux 作为示例):

  • 确保使用数据的应用有足够的 CPU 可用,
  • 确保执行 I/O 的线程尽可能靠近网络设备
  • 确保 udp 缓冲区大小足够大,可以容纳数据(同样,您可以观察 watch 命令的输出,看看tx_queuerx_queue列是否增长),然后使用 sudo sysctl -w 'net/ipv4/udp_mem=xxx yyy zzzz'、 或sysctl -w 'net/core/rmem_default=????'或增加 udp 缓冲区sysctl -w 'net/core/wmem_default=????'(注意, xxx、yyyy、zzz 已定义这里

为了推销自己,我创建了一款产品,名为Pontus Vision 线程管理器它会不断自动调整。

答案2

UDP 数据包丢失的一般原因是什么

拥塞(太多数据包)且缺乏 QOS(随机数据包丢失、VoIP 未优先处理)和/或设备故障(线路质量等)。对于前者,请获取支持 QOS 的设备,对于后者,请检查线路(硬件、交换机等)是否有问题。

对于互联网连接,您需要两端都有 QOS 路由器 - 而您不会有(除非您的提供商提供 VoIP,那么他可能已经拥有了基础设施)。也就是说,由于您的下行信道通常比上行信道大得多,因此仅优先考虑下行信道的本地路由器通常“足够好”。

然而,线路质量差是一个很难处理的问题。

答案3

如果您遭遇 UDP 数据包丢失,那么您几乎肯定也会遭遇 TCP 数据包丢失。区别在于 TCP 会重新传输丢失的数据包,而 UDP 则不会。VoIP 应用程序无法重新传输,因为如果它们这样做,信息将不再有用。

我假设您的 VoIP 通话是通过互联网进行的。QoS 可能是必要的,但如果您的互联网连接不正常,它就没有任何用处。使用此丢包测试检查一下。它会告诉你数据包丢失发生的位置,即在 ISP 还是在本地站点。

如果在您的本地站点发现问题,那么是时候检查您的电缆或 DSL 调制解调器是否有良好的信噪比、输出功率和衰减 (DSL)。

相关内容