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

文章目录

    • 一、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);//把转换字符串ipsocket.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.rhkb.cn/news/317755.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java案例-读取xml文件

需求 导入依赖 <dependencies><!-- dom4j --><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency> </dependencies>代码 SAXReader saxReade…

Ansible自动化

Ansible自动化 自动化的需求&#xff1a; 1. 在什么样的场景下需要自动化&#xff1f; 批量化的工作&#xff1a; 装软件包、配置服务、升级、下发文件… 2. 为什么在自动化工具中选择ansible&#xff1f; 对比shell脚本&#xff1a; 相对于用shell的脚本来实现自动化&#x…

跨平台桌面客户端开发框架

跨平台桌面客户端开发框架允许开发者创建能够在多个操作系统上运行的桌面应用程序。以下是一些流行的跨平台桌面客户端开发框架。这些框架各有优势&#xff0c;选择哪个框架取决于项目需求、团队的技术栈以及对特定特性的偏好。 1.Electron &#xff1a; 使用JavaScript, HTML…

uniapp视频播放器(h5+app)

关于uniapp视频播放器遇到的一些问题&#xff0c;mark下。 中途遇到了很多问题&#xff0c;如果有相同的伙伴遇到了类似的&#xff0c;欢迎交流 官方的video播放器在app上不友好&#xff0c;有以下功能不支持。 loadedmetadata、controlstoggle不支持导致只能手写控制层。 不…

python学习之词云图片生成

代码实现 import jieba import wordcloudf open("D:/Pythonstudy/data/平凡的世界.txt", "r", encoding"utf-8") t f.read() print(t) f.close() ls jieba.lcut(t) txt " ".join(ls)w wordcloud.WordCloud(font_path"D:/cc…

【webrtc】MessageHandler 8: 基于线程的消息处理:处理音频输入输出断开

m98代码,看起来m114 去掉了MessageHandler :音频的录制和播放 都使用了on message,但只是用来通知并处理流的断开的。AAudioRecorder AAudioRecorder 处理流断开 OnErrorCallback :有可能 错误回调是别处来的,是其他线程, 但是这个错误的处理要再自己的线程执行: 音频播…

Docker:centos7安装docker

官网&#xff1a;https://www.docker.com/官网 文档地址 - 确认centos7及其以上的版本 查看当前系统版本 cat /etc/redhat-release- 卸载旧版本 依照官网执行 - yum安装gcc相关 yum -y install gccyum -y install gcc-c- 安装需要的软件包 yum install -y yum-utils- 设置s…

Flask简介

Flask简介 安装概述使用PyCharm创建一个Flask程序 Flask程序的基本结构初始化路由和视图函数启动服务器请求-响应循环 安装 概述 Flask算是小型框架&#xff0c;小到可以称为“微框架”。Flask 非常小&#xff0c;因此你一旦能够熟练使用它&#xff0c;很可能就能读懂它所有的…

小米笔记本文件夹里是空白怎么办?分享原因及解决方案

随着科技的不断发展&#xff0c;笔记本电脑已成为我们日常生活和工作中不可或缺的一部分。而小米&#xff0c;作为知名的科技品牌&#xff0c;其笔记本产品凭借其出色的性能和合理的价格&#xff0c;受到了广大用户的喜爱。然而&#xff0c;在使用过程中&#xff0c;有时我们可…

Android AOSP探索之Ubantu下Toolbox的安装

文章目录 概述安装Toolbox解决运行的问题 概述 由于最近需要进军android的framework,所以需要工具的支持&#xff0c;之前听说江湖上都流传source insight,我去弄了一个破解版&#xff0c;功能确实强大&#xff0c;但是作为多年android开发的我习惯使用android studio。虽然使…

Delta lake with Java--利用spark sql操作数据2

上一篇文章尝试了建库&#xff0c;建表&#xff0c;插入数据&#xff0c;还差删除和更新&#xff0c;所以在这篇文章补充一下&#xff0c;代码很简单&#xff0c;具体如下&#xff1a; import org.apache.spark.sql.SaveMode; import org.apache.spark.sql.SparkSession;publi…

网盘——分享文件——界面设计

本文主要讲解网盘中文件操作的分享文件部分&#xff0c;主要包含两方面的设计&#xff1a;分享文件界面设计和逻辑设计。 1、界面设计 1.1、添加一个类 1.2、引入头文件 #include <QPushButton> #include <QHBoxLayout> #include <QVBoxLayout> #include …

C++ 矩阵

目录 了解矩阵的数学原理&#xff08;大学线性代数&#xff09; 矩阵及转置矩阵 矩阵乘法 矩阵快速幂 相伴矩阵模板 [相伴矩阵,快速矩阵幂]CSES1722 Fibonacci Numbers 了解矩阵的数学原理&#xff08;大学线性代数&#xff09; 矩阵及转置矩阵 这里A就是一个矩阵&…

C++中的异常

目录 1.C语言传统的处理错误的方式 2. C异常概念 3. 异常的使用 3.1 异常的抛出和捕获 3.2 异常的重新抛出 3.3异常安全 3.4 异常规范 4.自定义异常体系 5.C标准库的异常体系 6.异常的优缺点 7.func&#xff08;&#xff09; throw();的方式规范化 1.C语言传统的处理…

如何判断第三方软件测试公司是否具有资质

在软件开发的过程中&#xff0c;软件测试是确保软件质量、稳定性和用户体验的关键环节。许多企业选择将软件测试工作交给专业的第三方软件测试公司来完成&#xff0c;以确保测试的准确性和公正性。但是&#xff0c;如何判断一个第三方软件测试公司是否具有资质呢&#xff1f;以…

idea中使用GlassFish服务器启动项目

idea中使用GlassFish服务器进行测试 1.项目背景 当前在研究openMDM项目, 不过该项目不是springboot项目, 并且是使用GlassFish进行war部署的, 但是需要在idea中进行项目的二次开发,故需要进行idea启动项目并且进行开发和调试 2.GlassFish是什么 GlassFish是一个web服务器, …

基于ssm+vue+Mysql的药源购物网站

开发语言&#xff1a;Java框架&#xff1a;ssmJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.…

使用Gitbook生成电子书

背景 《Google工程实践文档》相对原文Google’s Engineering Practices documentation &#xff0c;部分内容过时了。需要更新中文版&#xff0c;并使用Gitbook把Markdown文件转换成对应的PDF电子书。   上一次生成PDF电子书是5年前&#xff0c;当时生成电子书的环境早已不在…

东莞酷得 遥控小车电子方案技术关键要点

遥控玩具车的软件技术开发是一个综合性的过程&#xff0c;涉及到无线通信技术、硬件设计、软件编程、用户交互设计等多个方面。开发者需要具备跨学科的知识和技能&#xff0c;以确保最终产品的性能和用户体验。 遥控玩具车的软件技术开发涉及以下几个关键要点&#xff1a; 1、…

HTTP/1.1、HTTP/2、HTTP/3 的演变

HTTP/1.1、HTTP/2、HTTP/3 的演变 HTTP/1.1 相比 HTTP/1.0 提高了什么性能&#xff1f;HTTP/2 做了什么优化&#xff1f;HTTP/3 做了哪些优化&#xff1f; HTTP/1.1 相比 HTTP/1.0 提高了什么性能&#xff1f; HTTP/1.1 相比 HTTP/1.0 性能上的改进&#xff1a; 使用长连接的…