组播数据包丢失故障排除指南

article/2025/4/28 21:12:08

介绍

本文档的目的是帮助找出丢失组播数据包的原因并进行一些调整以尽量减少此类丢失。

组播数据包丢失的原因有多种。

UDP 协议本身牺牲了性能的可靠性,并且不保证数据报的传递。 因此,数据包在网络传输过程中可能会丢失。

即使数据包到达网络节点,也并不总是意味着应用程序接收到它,因为在处理接收到的数据包时会经过几个级别,在每个级别上都可能会丢失。

网络数据包的典型路径如图 1 所示。

在这里插入图片描述
图1

首先,网络适配器(NIC)接收并处理网络数据包。 NIC 有自己的硬件环形缓冲区。当网络数据流高于 NIC 可以处理时,最新的数据将覆盖最旧的数据。这种可能性取决于 NIC 的特性,例如计算性能和硬件缓冲区大小。

接下来,经过网卡处理后,进入操作系统缓冲区,也可能溢出。来自所有 NIC 的所有应用程序和辅助数据包的所有数据包都通过此缓冲区。

因此,在操作系统层面丢失的可能性取决于:

  • 操作系统缓冲区的大小
  • 系统性能
  • 系统负载
  • 网络相关的系统负载

即使应用程序不使用 NIC,它也取决于 NIC 的数量:它会通过 ARP 或 ICMPv6 等辅助协议产生一些额外的负载。

然后,它进入应用程序从中获取数据包的套接字(socket)缓冲区。如果应用程序无法按时从socket中取出数据包,缓冲区将溢出,数据包将丢失。

因此,在应用层面丢失的可能性取决于:

  • socket 缓冲区大小
  • 应用程序获取数据的速度

诊断

网络适配器缓冲区溢出诊断

Linux

在 Linux 上,可以使用 netstat -i –udp <NIC> 命令检测网络适配器缓冲区溢出,其中 RX-DRP 列显示适配器丢弃的数据包数。

例如:

netstat -i –udp eth0
Iface	MTU		Met	RX-OK	RX-ERR	RX-DRP	RX-OVR	TX-OK	TX-ERR	TX-DRP	TX-OVR	Flg
eth0	1500	0	109208	0		3		0		82809	0		0		0		BMRU

此输出标识适配器丢弃了三个数据包。

为了缓解网络适配器缓冲区溢出,应增加网络适配器缓冲区的大小。

Windows

在 Windows 上,可以使用 netstat -e 命令检测网络适配器缓冲区溢出。

例如:

netstat -eInterface StatisticsReceived	Sent
Bytes				2126595129	3580282555
Unicast packets		100602496	384905740
Non-unicast packets	3975342		1522900
Discards			2			0
Errors				3			0
Unknown protocols	0

Discards 显示 NIC 拒绝的数据包数量(可能是因为它们已损坏)。

Errors 显示在发送或接收过程中发生的错误数(可能是因为 NIC 出现问题)。

操作系统内核网络缓冲区溢出诊断

Linux

在 Linux 上 watch -d "cat /proc/net/snmp | grep -w Udp" 命令,InErrors 列显示操作系统 UDP 队列溢出时丢弃的 UDP 数据包数。

操作系统缓冲区溢出可以通过以下方式缓解:

  • 增加操作系统内核网络缓冲区的大小。
  • 通过使用用户空间网络堆栈/内核绕过(kernel-bypass)中间件(例如 Solarflare 的 OpenOnload)从数据包路径中排除操作系统内核网络缓冲区。
  • 关闭所有未使用的与网络相关的应用程序和服务,以最大限度地减少系统负载。
  • 在您的系统上只留下合理数量的工作网卡。

例如:

Udp:	InDatagrams	NoPorts	InErrors	OutDatagrams	RcvbufErrors	SndbufErrors
Udp:	1273				25			9				6722				0						0

此输出标识操作系统丢弃了九个数据包。

您还可以使用 watch -d "cat /proc/net/pid/snmp | grep -w Udp" 命令在每个进程的基础上看到这一点。

Windows

要检查 Windows 上的 UDP 统计信息,请使用命令:netstat -s -p udp

IPv4 的 UDP 统计信息

Datagrams Received	=	85463
No Ports			=	123
Receive Errors		=	0
Datagrams Sent		=	75022

Receive Errors指示与操作系统相关的接收错误的数量。

应用程序级套接字缓冲区溢出诊断

Linux

在 Linux 上 watch -d "cat /proc/net/snmp | grep -w Udp" 命令,RcvbufErrors 列显示应用程序套接字缓冲区溢出时丢弃的 UDP 数据包数。

例如:

Udp:	InDatagrams	NoPorts	InErrors	OutDatagrams	RcvbufErrors	SndbufErrors
Udp:	8273		25		0			8720			15				0

此输出标识应用程序丢弃了 15 个数据包。

您还可以使用 watch -d "cat /proc/net/pid/snmp | grep -w Udp" 命令在每个进程的基础上看到这一点。

应用程序级套接字缓冲区溢出可以通过以下方式缓解:

  • 应用程序更快地为其接收套接字缓冲区提供服务(例如,通过使用专用线程来接收 UDP 数据包和/或增加其优先级)。
  • 应用程序增加其接收套接字缓冲区的大小。 有时系统管理员还必须增加全局套接字缓冲区限制,否则应用程序级别的增加将不起作用。
  • 将应用程序(或其接收线程)分配给专用 CPU 内核。
  • 提高应用程序的优先级(例如使用 niceionice Linux 命令)。
  • 关闭所有未使用的与网络相关的应用程序和服务,以最大限度地减少系统负载。

调整

网络适配器缓冲区调整

Linux

要查看适配器的缓冲区设置,请运行 ethtool -g <NIC> 命令。

例如:

ethtool –g eth1:Ring parameters for eth1:
Pre-set maximums:
RX:	4096
RX Mini:	0
RX Jumbo:	0
TX:	4096
Current hardware settings:
RX:	4096
RX Mini:	0
RX Jumbo:	0
TX:	1024

输出中有两个部分。 第一部分是预设最大值(Pre-set maximums),表示可以为每个可用参数设置的最大值。 第二部分显示每个参数的当前值。

要设置 RX 环形缓冲区(ring buffer)大小,请运行 ethtool -G <NIC> rx NEW-BUFFER-SIZE 命令。

更改将立即生效,无需重新启动系统甚至网络堆栈。

这些更改是针对网卡本身而不是针对操作系统进行的。 这不会更改内核网络堆栈参数,但会更改固件中的 NIC 参数。

较大的环形缓冲区大小可以吸收较大的数据包突发而不会丢失,但可能会因为工作集大小增加而降低效率。

现代网卡的典型环形缓冲区大小值约为 4096,如果您的网卡较少,请考虑硬件升级。

操作系统内核网络缓冲区调整

Linux

运行 sysctl -A | grep net | grep 'mem\|backlog' | grep 'udp_mem\|rmem_max\|max_backlog' 命令检查系统级缓冲区的当前设置。

例如:

net.core.rmem_max			=	131071
net.core.netdev_max_backlog	=	1000
net.ipv4.udp_mem			=	1501632	2002176	3003264

将最大套接字接收缓冲区大小增加到 64 MB:
sysctl -w net.core.rmem_max=67108864

增加可分配的最大总缓冲区空间。这是以页面为单位(4096 字节)测量的:
sysctl -w net.ipv4.udp_mem="262144 327680 393216"

请注意,net.ipv4.udp_mem 在页面中工作,因此要计算以字节为单位的大小,请将值乘以 PAGE_SIZE,其中 PAGE_SIZE = 4096 (4K)。那么最大 udp_mem 大小(以字节为单位)为 385152 * 4096 = 1,577,582,592。

增加传入数据包的队列大小:
sysctl -w net.core.netdev_max_backlog=2000

通过运行 sysctl -A | grep net | grep 'mem\|backlog' | grep 'udp_mem\|rmem_max\|max_backlog' 命令。

要使这些更改永久编辑或创建 /etc/sysctl.conf 文件并在那里添加更改。

应用程序级套接字缓冲区调整

Linux, Windows

为了减少数据包丢失,应用程序必须能够在最新的数据覆盖之前从套接字缓冲区获取数据。因此,应该增加套接字级别的缓冲区。在 OnixS 市场数据处理程序中,这可以通过使用 HandlerSettings::udpSocketBufferSize 配置设置来完成。推荐值为 8388608 (8 MiB)。

附加工具

如果你在应用程序中遇到多播数据包丢失,则可能值得运行一些独立工具来了解有关该问题的更多信息。

tcpdump

tcpdump 是一个强大的命令行数据包分析器,它允许绕过操作系统网络堆栈直接从 NIC 捕获所有多播数据。

例如:

tcpdump -n multicast -i <NIC>

Tcpdump 还支持多组不同的过滤策略。这允许捕获单个或多个多播组的网络数据包,并将其与应用程序接收的数据进行比较。如果应用程序显示一些数据包间隙,但 tcpdump 接收到所有数据,这意味着数据在网络堆栈或应用程序的某个地方丢失。否则,很可能是网络相关或网卡相关的原因。

组播测试
此工具可从 OnixS 支持团队 (support@onixs.biz) 获得。与 tcpdump 不同,它从应用程序级套接字读取数据。使用此工具允许以与应用程序相同的方式接收数据,这有助于检测应用程序内部的损失。

附录 A.“Solarflare 的应用程序加速/OpenOnload”

在这里插入图片描述

图 2

使用 Solarflare 的应用程序加速/OpenOnload 中间件允许数据包绕过系统内核。 这会带来一些性能优势,因为应用程序不执行与网络相关的内核调用。 如图 2 所示。

原文


http://chatgpt.dhexx.cn/article/F7BjP572.shtml

相关文章

vlc发送组播数据

vlc既是一个播放器&#xff0c;又可以成为一个流媒体服务器。最近需要做udp组播播放相关的东西&#xff0c;需要先在本地搭建一个udp组播服务器&#xff0c;因为机器上本来就装有vlc&#xff0c;所以就用它了。 第一步&#xff0c;设置一个视频源&#xff0c;点击媒体->流&…

组播源不一定属于组播组,它向组播组发送数据,自己不一定是接收者。可以同时有多个...

组播方式传输信息 综上所述&#xff0c;单播方式适合用户稀少的网络&#xff0c;而广播方式适合用户稠密的网络&#xff0c;当网络中需要某信息的用户量不确定时&#xff0c;单播和广播方式效率很低。 IP组播技术的出现及时解决了这个问题。当网络中的某些用户需要特定信息时&a…

组播的网络结构是怎样的?如果没有组成员,组播源会发送数据吗?

一、组播的网络结构是怎样的&#xff1f; 首先&#xff0c;组播传输的特点是单点发送&#xff0c;多点接收。那么我们的组播网络的成员角色是有些&#xff0c;各自有什么分工和作用呢&#xff1f;我们简单参考下图解释&#xff1a; 组播组&#xff1a;用IP组播地址进行标识的一…

委托中的单播以及多播

目录 1.委托的多播 2.编写程序&#xff0c;实现委托的多播。 代码 如下&#xff1a; 单播&#xff1a; 多播&#xff1a; 1.委托的多播 委托对象可使用 “” 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委 托可被合并。 “-” 运算符可用于从合并…

单播+组播业务

配置单播业务 组网图 业务规划 业务虚端口1023单播4001&#xff08;vlan&#xff09;组播3888gpon0/12/9 2 业务配置 配置DBA模板 MA5800(config)#dba-profile add profile-id 103 type3 assure 102400 max 1024000 配置线路模板 MA5800(config)#ont-lineprofile gpon prof…

4.34、组播(多播)

4.34、多播 1.组播(多播)的介绍①组播地址②如何设置组播&#xff08;组播的使用&#xff09; 2.代码编写①服务端②客户端 1.组播(多播)的介绍 单播地址标识单个 IP 接口&#xff0c;广播地址标识某个子网的所有 IP 接口&#xff0c;多播地址标识一组 IP 接口。单播和广播是寻…

组播收发数据

1.流程图总结: 2. 代码: //运行起来一个Sender.exe,和多个Receiver.exe,可以看到组播的效果.//Sender.cpp也可称为服务端 #include <WINSOCK.H> #include <stdio.h> #define HELLO_PORT 7905 #define HELLO_GROUP "228.4.5.6" #pragma comment…

路由-单播、广播、组播

根据目标地址判断 类型 备注 单播 Unicast 发送给单个设备&#xff08;明确目标地址&#xff09; 广播 Broadcast 发送给所属广播域内的所有设备&#xff08;目标地址不明确&#xff09; MAC地址全F&#xff0c;IP地址全1 组播 Multicast 发送给一组目标 MA…

Alitum Designer 出现警告:[Warning] xxx.SchDoc Compiler Net xxx has no driving source

问题描述&#xff1a;Alitum Designer 在进行编译检查时&#xff0c;出现警告&#xff1a;Class Document Source Message Time Date No. [Warning] xxx.SchDoc Compiler Net xxx has no driving source (Pin J1-28,Pin U23-15,Pin U24-3) 20:01:18 2020/11/14 13。 问题分析&…

AD14.3绘制PCB教程

文档下载链接&#xff1a; 点此下载文档&#xff1a;AD14绘制PCB教程_V2.3_20200319.doc 或打开此链接下载&#xff1a; https://download.csdn.net/download/Ace_Shiyuan/12256474或通过如下方法逐步查找&#xff1a; 个人主页 -> 资源 -> AD14绘制PCB教程_V2.3_202…

学习AD常见错误(2)

1、在一个工程里新建多个原理图&#xff0c;会报元器件命名重复的问题 这种时候就要修改该元件的命名&#xff0c;该错误的报错就会消失。 2、问题描述&#xff1a;Alitum Designer 在进行编译检查时&#xff0c;出现警告&#xff1a;Class Document Source Message Time Date…

使用Altium Designer绘制STM32最小系统板及SD卡原理图

目录 一、前言二、AD工程的创建1、创建一个属于我们自己的工程2、元器件的封装 三、原理图绘制1、模块的绘制2、排版与分区3、SD模块的绘制 效果展示总结参考资料 一、前言 在学习了这么久的嵌入式&#xff0c;我们似乎还没有仔细了解过真正的嵌入式系统的原理图&#xff0c;咱…

如何将立创 EDA 的封装导入到 AD/PADS 软件中

立创 EDA,深受个人玩家和学生的喜爱,有现成的封装,再配合立创商城,很便捷。 在公司内部,用的很少,受限于性能、迭代维护等原因。 本文介绍如何将立创 EDA 里面的封装导入到 AD/PADS 中,为我们所用,立创封装一部分来自官方,另一部分来自个人,所以不能过分依赖,保不…

AD学习笔记(一)基础认识

文章目录 AD学习笔记第一讲 AD基础认识一、两库两图&#xff08;分别对应下图&#xff09;1、PCB图&#xff08;pcbdoc&#xff09;2、原理图&#xff08;schdoc&#xff09;3、原理图库&#xff08;schlib&#xff09;4、PCB库&#xff08;pcblib&#xff09; 二、封装1、DIP封…

PCB如何入门---一些经验与教训

从刚接触PCB打板到现在&#xff0c;磕磕碰碰的也是总结了一些经验&#xff0c;供大家参考借鉴一下。 首先&#xff0c;一开始接触PCB的入门&#xff0c;我是从b站上凡亿教育入门的 当然&#xff0c;这里没有打广告的嫌疑哈&#xff01;&#xff01;&#xff0c;这门课用的AD20…

protel dxp2004第三讲之仿真设计

今天给大家讲讲这款软件的仿真设计&#xff1a; Protel DXP 电路仿真概述 基于最新的Spice 3f5 模拟模型和XSPICE Simcode 数字模型仿真内核, Protel DXP 内嵌一个功能强大的A/D 混合信号仿真器,设计人员在进行原理图设计输入后,即可正确地仿真模拟和数字器件而无需通过A/D 转…

AD20安装、新建文件和一个小demo

一、软件的安装&#xff08;20&#xff09; AD20软件的安装包&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1naJ34qKRv0ZjTamTGAA0_w 提取码&#xff1a;dg68 安装步骤&#xff1a; https://mp.weixin.qq.com/s/Z81ajUtaGF149KN_Pe9qpw 二、文件新建过程 可以在电…

Altium Designer 18中的Violations Associated with Documents

Altium Designer 18中“工程选项”对话框“Error Reporting(错误报告)”选项卡第三项错误设置,是Violations Associated with Documents(与文件有关的错误),含有10条错误,如下图所示,软件官网https://www.altium.com/documentation只给出了8条错误说明。 Violations …

Altium Designer 学习笔记

Altium Designer 学习笔记 学习参考 B站凡亿教育AD20学习教程 如想获得更好阅读体验&#xff0c;可点击以下链接&#xff1a;AD20学习笔记 文章目录 Altium Designer 学习笔记快捷键总览第一部分&#xff1a;课程介绍、学习方法及元件库的创建1. 课程思路2. 新建工程3. 元件库…

PCB原理图绘制(2)——工程文件的初步修改与设置

PCB原理图绘制&#xff08;2&#xff09;——工程文件的初步修改与设置 1.修改原理图(sheet.schdoc)的大小与其他特性 &#xff08;Design-Document Options&#xff09; 2.为PCB板(pcb.pcbdoc)添加中间层 &#xff08;Design-Layer Stack Manager-&#xff08;选中Core如图…