应用层协议/传输层协议(UDP)
目录
应用层
如何自定义应用层协议?
序列化方式
1.基于行文本的方式来传输
2.基于xml的方式
3.基于json的方式
4.yml的形式
5.protobuffer(pb)形式
传输层
端口号
协议
UDP
校验和
CRC
TCP
TCP/IP五层协议
应用层 -- 传输层 -- 网络层 -- 数据链路层 -- 物理层。
应用层
应用层和应用程序直接相关,是和程序员打交道最多的一层。
应用层协议里面描述的内容就是你写的程序,通过网络具体按照啥样的方式来传输数据,不同的应用程序就可以用不同的应用层协议。在实际开发中,很多时候需要自己去自定制应用层协议的。
自定义应用层协议,本质上就是对传输的数据做出约定:
1.约定传输的数据要有那些信息。
2.传输的数据要遵守什么样的格式。
如何自定义应用层协议?
1.确定传输信息
客户端发送请求,服务器响应数据。
比如开发一个外卖软件,用户发送请求:用户的id和所在位置,服务器返回响应:商家列表,商家名称,商家图片,商家评分简介等。
2.确定数据格式
上述的数据都属于”结构化数据“(通过结构体来表示的数据),网络上传输的是字符串(二进制字符串),就需要对数据进行序列化。
序列化方式
1.基于行文本的方式来传输
例如:
请求:用户id,位置信息
1234 180E40N
响应:商家名称,商家图片,商家评分
凉皮 图片地址 9.2
这种格式属于自定义格式,包含的信息,分割符都可以灵活控制,只需要确保客户端和服务器使用同一套规则进行通信即可。但是这套规则的可维护性比较差,当属性多了的时候,看上去混乱。
2.基于xml的方式
一种经典的数据组织格式:
请求:
<request>
<userId>1234</userId>
<position>180E40N</position>
</request>
在使用maven使就是通过xml来配置管理的。
3.基于json的方式
使用{ }作为边界,里面是键值对,键值对之间,使用 ,进行分割,键和值之间使用 :进行分割:
请求:
{
userId: 1234,
position: "180E40N"
}
可读性好,而且比xml更简洁。
4.yml的形式
属于缩进格式,通过缩进来表示包含/嵌套关系。xml通过标签来表示嵌套关系,yml通过缩进来表示的。并且对于缩进是强制要求的,可读性也很好,缩进不正确就会出错。
5.protobuffer(pb)形式
前面几种形式都是文本格式,肉眼可以看懂,pd则是二进制数据,肉眼看不懂。对于传输效率要求高的场景推荐使用这种方式,针对数据进行进一步的整理和压缩,虽然可读性不好,但是能够把空间最充分的利用,最节省网络宽带,效率也最高。
传输层
socket api都是由传输层协议提供的,操作系统内核实现。
端口号
端口号就是传输层提供的概念,用来寻找主机上的应用程序。端口号是一个整数,使用两个字节表示的无符号整数:0 -> 65535,其中,小于1024的端口号称为知名端口号,把这些端口号分配给一些比较知名的服务器程序作为这些服务器的“默认端口号”,自己写的服务器程序要避免知名端口号。
同一个机器上,同一时刻,端口号不能重复被绑定。可以使用 netstat 命令查看当前主机上是否有使用9090端口的进程,打开终端,输入命令:
9090端口号没有被使用,8080端口号被使用。两个进程不能同时绑定一个端口号。
协议
UDP: 无连接,不可靠传输,面向数据报,全双工
TCP:有连接,可靠传输,面向字节流,全双工
UDP
应用层数据到达UDP之后,就会给应用层数据报前面拼装上UDP报头。
UDP数据报 = UDP报头(8字节) + UDP载荷
一个UDP数据报,,最长就是64kb,UDP长度就描述了整个UDP数据报占多少个字节,通过UDP长度就能知道当前载荷一共是多少字节。如果使用UDP开发程序,就会有很大的限制,要确单个数据报在传输时不能超过64KB。
校验和
数据在网络传输中是可能会”出错“的。如比特翻转:
传输数据时是传输的二进制数,假设传输的是 0,但是实际到达对端却变成了 1。
这是因为数据在传输过程中变为电信号/光信号/电磁波的形式,可能受到外界干扰。比如电信号,在电信号中使用 0 表示高电平,使用 1 表示低电平,此时如果在传输过程中,遇到一个变化的磁场,就会把原来 的高电平/低电平变为低电平/高电平,这就需要能够对传输的数据进行校验。UDP就使用CRC的方式来对错误信息进行校验。
校验和是数据引入冗余信息,通过冗余信息来验证原有的数据。就是拿着数据一部分进行一系列计算,得到的结果,如果数据发生变化,此时得到的结果也不一样。
CRC
UDP中使用CRC算法作为校验和,CRC是一个简单粗暴的计算校验和的方式,循环冗余校验 。
设定两个字节的变量,把数据每个字节都取出来,往这个变量上进行累加,如果结果溢出,超过两个字节的溢出部分就舍弃。
TCP
TCP协议机制较复杂,下篇文章进行详解。
感谢观看
相关文章:
应用层协议/传输层协议(UDP)
目录 应用层 如何自定义应用层协议? 序列化方式 1.基于行文本的方式来传输 2.基于xml的方式 3.基于json的方式 4.yml的形式 5.protobuffer(pb)形式 传输层 端口号 协议 UDP 校验和 CRC TCP TCP/IP五层协议 应用层 -- 传输层 -- 网络层 -- 数据链路层…...
【Linux】应用层协议—HTTP
一、HTTP协议介绍 请求-响应模型:HTTP (Hyper Text Transfer Protocol) 协议是基于请求和响应的。客户端(如Web浏览器)发送一个HTTP请求到服务器,服务器处理请求后返回一个HTTP响应。 无状态,无连接协议:H…...
使用Vue3+Echarts实现加载中国地图,点击省份地图下钻(完整教程)
一. 前言 在众多 ECharts 图表类型中,开发者始终绕不开的有各种各样的地图开发,关于地图开发,可能比其他图表相对繁琐一些,其实说简单也简单,说复杂也复杂,其中不乏有层级地图、3D 地图等,感觉…...
双目相机的标定,视差图,深度图,点云生成思路与实现。
该文档记录从双目相机标定到点云生成的所有过程,同时会附上代码。 代码直接能跑。https://github.com/stu-yzZ/stereoCamera 目录 大致思路如下: 一、相机标定 1、相机参数介绍 2、单目相机标定 3、双目相机标定 二、图片畸变矫正 三、极线矫正…...
解决 minio上传文件Service: S3, Status Code: 403
错误信息 [software.amazon.awssdk.services.s3.model.S3Exception: (Service: S3, Status Code: 403, Request ID: 180E9BC04F11312E, Extended Request ID: 81aefed089495c5faf6270c59bea93c9783926f74ef647fe6b17908f0976b557)]分析过程 4XX一般是客户端错误。403表示禁止…...
SpringBoot实战——个人博客项目
目录 一、项目简介 ?二、项目整体架构 数据库模块 后端模块 前端模块 ?三、项目具体展示 ?四、项目的具体实现 1、一些准备工作 ??数据库、数据表的创建 ??设置数据库和MyBatis的配置 ??将前端项目引入到当前项目中 2、登录注册模块 ??实体类的创建 ?…...
OpenCV-平滑图像
二维卷积(图像滤波) 与一维信号一样,图像也可以通过各种低通滤波器(LPF)、高通滤波器(HPF)等进行过滤。LPF 有助于消除噪音、模糊图像等。HPF 滤波器有助于在图像中找到边缘。 opencv 提供了函数 **cv.filter2D()**&…...
nodejs官方文档学习-笔记-1
一、异步工作 process.nextTick(): 回调会在当前操作完成后立即执行,但在事件循环进入下一个阶段之前。它是最先执行的。 Promise.then(): 回调会在 microtask 队列中执行,通常是在当前操作完成后,但在事件循环进入…...
YOLOv7
YOLOv7 是 YOLO 系列的一个重要版本,由 Chien-Yao Wang 和 Alexey Bochkovskiy 等研究人员和开发者提出,继续改进了 YOLOv4 和 YOLOv5 的设计,主要在模型性能、训练效率以及推理速度上进行优化。YOLOv7 进一步优化了 YOLO 系列在速度和精度之…...
汉语唤醒词的模糊判断(Python)
汉语唤醒词的模糊判断【Python】 说明安装库代码Demo其他 说明 这是一个简单的汉语模糊唤醒词的判断器,汉语发音中前后舌以及声母韵母的区别,如果进行精准判断,很容易误判。需要一个模糊判断的逻辑! 安装库 pip install pypinyin代码Demo …...
C语言实例_26之根据输入计算星期几
1. 问题 请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。 2. 实现思路 思路一:嵌套if-else语句实现 首先接收用户输入的第一个字母,使用if-else语句进行判断。如果输入的是M࿰…...
包管理器npm,cnpm,yarn和pnpm
npm (Node Package Manager) 核心技术与工作原理 依赖解析: 广度优先搜索(BFS):npm 使用 BFS 算法来解析依赖树,尽量扁平化 node_modules 目录以减少重复的依赖项。冲突处理:如果两个包需要同一个依赖的不…...
docker-compose部署skywalking 8.1.0
一、下载镜像 #注意 skywalking-oap-server和skywalking java agent版本强关联,版本需要保持一致性 docker pull elasticsearch:7.9.0 docker pull apache/skywalking-oap-server:8.1.0-es7 docker pull apache/skywalking-ui:8.1.0二、部署文件docker-compose.yam…...
Android -- [SelfView] 自定义多行歌词滚动显示器
Android – [SelfView] 自定义多行歌词滚动显示器 流畅、丝滑的滚动歌词控件* 1. 背景透明;* 2. 外部可控制进度变化;* 3. 支持屏幕拖动调节进度(回调给外部);效果 歌词文件(.lrc) 一. 使用…...
记事本建java及java命名规范
1.桌面开发:c# 2. 记事本建java: 以class的名称(类名)为名,名称.java 编译jdk:javac 名称.java 调动运行jre : java 名称 查看名称.java里面的内容:cat 名称.java java 的命名规范 大驼峰(每个单词首…...
Elasticsearch scroll 之滚动查询
Elasticsearch scroll 之滚动查询 Elasticsearch 的 Scroll API 是一种用于处理大规模数据集的机制,特别是在需要从索引中检索大量数据时。通常情况下,Elasticsearch 的搜索请求会有一个结果集大小的限制 (fromsize 的检索数量默认是 10,000 条记录)&am…...
cartographer建图与定位应用
文章目录 前言一、安装cartographer1.安装环境2.源码编译2.1 下载2.2 编译 二、gazebo仿真2d建图0.准备仿真环境1.编写lua文件2.编写启动文件3.建图保存 三、cartographer定位 move_base导航3.1 编写启动文件3.2 启动launch 总结 前言 本文介绍cartographer在ubuntu18.04下的…...
CEEMDAN-CPO-VMD二次分解(CEEMDAN+冠豪猪优化算法CPO优化VMD)
CEEMDAN-CPO-VMD二次分解(CEEMDAN冠豪猪优化算法CPO优化VMD) 目录 CEEMDAN-CPO-VMD二次分解(CEEMDAN冠豪猪优化算法CPO优化VMD)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 首先运用CEEMDAN对数据进行一次分解ÿ…...
【Golang】Go语言编程思想(二):函数式编程
函数式编程 函数与闭包 支持函数式编程的语言当中,函数是一等公民,参数、变量、返回值都可以是函数。 以 adder 为例,下例实现了一个函数式编程: package mainimport "fmt"func adder() func(int) int {sum : 0retu…...
ros项目dual_arm_pick-place(moveit和gazebo联合仿真)(一)
目录 前言正文创建功能包具体代码运行 总结 前言 dual_arm_pick-place项目中,实现了两套的moveit和gazebo联合仿真。 启动文件分别是bringup_moveit.launch和arm_bringup_moveit.launch。 在这个项目中,我将代码重新创建了一个包,co_simula…...
点线面|点到两点直线距离求解
在点云库(PCL)中,计算点到直线的距离可以借助于向量运算。以下是这种计算方法的步骤以及相应的实现代码。 概念 要计算点 AA 到通过点 BB 和 CC 定义的直线的距离,可以使用以下步骤: 定义两个向量: 向量 …...
等保2.0三级测评华为华三交换机路由器
在使用本博客提供的学习笔记及相关内容时,请注意以下免责声明: 信息准确性:本博客的内容是基于作者的个人理解和经验,尽力确保信息的准确性和时效性,但不保证所有信息都完全正确或最新。 非专业建议:博客中的内容仅供参考,不能替代专业人士的意见和建议。在做出任何重要…...
鸿蒙分享(二):引入zrouter路由跳转+封装
码仓库:https://gitee.com/linguanzhong/share_harmonyos 鸿蒙api:12 鸿蒙第三方库地址:OpenHarmony三方库中心仓 zrouter地址:OpenHarmony三方库中心仓 1.引入zrouter 1.打开终端界面:输入 ohpm install hzw/zrouter 2.在项目…...
欧拉角和旋转矩阵之间的转换
在实际编程实践中,特别是使用C的Eigen库时,需要掌握多种空间旋转表示之间的转换。本文将深入探讨欧拉角与旋转矩阵之间的相互转换,这是使用库时常见的操作。 首先,让我们了解欧拉角。它是指通过围绕三个基本坐标轴旋转来表示三维对…...
Typora的激活
Typora的安装、激活 图文教程 | 2024年最新Typora激活使用教程合集 Typora 激活指南(2024年最新版) 图文教程 | 2024Typora最新版免费激活使用教程(新旧版可用)...
排查bug的通用思路
⭐️前言⭐️ APP点击某个按钮没有反应/PC端执行某个操作后,响应较慢,通用的问题排查方法: 从多个角度来排查问题 🍉欢迎点赞 👍 收藏 ⭐留言评论 🍉博主将持续更新学习记录收获,友友们有任何问题可以在评…...
探秘CSS3 3D转换:打造立体网页动画与视觉效果的魔法
在现代网页设计中,CSS3 3D转换(3D Transforms)已经成为一种强大的工具,用于创建各种动态效果和视觉吸引力。本文将详细介绍CSS3 3D转换的基本概念、常见属性及其应用示例,帮助您掌握这一技术,提升网页设计的…...
Pycharm 安装两种不同版本的解释器
背景 Pycharm使用的解释器是python3.11,python3.9.x之后不支持win7;有同事需要在win7上使用python制作的exe,而了“win7环境下运行python打包exe提示找不到api-ms-win-core-path-l1-1-0.dll”。 过程 查找了一些资料,发现直接将…...
小红薯x-s算法分析最新12-06(x-s 56)(上)
目标-小红薯达人作品:aHR0cHM6Ly93d3cueGlhb2hvbmdzaHUuY29tLw 1、确定目标 打上xhr断点 发现是异步请求,同时各个参数已经生成结束了 2、进入第二个异步函数 打上断点并继续运行 发现在e这个位置也生成了,那么再继续往上找异步参数进行断…...
视频融合×室内定位×数字孪生
随着物联网技术的迅猛发展,室内定位与视频融合技术在各行各业中得到了广泛应用。不仅能够提供精确的位置信息,还能通过实时视频监控实现全方位数据的可视化。 与此同时,数字孪生等技术的兴起为智慧城市、智慧工厂等应用提供了强大支持&#…...
JMS和消息中间件:Kafka/RocketMQ
文章目录 消息传递模型使用JMS还是KafkaKafka与RocketMQ的优缺点Kafka与RocketMQ的使用场景Kafka与RocketMQ的选型指南 TPM 项目中, iflow之间使用了JMS,后端项目与数据库通信使用Kafka MQ和JMS的区别: JMS是 java 用来处理消息的一个API规范…...
FreeRTOS之ARM CR5栈结构操作示意图
FreeRTOS之ARM CR5栈结构操作示意图 1 FreeRTOS源码下载地址2 ARM CR5栈结构操作宏和接口2.1 portSAVE_CONTEXT宏2.1.1 portSAVE_CONTEXT源码2.1.2 portSAVE_CONTEXT宏操作栈结构变化示意图 2.2 portRESTORE_CONTEXT宏2.2.1 portRESTORE_CONTEXT源码2.2.2 portRESTORE_CONTEXT宏…...
【技巧】Mac上如何显示键盘和鼠标操作
在制作视频教程时,将键盘和鼠标的操作在屏幕上显示出来,会帮助观众更容易地理解。 推荐Mac上两款开源的小软件。 1. KeyCastr 这款工具从2009年至今一直在更新中。 https://github.com/keycastr/keycastr 安装的话,可以从Github上下载最…...
三种插入排序算法
目录 1.直接插入排序 直接插入排序的步骤示例 直接插入排序的特点 适用场景 2.折半插入排序 折半插入排序的基本原理 折半插入排序的实现过程 折半插入排序的时间复杂度 折半插入排序的特点 3.希尔排序 希尔排序的基本原理 希尔排序的步骤举例 希尔排序的时间复杂…...
力扣100题--移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […...
第30天:安全开发-JS 应用NodeJS 指南原型链污染Express 框架功能实现审计0
时间轴: 演示案例: 环境搭建-NodeJS-解析安装&库安装 功能实现-NodeJS-数据库&文件&执行 安全问题-NodeJS-注入&RCE&原型链 案例分析-NodeJS-CTF 题目&源码审计 开发指南-NodeJS-安全 SecGuide 项目、 环境搭建-NodeJ…...
1.使用docker 部署redis Cluster模式 集群3主3从
1.使用docker 部署redis Cluster模式 集群3主3从 1.1 先安装docker 启动docker服务,拉取redis镜像 3主3从我们要在docker启动6个容器docker run --name redis-node-1 --net host --privilegedtrue -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-…...
SAP导出表结构并保存到Excel 源码程序
SAP导出表结构并保存到Excel,方便写代码时复制粘贴 经常做接口,需要copy表结构,找到了这样一个程程,特别有用。 01. 先看结果...
李飞飞:Agent AI 多模态交互的前沿探索
发布于:2024 年 11 月 27 日 星期三 北京 #RAG #李飞飞 #Agent #多模态 #大模型 Agent AI在多模态交互方面展现出巨大潜力,通过整合各类技术,在游戏、机器人、医疗等领域广泛应用。如游戏中优化NPC行为,机器人领域实现多模态操作等。然而,其面临数据隐私、偏见、可解释性…...
算法基础学习Day2(双指针)
文章目录 1.题目2.题目解答1.快乐数题目及题目解析算法学习代码提交 2.题目2题目及题目解析算法学习代码提交 1.题目 202. 快乐数 - 力扣(LeetCode)11. 盛最多水的容器 - 力扣(LeetCode) 2.题目解答 1.快乐数 题目及题目解析 …...
信奥常考点:二叉树的构建(已知中序和 前序或后序 的情况下)
一、题目引入 这是来自CCF-GESP C七级认证 2024年9月的题目。 我们在此不解题,只把树画出来。 CCF-GESP 编程能力认证 C 七级 2024年9月份详细解析-CSDN博客 二、解题过程 我们可以根据先序遍历得出根节点是A,然后我们得到了A的左子树[B D](橙…...
《CS2》运行时提示“缺少steam_api_64.dll”文件该如何处理?“找不到steam_api.dll,无法继续执行代码”的修复方法
《CS2》游戏运行时文件丢失、损坏与系统报错处理指南 《CS2》上海 Major 淘汰赛这两天也在如火如荼的进行当中,相信有很多go学长在游戏运行时会遇到各种文件丢失、损坏以及系统报错问题,给玩家带来极大的困扰。今天,我们就来详细探讨一下《C…...
MCPTT 与BTC
MCPTT(Mission Critical Push-to-Talk)和B-TrunC(宽带集群)是两种关键通信标准,它们分别由不同的组织制定和推广。 MCPTT(Mission Critical Push-to-Talk)标准由3GPP(第三代合作伙伴…...
aardio - 汉字笔顺处理 - json转sqlite转png
本代码需要最新版 godking.conn 库,请自行下载! 如果没有安装 odbc for sqlite 驱动,可以使用 godking.conn.driver.sqlite3.install() 安装。 也可以在此下载自行安装:http://www.chengxu.online/show.asp?softid267 1、将js…...
图的遍历之DFS邻接矩阵法
本题要求实现一个函数,对给定的用邻接矩阵存储的无向无权图,以及一个顶点的编号v,打印以v为起点的一个深度优先搜索序列。 当搜索路径不唯一时,总是选取编号较小的邻接点。 本题保证输入的数据(顶点数量、起点的编号等…...
kdenlive 一个视频一左一右拼接(抖音长屏转宽屏)
参考kdenlive 剪裁_Kdenlive中的分层合成-CSDN博客 kdenlive 一个视频一左一右拼接(抖音长屏转宽屏) 按照图片的操作...
深度学习-53-AI应用实战之基于labelImg和labelme的手动标注
文章目录 1 labelImg1.1 简介1.2 安装使用1.3 文件格式1.3.1 pascalVOC格式1.3.2 yolo格式1.4 验证显示2 labelme2.1 简介2.2 安装使用2.3 labelme转换为yolo3 参考附录1 labelImg 1.1 简介 labelImg(label image)是一个开源的图像标注工具,用于创建图像标注数据集。它提供了…...
白鲸优化算法原理,白鲸算法公式,白鲸算法应用(白鲸算法测试效果,白鲸算法优化BP神经网络,白鲸算法路径优化)
目录 白鲸算法主要原理 白鲸算法主要公式 白鲸算法应用案例 白鲸算法主要原理 白鲸优化算法(Beluga Whale Optimization Algorithm,BWO)是一种基于种群的元启发式优化算法,灵感来源于白鲸的生活行为。该算法通过模拟白鲸的游泳、捕食和鲸落行为来实现模型参数的优化…...
KubeEdge、ThingsBoard 和 CnosDB:智能物联网平台的完美组合
概述 在数字化时代,物联网(IoT)正在改变我们的生活和工作方式。KubeEdge、ThingsBoard 和 CnosDB 是三个领先的开源平台,它们在物联网领域各自发挥着重要的作用,并且可以无缝集成,为用户提供强大的解决方案…...
最简单的线性回归神经网络
数据: # 线性回归 import torch import numpy as np import matplotlib.pyplot as plt# 随机种子,确保每次运行结果一致 torch.manual_seed(42)# 生成训练数据 X torch.randn(100, 3) # 100 个样本,每个样本 3 个特征 true_w torch.tenso…...