【网络原理】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.mzph.cn/web/6346.shtml

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

相关文章

力扣763. 划分字母区间

Problem: 763. 划分字母区间 文章目录 题目描述思路复杂度Code 题目描述 思路 1.创建一个名为 last 的数组&#xff0c;用于存储每个字母在字符串 s 中最后出现的位置。然后&#xff0c;获取字符串 s 的长度 len。 2.计算每个字母的最后位置&#xff1a;遍历字符串 s&#xff0…

Unity开发微信小游戏(2)分享

目录 1.概述 2.代码 3.示例 4.个人作品 1.概述 这里我们能做有两件事&#xff1a; 1&#xff09;主动发起分享 2&#xff09;监听右上角分享&#xff08;...按钮&#xff0c;发朋友圈也在这里&#xff09; API&#xff1a;官方文档 2.代码 1&#xff09;主动发起分享&…

在家连学校的服务器

在家连接学校的服务器。 Step1: 首先下载一个vscode的插件 Visual Studio Code - Code Editing. Redefined 我的服务区是ubuntu20.04&#xff0c;x64的&#xff0c;所以下载这个。 Step2: 下载到本地之后&#xff0c;想办法将这个文件拷贝到你的服务器上。 Step3: 解压该包…

U盘到底要格式化成什么格式比较好?

前言 前段时间有小伙伴问我&#xff1a;U盘为啥无法粘贴超过4GB的压缩包。 相信这个问题很多人都会遇到&#xff0c;无论是压缩包、镜像文件还是电影&#xff0c;都会有超过4GB的时候。 如果文件超过了4GB&#xff0c;那么就会小伙伴遇到电脑提示&#xff1a;无法粘贴超过4G…

基于Springboot的校园食堂订餐系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园食堂订餐系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

R语言数据探索和分析7-使用随机森林模型对中国GDP及其影响因素分析

一、研究背景和意义 国内生产总值&#xff08;GDP&#xff09;是宏观经济领域中最为关注的经济统计数据之一&#xff0c;它反映了一个国家或地区在一定时期内所创造的所有最终商品和服务的总价值。GDP的增长率不仅仅是一个国家经济健康状况的关键指标&#xff0c;还直接关系到…

服务器数据恢复—异常断电导致RAID模块故障的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌ProLiant DL380系列服务器&#xff0c;服务器中有一组由6块SAS硬盘组建的RAID5阵列&#xff0c;WINDOWS SERVER操作系统&#xff0c;作为企业内部文件服务器使用。 服务器故障&#xff1a; 机房供电几次意外中断&#xff0c;服务器出现故…

AI代理架构的发展:从单一到多代理系统的演进及其影响分析

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

数据结构与算法---线性表

线性表 1.顺序表 需求分析 /*创建顺序表具体功能&#xff1a;初始化顺序表销毁顺序表获取顺序表元素个数输出顺序表中的内容自动扩容增 --- 插入数据&#xff08;包含了尾部添加功能&#xff09;删 --- 删除数据&#xff08;包含了尾部删除功能&#xff09;改 --- 修改数据查…

Android使用kts上传aar到JitPack仓库

Android使用kts上传aar到JitPack 之前做过sdk开发&#xff0c;需要将仓库上传到maven、JitPack或JCenter,但是JCenter已停止维护&#xff0c;本文是讲解上传到JitPack的方式,使用KTS语法&#xff0c;记录使用过程中遇到的一些坑. 1.创建项目(library方式) 由于之前用鸿神的w…

外网禅道配置

exportfs -avrf 修改代码&#xff0c;避免启动太慢&#xff1a;vi /opt/zbox/bin/zbox.php 启动和停止 /opt/zbox/zbox start /opt/zbox/zbox stop

YOLOv5手势物体识别(附代码)

之前是做的yolov3手势物体识别&#xff0c;最近几天我将该项目进行了重新的整理和升级&#xff0c;实现了yolov5手势物体识别&#xff0c;同时为了方便更多的人直接拿来应用&#xff0c;我生成了支持windows系统的应用小程序&#xff0c;即便你电脑上没有安装pytorch,没有安装c…

4 Spring AOP

目录 AOP 简介 传统开发模式 先来看一个需求 解决方案 AOP 图示 Spring 启用 AspectJ 基于 xml 配置 创建 pom.xml 创建 UserService 借口和 UserServiceImpl实现类 创建 LogAdvice 日志通知 创建 log4j.properties 重点&#xff1a;创建 spring-context-xml.xml 配…

MYSQL从入门到精通(二)

1、MYSQL高级概述 【1】架构概述 【2】索引优化 【3】查询截取 【4】mysql锁机制 【5】主从复制 2、MYSQL概述 【1】mysql内核 【2】sql优化工程师 【3】mysql服务器的优化 【4】各种参数常量设定 【5】查询语句优化 【6】主从复制 【7】软硬件升级 【8】容灾百分 【9】sql编…

使用Neo4j和Langchain创建知识图谱

使用Neo4j和Langchain创建知识图谱 知识图谱是组织和整合信息的强大工具。通过使用实体作为节点和关系作为边缘&#xff0c;它们提供了一种系统的知识表示方法。这种有条理的表示有利于简化查询、分析和推理&#xff0c;使知识图在搜索引擎、推荐系统、自然语言处理和人工智能…

从0开始学习制作一个微信小程序 学习部分(6)组件与事件绑定

系列文章目录 学习篇第一篇我们讲了编译器下载&#xff0c;项目、环境建立、文件说明与简单操作&#xff1a;第一篇链接 第二、三篇分析了几个重要的配置json文件&#xff0c;是用于对小程序进行的切换页面、改变图标、控制是否能被搜索到等的操作第二篇链接、第三篇链接 第四…

Windows设置Redis为开机自启动

前言 Redis作为当前最常用的当前缓存技术&#xff0c;基本上Web应用中都有使用。所以&#xff0c;每次我们在本地启动项目前&#xff0c;都必须将Redis服务端启动&#xff0c;否则项目就会启动失败。但是&#xff0c;每次都要去启动Redis就很麻烦&#xff0c;有没有办法做到开…

Python爬虫--爬取糗事百科段子

爬取糗事百科段子&#xff1a; 段子在 <div class"content"> 里面的 <span> 标签里面 不过这里有个坑&#xff0c;div 标签跟 span 标签 之间有很多空行 普通 .*? 是匹配不了的&#xff0c;需要使用模式修饰符 S S 的意思 让 .(点) 匹配&#xff0c…

吴恩达2022机器学习专项课程(一)正则化(正则化成本函数正则化线性回归正则化逻辑回归)

目录 一.正则化1.1 正则化的好处1.2 正则化的实现方式 二.正则化改进线性回归的成本函数2.1 正则化后的成本函数的意义2.2 λ参数的作用2.3 不同λ对算法的影响2.4 为什么参数b没有正则化项 三.正则化线性回归的梯度下降3.1 为什么正则化可以在梯度下降迭代中减小w3.2 导数的计…

机器学习笔记-18

异常检测问题 异常检测虽然主要用于无监督学习问题上&#xff0c;但是和监督学习问题很相似。 异常检测(Anomaly Detection)&#xff1a;给定正确样本集{ x ( 1 ) , x ( 2 ) . . . x ( n ) x^{(1)},x^{(2)}...x^{(n)} x(1),x(2)...x(n)}&#xff0c;记新样本即要检测的样本为…