【网络原理】UDP协议 | UDP报文格式 | 校验和 | UDP的特点 | 应用层的自定义格式

news2024/11/24 20:13:03

文章目录

    • 一、UDP协议
        • 1.UDP的传输流程
            • 发送方
            • 接收方
        • 2.UDP协议报文格式:
          • 长度受限
          • 校验和
            • 如何校验:
            • CRC算法:循环冗余算法
            • md5算法:
        • 2.UDP的特点
    • 二、开发中常见的自定义格式
            • 1.xml(古老)
            • 2.json(最流行)
            • 3.protobuffer(pb)
            • 端口号


一、UDP协议

1.UDP的传输流程
发送方

1.应用层:

​ QQ应用程序,把用户A输入的“nb woc”,打包成一个应用层的数据报(这个数据报的格式,只有qq的程序员知道)

假设按照这样的格式:

源qq、目的qq、发送时间、发送内容
123456,654321,2024-04-25 12:00,nb woc

这四个字段使用,来分割。这里就构成了一个简单的应用层数据报(字符串拼贴)。

​ 上述描述的规则,就是此处我们约定的应用层协议。应用层协议中,具体用几个字段,字段的顺序,什么分隔符都可以由程序员根据具体的场景和具体的需求来自主决定。

打包完毕之后,就可以把应用层数据报,通过操作系统的API,把数据交给传输层

2.传输层

对刚才的应用层数据,再次进行打包,变成传输层数据报。

本质上还是”字符串拼接“,在刚才的应用层数据基础上,拼贴传输层的报头。

  • 传输层的典型协议:TCP, UDP

以UDP为例:一个数据报 = 报头+载荷

UDP报头中最关键的信息就是“源端口”和“目的端口”

在这里插入图片描述

进行封装的过程,就是给数据添加更多的“辅助信息”

就相当于快递运送的时候,会进行多次包装(塑封、外层包装、快递盒等等),就可以在包装外面贴上标签信息。同时,打包也可以保护要传输的内容不被破坏。

打包成传输层数据报之后,这个数据又会进一步交给网络层。

3.网络层

在网络层会再次进行封装,打包成网络层数据报,然后交给数据链路层。

IP报头中,最重要的属性是源IP和目的IP

在这里插入图片描述

4.数据链路层

会再次打包成以太网的数据报,交给物理层进行传输。

在这里插入图片描述

以太网的报头中,最主要的信息就是mac地址 和 目标mac地址。

5.物理层

把上述的数据,转换成二进制的01序列。通过光信号/电信号进行传输。

  • 数据的封装:从上层协议到下层协议,层层给数据添加报头。一方面“贴上”辅助信息,来决定后续怎么传输数据。另一方面,可以通过报头来对传输的数据进行校验。就能及时的发现传输过程中的问题。

数据发送出去之后,由于A和B不是通过网线直连的,中间还要经过很多交换机/路由器设备进行转发。

接收方

当数据到达B之后,B就要针对上述数据进行“分用”

对数据报进行层层解析 ->拆快递!

1.物理层

​ 拿到的光电信号转换成二进制数据,得到以太网数据报。交给数据链路层的协议来处理。

2.数据链路层

​ 通过以太网协议,针对以太网数据报进行解析。解析出报头和报尾,以及中间的载荷。把载荷部分交给网络层协议来处理。

3.网络层

​ 通过IP协议,对网络层数据报进行解析,去掉报头,拿到载荷。再进一步把载荷数据交给传输层。

4.传输层

​ 通过UDP协议,针对这个数据报进行解析,去掉报头。把载荷信息交给应用层。

5.应用层

​ 根据端口号,把数据交给QQ应用程序。QQ拿到数据进行解析,解析的方式就是QQ程序员自定义的应用层协议。

取出来nb woc,显示到页面上

实际上,数据报在网络中间还会经历一定的转发过程。如果经过路由器,就会封装分用到网络层。路由器解析到网络层,拿到IP地址后,决定下一步如何进行传输。在下一步传输的时候,又会重新经过网络层、数据链路层和物理层的封装。

如果经过的是交换机,就会封装分用到数据链路层。拿到mac地址来进行下一步的判断。

2.UDP协议报文格式:

在这里插入图片描述

  • 源IP,目标IP不在传输层,在网络层的IP协议里
长度受限
  • UDP报文长度:2个字节,16位表示的数据(0 ~ 65535 ->64kb)一个UDP数据报最长是64kb.传输的大小有明确的限制。而TCP没有包大小的限制
校验和

​ 本质上也是一个字符串,体积比原始数据更小,又是通过原始的数据生成的。如果原始数据相同,得到的校验和就一定相同。反之,校验和相同,原始数据大概率相同(理论上会有不同情况,概率非常低,可以忽略不计)

网络传输中,由于一些外部干扰,就有可能出现数据传输出错的情况。所以需要有办法能够检测识别出出错的数据。这个手段就是校验和

如何校验:

1.发送方,把要发送的数据整理好(data1),通过一定的算法,计算出校验和checksum1.

2.发送方把data1和checksum1一起通过网络发送出去

3.接收方收到数据,收到的数据称为data2(数据就可能和data1不一样了),也收到了checksum1

4.接收方根据data2,用相同的算法重新计算校验和,得到checksum2

5.对比checksum1==checksum2 ? 大概率相同 :不同 。

  • UDP在计算校验和时,采用的是CRC算法
CRC算法:循环冗余算法

把当前要计算校验和的数据,每个字节进行累加。把结果保存在两个字节的变量中。

md5算法:

1.定长。无论原始数据多长,计算的md5,都是固定长度。

2.分散。给定两个原始数据,哪怕绝大部分内容都一样,只要其中一个字节不同,得到的md5的值差异都会很大。

因此,md5也适合作为hash算法

3.不可逆。算容易,还原很难。

2.UDP的特点

1.无连接。UDP协议本身不会存储对端的信息,要在发送数据时,显示指定要传输给谁

            DatagramPacket requestPacket = new DatagramPacket(
                    request.getBytes(), request.getBytes().length,
                    InetAddress.getByName(serverIp), serverPort);//把转换字符串ip
            socket.send(requestPacket);

2.不可靠,无法得知是否发送成功

3.面向数据报 ,以数据报为单位进行传输。DatagramPacket

4.全双工。通过一个socket,既可以send,也可以receive。

            socket.send(requestPacket);
            //3.尝试读取服务器返回的响应
            DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(responsePacket);

二、开发中常见的自定义格式

​ 应用层和程序员接触最密切,在应用层中,很多时候都是程序员“自定义”应用层协议的。而协议就是一种约定,程序员在代码中规定好,数据如何进行传输

自定义协议:1.根据需求,明确要传输的信息。2.约定好信息按照什么格式来组织

1.xml(古老)

通过标签来组织数据,提高数据的可读性

请求:  
<request>   
	<userId>1000</userId>
    <position>100,30</position>
</request>

缺点:标签写起来繁琐,传输的时候也占用更多网络带宽

2.json(最流行)

当下更流行的数据组织格式

  • 键值对结构,键固定是字符串类型。值可以是数字、字符串、json、数组等待
{
	userId:"1000",
	position:"100,30",
}

​ 优点:可读性好,更简洁

​ 缺点:同样在网络传输中,消耗额外的带宽(需要把key也进行传输)。

除了对于性能要求非常高的场景不使用json,其余的很多地方都可以使用。

开发效率比执行效率更重要

3.protobuffer(pb)

protobuffer使用二进制的方式来组织数据。并且可以保证带宽占用最低。

相当于把要传递的信息按照二进制形式进行了压缩

优点:占用带宽最低,传输效率最高。适应于对性能要求比较高的场景

缺点:二进制格式,可读性不好,降低开发效率

  • “现成”的应用层协议:HTTP协议(超文本传输协议)
端口号

​ 写一个服务器,必须手动指定一个端口号。通过端口来区分当前这个主机上的不同应用程序

​ 写一个客户端,客户端在通信的时候也会有一个端口号,是系统自动分配的

端口号在传输层中,固定占2个字节。表示的范围:0~65535。

1 ~1023 称为“知名端口号”:给一些比较”知名“的服务器,预留的位置

22:ssh服务器端口号(ssh协议是用来登录远程主机的)

80:http服务器的端口号

443:https服务器的端口号
1024 ~ 65535 :普通端口号


点击移步博客主页,欢迎光临~

偷cyk的图

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

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

相关文章

头歌:Spark任务提交

第1关&#xff1a;spark-submit提交 任务描述 相关知识 spark-submit参数 计算圆周率 编程要求 测试说明 任务描述 本关任务&#xff1a;学会将程序提交到集群上执行。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.了解spark-submit的参数。2.学会提交Spar…

双目深度估计原理立体视觉

双目深度估计原理&立体视觉 0. 写在前面1. 双目估计的大致步骤2. 理想双目系统的深度估计公式推导3. 双目标定公式推导4. 极线校正理论推导 0. 写在前面 双目深度估计是通过两个相机的对同一个点的视差来得到给该点的深度。 标准系统的双目深度估计的公式推导需要满足:1)两…

按键的软件消抖

1.当出现物理情况比如单片机不小心摔了会发生灯亮的情况&#xff0c;所以我们得增加个延迟函数 2.这个错误是缺少头文件#include <intrins.h> 3. #include "reg52.h" #include <intrins.h>sbit key2 P2^0; sbit key1 P2^1; sbit ledone P3^7;voi…

稳扎稳打 部署丝滑 开源即时通讯(IM)项目OpenIM源码部署流程(linux windows mac)

背景 OpenIM包含多个关键组件&#xff0c;每个都是系统功能必不可少的一部分。具体来说&#xff0c;MongoDB 用于持久化存储&#xff1b;Redis 用作缓存&#xff1b;Kafka 用于消息队列&#xff1b;Zookeeper 用于服务发现&#xff1b;Minio 用于对象存储。这些组件的众多可能会…

用OpenCV先去除边框线,以提升OCR准确率

在OpenCV的魔力下&#xff0c;我们如魔法师般巧妙地抹去表格的边框线&#xff0c;让文字如诗如画地跃然纸上。 首先&#xff0c;我们挥动魔杖&#xff0c;将五彩斑斓的图像转化为单一的灰度世界&#xff0c;如同将一幅绚丽的油画化为水墨画&#xff0c;通过cv2.cvtColor()函数的…

【多级缓存】多级缓存OpenResty,Canal,nginx本地缓存

多级缓存 安装OpenRestyOpenResty入门OpenResty获取请求参数OpenResty向tomcat服务器发送请求 在nginx与tomcat端之间添加redis缓存Redis本地缓存缓存同步缓存同步策略基于Canal的异步通知安装Canal Canal客户端 安装OpenResty OpenResty是一个基于 Nginx的高性能 Web 平台&am…

[iOS]使用CocoaPods发布私有库

1.创建私有 Spec 仓库 首先&#xff0c;需要一个私有的 Git 仓库来存放你的 Podspec 文件&#xff0c;这个仓库用于索引你所有的私有 Pods。 在 GitHub 或其他 Git 服务上创建一个新的私有仓库&#xff0c;例如&#xff0c;名为 PrivatePodSpecs。克隆这个仓库到本地&#xf…

使用STM32CubeMX对STM32F4进行串口配置

目录 1. 配置1.1 Pin脚1.2 RCC开启外部晶振1.3 时钟1.4 串口配置 2. 代码2.1 默认生成代码2.1 开启串口中断函数2.3 接收中断2.4 接收回调函数2.5 增加Printf 的使用 1. 配置 1.1 Pin脚 1.2 RCC开启外部晶振 1.3 时钟 外部使用8MHz晶振 开启内部16MHz晶振 使用锁相环 开启最高…

机器学习:深入解析SVM的核心概念(问题与解答篇)【四、软间隔与正则化】

软间隔与正则化 问题一&#xff1a;优化目标函数是如何得到的&#xff1f;得到的过程是怎样的&#xff1f;问题二&#xff1a;拉格朗日乘子法计算详细过程问题三&#xff1a;KKT条件求解过程问题四&#xff1a;结构风险最小化&#xff08;SRM&#xff09;的原理 在前面的讨论中…

针孔相机模型原理坐标系辨析内参标定流程内参变换

针孔相机的内参标定 针孔相机原理真空相机模型图片的伸缩和裁剪变换 内参标定———非线性优化张正定标定详细原理(含公式推导)通过多张棋盘格照片完成相机的内参标定流程(C代码)其他工具箱 相机分为短焦镜头和长焦镜头&#xff0c;短焦镜头看到的视野更广阔&#xff0c;同样距…

全新突破:「Paraverse平行云」实现3D/XR企业级应用全面接入Apple Vision Pro

在前不久举行的GTC开发者大会上&#xff0c;英伟达引领行业风向&#xff0c;宣布其Omniverse平台能够助力企业将3D/XR应用流畅传输至Apple Vision Pro混合现实头显。在英伟达与苹果这两大科技巨头的合作下,此举标志着3D/XR技术迈向新纪元的关键一步。「Paraverse平行云」实时云…

JavaScript中的扩展操作符作用是什么,有什么含义?

在 JavaScript 中&#xff0c;扩展操作符允许一个表达式在某些地方展开成多个元素。这个特性在 ES2015 (也叫做 ES6) 中被引入到 JavaScript 语言中&#xff0c;并广泛用于数组和对象。在您的代码示例中&#xff0c;它被用于对象。 对象中的扩展操作符 在对象字面量中使用扩展…

【知识学习/复习】损失函数篇,包含理解应用与分类:回归、分类、排序、生成等任务

损失函数总结 一、损失函数理解二、不同任务的损失函数的应用1.图像分类2.目标检测3.语义分割4.自然语言处理&#xff08;NLP&#xff09;5.图神经网络&#xff08;GNN&#xff09;6.生成式网络 三、损失函数1. 回归任务损失函数常见损失函数IoU系列损失函数1. IoU损失函数&…

pyQt5 和 Qt Designer 实现登录注册案例

Qt Designer 设计页面: 通过 PyQt5 手写 1. 先引入用到的库 from PyQt5.QtWidgets import * import sys 2. 创建应用,窗口, 设置窗口 # 创建应用 app QApplication(sys.argv) # 创建窗口 w QWidget()# 设置窗口标题 w.setWindowTitle("注册登录")# 展示 w.sho…

ssm091校园自助洗衣系统的分析与设计+jsp

校园自助洗衣系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对校园洗衣信息管理混乱&#xff0c;出…

vue2 实现echarts图表进入可视区域后再加载动画,以及 使用了resize之后,动画失效问题解决

Intersection Observer API 是一个现代的浏览器 API&#xff0c;用于监测一个或多个目标元素与其祖先元素或视窗&#xff08;viewport&#xff09;之间的交叉状态&#xff08;intersection&#xff09;的变化。它可以有效地监听元素是否进入或离开可视区域&#xff0c;从而实现…

Dokcer容器分布式搭建LNMP+wordpress论坛

目录 引言 一、架构环境 二、搭建容器 &#xff08;一&#xff09;自定义网络 &#xff08;二&#xff09;搭建nginx容器 1.文件准备 2.查看与编辑文件 3.生成镜像 4.创建容器 &#xff08;三&#xff09;搭建MySQL容器 1.文件准备 2.查看与编辑文件 3.生成镜像 …

2013NOIP普及组真题 4. 车站分级

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1964 核心思想&#xff1a; 1、原文中提到 “如果这趟车次停靠了火车站 x&#xff0c;则始发站、终点站之间所有级别大于等于火车站 x 的都必须停靠”&#xff0c;如果设停靠站为A&…

汽车信息安全入门总结(2)

目录 1.引入 2.汽车信息安全技术 3.密码学基础知识 4.小结 1.引入 上篇汽车信息安全入门总结(1)-CSDN博客主要讲述了汽车信息安全应该关注的点&#xff0c;以及相关法规和标准&#xff0c;限于篇幅&#xff0c;继续聊信息安全相关技术以及需要掌握的密码学基础知识。 2.汽…

SpringCloud学习笔记(一)微服务介绍、服务拆分和RestTemplate远程调用、Eureka注册中心

文章目录 1 认识微服务1.1 单体架构1.2 分布式架构1.3 微服务1.4 SpringCloud1.5 总结 2 服务拆分与远程调用2.1 服务拆分原则2.2 服务拆分示例2.2.1 搭建项目2.2.2 创建数据库和表2.2.3 实现远程调用2.2.3.1 需求描述2.2.3.2 注册RestTemplate2.2.3.3 实现远程调用 2.2.4 提供…