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

当通过VOIP应用程序拨打电话时,我有时会面临语音中断。 由于所有VOIP应用程序都使用UDP进行数据传输,Linux中是否有任何工具可用来衡量丢包量并衡量networking的性能。

UDP丢包的一般原因是什么?当丢包很多时我需要采取什么措施?

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

拥塞(数据包过多),缺lessQOS(随机数据包丢失,VoIP未优先处理)和/或设备故障(线路质量等)。首先,获得QOS能力的设备,为后者检查线路(硬件,开关,不pipe)是坏的。

对于互联网连接,两端都需要QOS路由器 – 除非您的提供商提供VoIP,否则他可能拥有基础设施。 也就是说,由于您的下行信道通常比上行信道大很多,本地路由器只优先下行信道通常是“足够好”的。

不过,质量不好也是一个难以解决的问题。

如果您正在遭受UDP数据包丢失,那么您几乎肯定会遭受TCP数据包丢失。 不同之处在于TCP会重传丢失的数据包,而UDP则不会。 VoIP应用程序不能重新传输,因为如果他们这样做,信息将不再是好的。

我打算假设你的VoIP电话正在通过互联网。 服务质量可能是必要的,但如果您的互联网连接不正常,它将不会有任何好处。 使用这个丢包testing来检查它。 它会告诉你丢包正在发生,即在ISP或在你的本地站点。

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

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

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的线程尽可能靠近networking设备
  • 确保udp缓冲区大小足够容纳数据(再次,您可以观察watch命令的输出以查看rx_queue列还是rx_queue列增长),然后使用sudo sysctl -w 'net/ipv4/udp_mem=xxx yyy zzzz' rx_queue sysctl -w 'net/ipv4/udp_mem=xxx yyy zzzz'增加udp缓冲区sysctl -w 'net/ipv4/udp_mem=xxx yyy zzzz' ,或者sysctl -w 'net/core/rmem_default=????' ,或者sysctl -w 'net/core/wmem_default=????' (注意, 这里定义了xxx,yyyy,zzz

在一个毫无顾忌的自我推销过程中,我创build了一个名为Pontus Vision线程pipe理器的产品 ,它不断地自动调整它。