UDP 分片 与 丢包,UDP 真的比 TCP 高效吗?UDP 的应用场景

压力测试下,UDP丢包解决方案 udp丢包是指在截获数据包后,linux内核的tcp/ip协议栈在udp数据包处理过程中的丢包,主要原因有两个:udp数据包格式或校验和错误和应用程序来不及处理udp数据包。 首先介绍通用的udp丢包检测方法,使用netstat命令,加-su参数。 # netstat -su Udp:     * packets received     * packets to unknown p 阅读详情

目录

一、UDP 报文格式

二、UDP 分片

1、UDP 有发送缓存区吗?

1>、先说结论:

2>、逐步分析:

2、UDP 分片

1>、UDP 包最佳传输大小

2>、分片问题

三、UDP 丢包的原因

1、UDP 缓冲区满,造成的丢包

2、UDP 缓冲区过小或文件过大,造成的丢包:

3、ARP 缓存过期,导致丢包:

4、接收端处理时间过长导致丢包:

5、发送的包巨大丢包:

6、发送的包频率太快:

7、局域网内不丢包,公网上丢包。

四、UDP 丢包的解决方案

1. 从发送端解决 - 延迟发送

2.从接收端解决:数据接收 与 数据处理相分离

3.从接收端解决:修改接收缓存大小

五、UDP 实现对方百分百收到数据

1、UDP 致命性缺点:

2、解决方案 - 回复 + 重发 + 编号 机制:

1>、分析:

2>、回复 + 重发 + 编号 机制

3、解决方案 - 冗余传输方案:

4、解决方案 - RUDP:

六、UDP 真的比 TCP 要高效吗

1、 无法智能利用空闲带宽导致资源利用率低:

2、无法动态调整发包:

3、改进 UDP 的成本较高:

七、UDP 协议的正确使用场合

1、高通信 实时性要求 和 低持续性要求 的场景下

2、多点通信的场景下

3、UDP应用举例

4、QQ udp 浅析

1>、用 tcp 长连接,对服务器的负担很大

2>、tcp 较难实现 NAT 穿越

3>、让 UDP 变得可靠


一、UDP 报文格式

每个 UDP 报文分为 UDP 报头和 UDP 数据区两部分。报头由 4 个 16 位长(2 字节)字段组成,分别说明该报文的源端口、目的端口、报文长度和校验值。

UDP 报文格式如图所示。

UDP 报文中每个字段的含义如下:

  • 源端口:     16bits,发送端的端口。
  • 目的端口: 16bits,即接收端的端口
  • 长度:         16bits,UDP 数据包总的大小:包头+数据,单位:字节。
  • 校验值:      16bits,错误检查码,基于算法,计算此 UDP 数据包是否损坏

二、UDP 分片

1、UDP 有发送缓存区吗?

TCP 有 发送/接收 缓存区,那 UDP 有么?

1>、先说结论:

每个 UDP socket 都有一个接收缓冲区,没有发送缓冲区,从概念上来说就是只要有数据就发,不管对方是否可以正确接收,所以不缓冲,不需要发送缓冲区。

UDP:当套接口接收缓冲区满时,新来的数据报无法进入接收缓冲区,此数据报就被丢弃。UDP是没有流量控制的;快的发送者可以很容易地就淹没慢的接收者,导致接收方的 UDP 丢弃数据报。

且,如果在传输过程中,一次传输被分成多个分片,传输中有一个小分片丢失,那接收端最终会舍弃整个文件,导致传输失败,这就是 UDP 不可靠的原因。

2>、逐步分析:

linux手册中有设置 UDP 发送缓冲区相关属性,也明确提到了send buffer的概念:

   那这是否意味着 UDP 是有发送缓冲区的吗?我们再看一下《UNIX Network Programming》书中所述,这本书的作者权威性我就不多说了吧,在国内高校此书都是当做教材使用的。书中有下面两幅图:

一张是 TCP 发送过程协议栈简化图,另一张是 UDP 的。UDP 中的 send buffer 是用虚线框圈起来的,具体的叙述我直接引用书中原文:

   书中的描述很清楚了,UDP 是没有发送缓冲区的,因为 UDP 是不可靠的,他不必像 TCP 一样需要一个实质的发送buffer,而且真正 UDP 写成功返回其实是传递到了链路层的 output queue 中。

2、UDP 分片

1>、UDP 包最佳传输大小

数据链路层 最大传输单元是 1500 字节 (MTU) ,要想 IP 层不分包,那么 UDP 数据包的最大大小应该是1500字节 – IP头(20字节) – UDP头(8字节) = 1472字节。

但,理论上 UDP 报文最大长度是 65507 字节,那:实际上发送这么大的数据包效果最好吗?

我们来看分析一下 “分片问题”

关于 UDP 包大小、MTU相关知识,可以参照上一篇文章:

最大可传输单元 MTU 对 UDP/TCP 包的大小限制_LearnLHC的博客-优快云博客_mtu udp

2>、分片问题

我们知道 UDP 是不可靠的传输协议,为了减少 UDP 包丢失的风险,我们最好能控制 UDP 包在 IP层协议的传输过程中不要被切割。

这是为什么呢?

如果 MTU 是1500,Client 发送一个 8000字节大小的 UDP 包,那么 Server 端阻塞模式下接包,在不丢包的情况下,recvfrom(9000) 是收到 1500,还是 8000。如果某个 IP 分片丢失了,recvfrom(9000),又返回什么呢?

根据 UDP 通信的有界性,在 buf 足够大的情况下,接收到的一定是一个完整的数据包,UDP 数据在下层的分片和组片问题由 IP 层来处理,提交到 UDP 传输层一定是一个完整的 UDP 包,那么 recvfrom(9000) 将返回 8000。如果某个 IP 分片丢失,udp 里有个 CRC 检验,如果包不完整就会丢弃,也不会通知是否接收成功,所以 UDP 是不可靠的传输协议,那么 recvfrom(9000) 将阻塞。

分片分的越多,虽然在传输层都是一次 send,一次 recv ,但在传输过程中,会传输多次,那么丢包的概论就越大,如何解决丢包问题呢?

三、UDP 丢包的原因

前提:

在不考虑 IP 层的分片丢失,CRC 检验包不完整的情况下

1、UDP 缓冲区满,造成的丢包

如果 socke t缓冲区满了,应用程序没来得及处理在缓冲区中的 UDP 包,那么后续来的 UDP 包会被内核丢弃,造成丢包。

在 socket 缓冲区满造成丢包的情况下,可以通过增大缓冲区的方法来缓解UDP丢包问题。但是,如果服务已经过载了,简单的增大缓冲区并不能解决问题,反而会造成滚雪球效应,造成请求全部超时,服务不可用。

2、UDP 缓冲区过小或文件过大,造成的丢包:

如 果Client 发送的 UDP 报文很大,而 socket 缓冲区过小无法容下该 UDP 报文,那么该报文就会丢失。

以前遇到过这种问题,我把接收缓冲设置成 64K 就解决了。

int nRecvBuf=32*1024;//设置为32K

setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));

3、ARP 缓存过期,导致丢包:

ARP 的缓存时间约 10 分钟,APR 缓存列表没有对方的 MAC 地址或缓存过期的时候,会发送 ARP 请求获取 MAC 地址,

在没有获取到 MAC 地址之前,用户发送出去的 UDP 数据包会被内核缓存到 arp_queue 这个队列中,默认最多缓存 3 个包,多余的 UDP 包会被丢弃。

4、接收端处理时间过长导致丢包:

调用 recv 方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用 recv 方法,在这二次调用间隔里,发过来的包可能丢失。

对于这种情况可以修改接收端,将包接收后存入一个缓冲区,然后迅速返回继续 recv。

5、发送的包巨大丢包:

虽然 send 方法会帮你做大包切割成小包发送的事情,但包太大也不行。

例如超过 50K 的一个 udp 包,不切割直接通过send 方法发送也会导致这个包丢失。这种情况需要切割成小包再逐个 send。

6、发送的包频率太快:

虽然每个包的大小都小于 mtu size 但是频率太快,例如 40 多个 mut size 的包连续发送中间不 sleep,也有可能导致丢包。

这种情况也有时可以通过设置 socket 接收缓冲解决,但有时解决不了。

所以在发送频率过快的时候还

解决FFmpeg播放RTSP推送的H265码流报错问题 RTSP(Real Time Streaming Protocol),实时流传输协议,是TCP/IP协议体系中的一个应用层协议。RTP(Real-time Transport Protocol)实时传输协议,是一个网络传输协议,它位于传输层,但通常运行在UDP协议之上。去年我写过两篇关于使用RTSP推送H265码流并拉流显示的文章。实现HEVC码流RTSP推流并显示和假如我想编码HEVC码流时就显示视频画面。前者是使用RTSP+RTP推送本地的H265码流并使用VLC软件拉流显示。 阅读详情

相关推荐

【TCP/UDP】MSS和MTU、UDP报文、TCP报文、如何实现TCP的长连接、TCP的粘包问题如何解决等重点知识汇总

这时,接收方的程序如果不知道发送方发送的消息的长度,也就是不知道消息的边界时,是无法读出一个有效的用户消息的,因为用户消息被拆分成多个 TCP 报文后,并不能像 UDP 那样,一个 UDP 报文就能代表一个完整的用户消息。数据分段:首先,数据报文被分割成多个16位的字(或者称为16位字,即两个字节),如果数据长度不是16位的整数倍,最后一个字节将被扩展为16位。求和:将这些16位字依次相加,形成一个32位的中间和,如果中间和的高16位不为0,将其加到低16位上,得到最终的16位和。

qq_68993495的博客 2115

TCP粘包以及UDP丢包问题

1、TCP和UDP。 TCP(transport controlprotocol,传输控制协议)是面向连接的,提供高可靠性服务。UDP(user datagramprotocol,用户数据报协议)是无连接的,提供高效率服务。在实际工程应用中,对可靠性和效率的选择取决于应用的环境和需求。一般情况下,普通数据的网络传输采用高效率的udp,重要数据的网络传输采用高可靠性的TCP。 TCP的目标是为用户提供可靠的端到端连接,保证信息有序无误的传输。它除了提供基本的数据传输功能外,还为保证可靠性采用了数据编号

yy_hear的博客 4951

Windows平台网络丢包测试工具实战应用

Winsock采用分层架构设计,整体可分为三层:应用程序层和传输协议驱动程序(TDI或WFP)。应用程序通过调用Winsock API函数(如socket()connect()sendto()等)发起请求,这些请求由Winsock动态链接库转发至底层网络驱动,最终交由网卡硬件发送出去。graph TDA[应用程序] -->|Winsock API调用| B(ws2_32.dll)C -->|是| D[TCP/IP 协议栈]C -->|否| E[其他协议驱动]

weixin_30633869的博客 1542

Arduino程序设计(十四)舵机控制实验(SG90)

本文介绍SG90舵机控制原理及实验,主要内容有:1、介绍SG90舵机;2、舵机0°~180°来回转动;3、串口控制舵机转动固定角度。(1)舵机是一种位置(角度)伺服的驱动器。舵机只是一种通俗的叫法,其实质是一个伺服马达。在需要角度不断变化并可以保持的控制系统中应用广泛。如遥控机械人、飞机模型等。(2)舵机的转动角度为0~180°,其内部结构包括电机,控制电路和机械结构三部分。电机有三根线引出,分别接VCC、GNG和信号线。

Alice的博客 1万+

基于Matlab-Simulink的大林算法控制系统设计与振铃消除实验

本文详细介绍了基于Matlab-Simulink的大林算法控制系统设计与振铃消除实验。通过分析纯滞后系统的控制难题,探讨大林算法在工业控制中的应用优势,并提供Matlab-Simulink环境搭建、控制器D(z)设计、振铃消除及仿真实验的完整流程。文章还对比了大林算法与PID控制的性能差异,为工程实践提供参考。

dropout6artist的博客 796

基于灰度信息的图像配准方法

图像配准方法分为三种:基于灰度信息方法、基于变换域方法和基于特征方法。基于灰度信息方法是直接根据图像或图像块灰度信息进行像素上的对齐,该方法主要思想是直接最小化图像信息差异。然而,图像信息差异的判断准则衍生出不同的配准方法。常见的基于灰度信息的图像配准方法包括互相关法、互信息法和误差平方和法。本节将分别对互相关法、互信息法和误差平方和算法展开介绍,并通过MATLAB进行演示。基于灰度的图像方法容易实现,但同样存在不足。该方法对成像条件(光照,遮挡)、图像形变旋转以及噪声极其敏感,同时具有较高的计算复杂度。

weixin_42068054的博客 3776

YOLOv8缺陷检测可视化界面实战:PyQt5布局设计与代码实现

本文详细介绍了如何利用PyQt5为YOLOv8缺陷检测模型构建一个专业、易用的可视化界面。通过实战讲解PyQt5的布局管理器设计、信号槽机制与YOLOv8核心的集成,帮助开发者快速将AI模型部署为直观的桌面应用,提升工业质检等场景的落地效率。

redis7keeper的博客 756

【多元统计分析】均值向量和协方差阵的检验——spss上机实验

均值向量和协方差阵的检验——spss上机实验 #参考书目为《多元统计分析》(第五版)——何晓群.中国人民大学出版社 #如有错误,请指正!谢谢~ #关注公众号搜索同名文章获取数据~ 习题2.3 现选取内蒙古、广西、贵州、云南、西藏、宁夏、新疆、甘肃和青海等9个内陆边远省区。选取人均GDP、第三产业比重、人均消费支出、人口自然增长率及文盲半文盲人口占15岁以上人口的比例等5项能较好的说明各地区社会经济发展水平的指标,验证边远及少数民族聚居区的社会经济发展水平与全国平均水平间有无显著差异。 将输入导入spss

suansuannainaizi的博客 3万+

【DSP】【工程实战】从零构建C6678多核工程:CCS环境配置与启动模式详解

本文详细介绍了在CCS开发环境中从零构建TMS320C6678多核DSP工程的完整流程。内容涵盖KeyStone架构解析、工程创建、基础代码编写、链接命令文件配置、仿真器调试,并重点深入讲解了包括I2C EEPROM在内的多种一级启动模式原理与配置方法,为开发者提供了一套清晰、可复用的实战指南。

weixin_29164185的博客 417

Oracle EBS(R12+)通过Multi-Org 多组织架构、Multi-Ledger 多账簿、SLA 子分类账会计、多币种引擎、多会计政策并行五大核心能力,为跨国企业提供一体化、自动化、合规的

Oracle EBS(R12+)提供全球会计核算解决方案,通过Multi-Org多组织架构实现跨国集团数据隔离与共享,支持四层组织结构(业务组→法律实体→经营单位→库存组织)。Multi-Ledger多账簿功能允许一笔业务多准则自动核算,包含主账簿、辅助账簿和报告币种。系统内置多币种处理引擎,覆盖全流程货币业务,支持自动重估、再计量和折算。通过SLA子分类账会计实现多会计政策并行处理,满足不同国家会计准则和税制要求。该方案可同时支持本地法定、集团合并及管理分析需求,实现全球财务数据集中管理,提升合规性和运营

金牌架构师 553

【华为OD机试】真题A卷-Linux发行版的数量(Python)

【华为OD机试】真题A卷-Linux发行版的数量(Python):Linux操作系统有多个发行版,distrowatch.com提供了各个发行版的资料。这些发行版互相存在关联,例如Ubuntu基于Debian开发,而Mint又基于Ubuntu开发,那么我们认为Mint同Debian也存在关联。 发行版集是一个或多个相关存在关联的操作系统发行版,集合内不包含没有关联的发行版。给你一个nxn的矩阵isConnected,其中isConnected[i][i]=1表示第i个发行版和第j个发行版直接

u014481728的博客 943

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: 最大可传输单元 MTU 对 UDP/TCP 包的大小限制
下一篇: QProcess 获得 ping 后的结果 || 调用其他 exe 获取其输出信息
LearnLHC
博客等级 码龄10年 183粉丝 149原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值