udp的简单整理

news2024/12/26 22:46:37

最近思考udp处理的一些细节,根据公开课,反复思考,终于有所理解,做整理备用。

0:简单汇总

1:udp是基于报文传输的,接收方收取数据时要一次性读完。

2:借助udp进行发包,发大包也是没有问题的,借助IP层ip分片。

===》ip分片可以发生在原始主机上,也可以发生在中间路由器上(MTU值)

===》ip分片后,可以再分片,中间根据MTU进行判断。

===》网络状态良好情况下问题不大,但是网络状况不好的话,如果分片后丢弃其中一个包,udp整个包就丢了。

3:有的路由器可以设置,udp包过大会丢弃(设置了不允许分包吗?)。

===》ip头部有个标志字段flag,可以设置不能分片,则路由器会丢包。

4:路由器会有小包优先发送的问题,因此,发送大包会有乱序问题(分片后先发后面包的策略吧?)。

===》这个是分片后先发的后面包吧。

5:用户层对udp做分包

===》网络状况不好时,依赖ip分包,丢一个包整个包会丢,增加了风险和延迟。

===》设置了udp底层不允许分包,必然丢包。

===》网络发生拥塞,路由器或者交换机可能丢弃较大包减轻压力。

需要关注:

===》在用户层对udp进行分包, 需要自定义协议以便组包,以及分析包的最大字节数。

===》组包乱序问题,走不同链路可能导致,路由器先发送小包可能导致。

6:udp数据报大小,最大65535字节(报文头2字节表示长度),64k = 64*1024=65535字节

1:udp发包,如果一次不读完,就读不到完整数据了。

//借助demo进行测试,分包后,发送如下,前四个包1400字节 最后一个891

//这里直接借助同一个虚拟机,客户端和服务端都运行在其上测试。

#抓包可以看到  收到五个包   前四个1428字节 最后 总共919字节
root@ubuntu:/home/ubuntu# tcpdump -i lo -vnn port 10000
tcpdump: listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:33:04.369612 IP (tos 0x0, ttl 64, id 35196, offset 0, flags [DF], proto UDP (17), length 1428)
    192.168.40.132.48617 > 192.168.40.132.10000: UDP, length 1400
10:33:04.369764 IP (tos 0x0, ttl 64, id 35197, offset 0, flags [DF], proto UDP (17), length 1428)
    192.168.40.132.48617 > 192.168.40.132.10000: UDP, length 1400
10:33:04.369830 IP (tos 0x0, ttl 64, id 35198, offset 0, flags [DF], proto UDP (17), length 1428)
    192.168.40.132.48617 > 192.168.40.132.10000: UDP, length 1400
10:33:04.369889 IP (tos 0x0, ttl 64, id 35199, offset 0, flags [DF], proto UDP (17), length 1428)
    192.168.40.132.48617 > 192.168.40.132.10000: UDP, length 1400
10:33:04.369993 IP (tos 0x0, ttl 64, id 35200, offset 0, flags [DF], proto UDP (17), length 919)
    192.168.40.132.48617 > 192.168.40.132.10000: UDP, length 891

#分析代码,如果服务端读数据的时候buffer缓冲区不够大,只读特定长度的数据,一个完整的包就只读了这部分,后面的数据就全不在了 
#这里分析了 最后客户端发送时的buffer内容 以及服务端接收buffer的内容,
#虽然有while循环,但是只读了一次,如果buffer不够,只读了一个发送报文的前部分,后面在读就从新的报文的前面了。

#===》所以 代码一次性要读完发送出来的一个完整的包

在这里插入图片描述

2:udp发包,发大包也没问题,ip底层会分片(发送端或者中间路由)。

==》可能多次分片

这里简单实现一个udp服务端的代码,在本地局域网和远端服务器上进行部署看看现象。

2.1 借助网络传输助手,在虚拟机上运行服务端,客户端用网络传输助手发送大包,抓包发现是一个包,并且,服务端正常打印了数据。

接收时recvfrom缓冲区设置的比较大,是20000

在这里插入图片描述

2.2 在远端云服务器上进行测试:同样的服务端代码运行在远端

这里遇到一个自己埋坑的点,看了好久,云服务器上要配置端口开放,配置安全组,配置完要加入到对应的云服务器环境中,我配置后,实际环境和配置的安全组不是一个,一直不通研究了半天。

如果用网络传输助手直接发一个比较大的包,发现也是能成功的。(这里的udpserver仅仅大的buffer接收)

我简单测试,发送了8次,发现8次都收到了,这里是手动,频率不高

在这里插入图片描述

用代码测试,在本机虚拟机上发多个包给云服务器上demo

可以看到,前三次发2048个字节,最后一个335字节,可以看到有接收乱序的问题。

在这里插入图片描述

如果我给客户端的发送,多发送几次(这里3次),并且不等待,能明显看出乱序严重,有收到包。

在这里插入图片描述

===》这里说明超过MTU,借助ip分片,接收还是可以的,但是有乱序的问题

如果正常的包大小进行测试看看,小于MTU,这里用1400:

在这里插入图片描述

3:udp发包,假设路由器有设置不允许分片,或者设置不允许ip分片试试

如果我设置不允许分包,这里只是简单参考设置:

//这里我在客户端进行设置  然后发送前面的包1800  最后一个包符合
int val = IP_PMTUDISC_DO ;
setsockopt(sock, IPPROTO_IP, IP_MTU_DISCOVER, &val, sizeof(val));

在这里插入图片描述

从抓包看,如果有这样的设置,那么大于MTU的包就直接丢弃了,sendto报时失败了,没有ip分片,不知道路由器中间有没有限制。

设置后,直接导致发送失败:

在这里插入图片描述

这里有个路径MTU的概念,以及设置ip不分片,有待研究

汇总:

1:udp如果直接发大于MTU的包,一般网络状况好的情况下也不会有太大问题,当然有丢包概率。

2:udp发送时,有乱序的问题。

3:在网络状态不好的情况下,借助了ip分片,增大了丢包的概率。

4:路径MTU,以及中间路由器对包的丢包策略也是一个点,

5:为了防止丢包,乱序,以及中间路由器相关不可控问题,最好用户层进行拆包,拼包处理,以及相关的可靠性传输。

太多的技术栈来源于零声学院,工作之余,跟着研究一些工作之外的知识。

推荐:https://xxetb.xet.tech/s/2W52YR

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1018353.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

车载软件架构 —— AUTOSAR Vector SIP包(一)

车载软件架构 —— AUTOSAR Vector SIP包(一) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在…

uniapp项目实践总结(十六)自定义下拉刷新组件

导语:在日常的开发过程中,我们经常遇到下拉刷新的场景,很方便的刷新游览的内容,在此我也实现了一个下拉刷新的自定义组件。 目录 准备工作原理分析组件实现实战演练内置刷新案例展示 准备工作 在components新建一个q-pull文件夹…

机器学习算法基础--Generalized Linear Regression Model

目录 1.数据的处理及查看 2.数据的处理及可视化 3.模型的创建与拟合 4.算法可视化效果图 5.多维度模型可视化 线性回归讲了很多次了,广义线性回归无非就是拟合的多项式曲线的次数的变化,就不再推导公式和算法流程了。 1.数据的处理及查看 import num…

人工智能轨道交通行业周刊-第60期(2023.9.11-9.17)

本期关键词:巡检机器人、重庆最强大脑、数字铁路规划、高铁起步、Baichuan 2大模型 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMet…

​使用拥抱脸的稳定扩散世界 — 使用文本提示创建 AI 生成图像的扩散器库​

一、简介 你可能已经看到人工智能生成的图像有所增加,这是因为潜在扩散模型的兴起。简单来说,稳定扩散是一种深度学习模型,它可以在给定文本提示的情况下生成图像。 图1:稳定扩散概述 从上图可以看出,我们可以传递文本…

一次Python无法安装模块的问题探索与解决之旅

源起 在Windows 10系统中安装 Python 3.11.5版本(目前最新版)并安装模块 (比如flask),安装步骤很简单: 到官方下载安装档https://www.python.org/downloads/点击安装文件安装Python到命令行执行 pip install packagename 安装扩…

基于SpringBoot的图书商城系统

基于SpringBootVue的网上书城系统、图书商城、网上书店系统,前后端分离 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色&#xff1…

STM32F4X SPI W25Q128

STM32F4X SPI W25Q128 什么是SPISPI的特点SPI通信引脚SPI接线方式SPI速率SPI通信方式SPI时钟相位和时钟极性 STM32F4X SPISTM32F4X SPI配置STM32F4X SPI频率 W25Q128W25Q128存储结构W25Q128读写操作W25Q128常用指令读取ID命令(0x90)写使能命令(0x06)禁止写使能命令(0x04)读取W2…

7.前端·新建子模块与开发(自动生成)

文章目录 学习地址视频笔记自动代码生成模式开发增删改查功能调试功能权限分配 脚本实现权限分配 学习地址 https://www.bilibili.com/video/BV13g411Y7GS/?p15&spm_id_frompageDriver&vd_sourceed09a620bf87401694f763818a31c91e 视频笔记 自动代码生成模式开发 …

30分钟吃掉YOLOv8实例分割范例

本范例我们使用 torchkeras来实现对 ultralytics中的YOLOv8实例分割模型进行自定义的训练,从而对气球进行检测和分割。 尽管ultralytics提供了非常便捷且一致的训练API,再使用torchkeras实现自定义训练逻辑似乎有些多此一举。 但ultralytics的源码结构相…

大众冰球运动水平等级评价规范

声明 本文是学习GB-T 42371-2023 大众冰球运动水平等级评价规范. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件确立了大众冰球运动水平的等级和评价程序,规定了等级评价的总体要求以及评价要素、评 价要求,描…

408数据结构算法题目

408数据结构算法题目 408数据结构算法题目一、2020-411.1 题目描述1.2 分析1.3 代码1.3.1 暴力美学1.3.2 贪心 408数据结构算法题目 一、2020-41 1.1 题目描述 2020-41 41.(13分) 定义三元组(a,b,c)(a,b,c均为正数)的距离D|a-b||b-c||c-a…

C++学习笔记--项目知识点集合

一、同步IO、异步IO、阻塞IO、非阻塞IO 首先来看看两种I/O的定义:同步I/O和异步I/O 同步(阻塞)I/O:在一个线程中,CPU执行代码的速度极快,然而,一旦遇到IO操作,如读写文件、发送网络…

【LeetCode-简单题KMP】459. 重复的子字符串

文章目录 题目方法一:移动匹配方法二:KMP算法 题目 方法一:移动匹配 class Solution {//移动匹配public boolean repeatedSubstringPattern(String s) {StringBuffer str new StringBuffer(s);//ababstr.append(s);//拼接一份自己 abababab…

TCP/IP协议栈的心跳、丢包重传、连接超时机制实例详解

大家好,本文结合具体的问题实例,详细讲解一下TCP/IP协议栈的心跳机制、丢包重传机制等内容,给大家提供一个借鉴和参考。 1、问题概述 虽然软件底层模块在网络恢复后能自动重连上服务器,但会议因为网络问题已经退出,需…

代码随想录|121. 买卖股票的最佳时机,122.买卖股票的最佳时机II,123.买卖股票的最佳时机III,188.买卖股票的最佳时机IV

121. 买卖股票的最佳时机 dp含义 dp[i][0] 表示第i天持有股票所得最多现金 ,dp[i][1] 表示第i天不持有股票所得最多现金 其实一开始现金是0,那么加入第i天买入股票现金就是 -prices[i], 这是一个负数。 递推公式 第i天持有股票即dp[i][0],可以由两个…

Oracle数据库体系结构(三)_逻辑结构

Oracle逻辑存储结构,主要描述oracle 数据库内部数据的组织和管理方式,即在数据库管理系统的层面中如何组织和管理数据,与操作系统没有关系。逻辑存储结构时候物理存储机构的抽象体现,是不可见的,可以通过查询数据库数据字典了解逻…

RocketMq(一)安装部署

一、linux单机部署: 1、到apache官网下载 | RocketMQ (apache.org)下载binary zip包,如我下载的4.9.6版本。 上传到建好的/usr/local/rocketmq目录下。 2、解压zip包 unzip rocketmq-all-4.9.6-bin-release.zip 3、进入解压后的文件夹,启动 Name Serv…

TCP详解之流量控制

TCP详解之流量控制 发送方不能无脑的发数据给接收方,要考虑接收方处理能力。 如果一直无脑的发数据给对方,但对方处理不过来,那么就会导致触发重发机制,从而导致网络流量的无端的浪费。 为了解决这种现象发生,TCP 提…

关于QGC Landing Pattern规划的计算过程

固定翼飞机在规划航线时,QGC提供了自动生成降落阶段航线功能。在地图上选择降落点之后,根据默认的下滑坡度或下滑距离、盘旋点半径,自动生成航线。最后的降落航向实际由三个点组成,开始降落点(MAV_CMD_DO_LAND_START&a…