javaEE 初阶 — UDP 协议

news2024/11/26 18:52:40

文章目录

  • UDP 协议
  • 1. UDP协议报文结构
    • 1.1 一个 UDP 数据报能传输的最大数据
    • 1.2 校验和
    • 1.3 生成校验和的算法

UDP 协议

1. UDP协议报文结构




16位UDP长度,表示整个数据报(UDP首部+UDP数据)的最大长度,如果校验和出错,就会直接丢弃。

上述的这张图是任何一个计算机网络教科书上都会有的,而且都是这么画的。
但是实际上这么画的不够严谨。(为了排版方便,变形了)

更严谨的是下面的这张图。



在通过 UDP socket (也就是 send 方法拿来的数据)的基础上,在前面拼装上几个字节的报头。
(这里的拼接相当于字符串拼接,只不过此处的是二进制的,不是文本的)

UDP 报头里包含了一些携带了重要信息的特定属性,不同的协议,功能不同,报头中带有的属性信息就不同。
对于 UDP 来说,报头一共就是 8 个字节,分成 4 个部分(每个部分 2 个字节)

1.1 一个 UDP 数据报能传输的最大数据


UDP 报文长度也是 2 个字节表示的,2 个字节表示的范围是 0 ~ 655635,换算单位是64KB
也就是说,一个 UDP 数据报最大只能传输 64KB 的数据。

这个 64KB 的大小当然是非常小的,因为随便拍一张照片都是好几个 MB 的大小。

这个时候如果应用层数据报超过了 64KB 怎么办?

这里涉及到两种解决的办法。

1、需要在应用层里,通过代码的方式针对应用层数据报进行手动的分包,拆分成多个包,通过多个 UDP 数据报进行传输。
(也就是说,本来只需要 send 一次,现在需要 send 多次了)

这就好比,搬家的时候由于家具比较多,一辆车装不下,就会多叫几辆。
但是这里会多出更多的像约车,装车,卸货等一些过程,所以会比较麻烦。


2、不使用 UDP 改为 TCP (TCP 没有这样的限制)

就好比搬家的时候,一次叫一辆大点的货车,一次运输完成。

哪种方案更好?

如果使用的是第一种方案,就需要写很多的代码,还需要进行很多的测试和处理很多的 bug。
这个时候,工作量就变多了,工作时间就变成长了,幸福程度也就变低了。

所以更推荐第二种使用 TCP 的方案。

1.2 校验和


校验和的作用是验证传输的数据是否是正确的

在网络传输的过程中可能会受到一些干扰,在这些干扰下就可能会出现 “比特翻转” 的情况。

也就是 二进制位的 1 变为 0,0 变为了 1。

网络传输的本质上就是光信号/电信号,这些可能会受到一些物理环境的影响,比如电场、磁场、高能射线。

如果一个数据是 1111 0000,出现了 “比特翻转” 后就会变成 0000 1111。而一旦数据改变了,对于数据的含义可能就是致命的。

如果某个程序中经常使用 1 表示某个功能开启,0 表示关闭,本来网络数据报是想开启功能,结果翻转后,导致变成了关闭了。

这样的现象是客观存在的,是不可避免的,能做的就是及时识别出当前的数据是否有问题。

因此就引入了校验和来进行鉴别。

校验和会针对数据的内容进行一系列的数学运算,得到一个比较短的结果(比如 2 字节)

如果数据的内容一定,得到的校验和结果就一定;如果数据改变了,得到的校验和也就变了。

举一个例子,想有一个发送方和一个接收方,发送方要向接收方发送一条 hello 的数据。



接收方得到数据后需要重新计算一遍校验和,看看得到的结果和发送方发来的结果是不是一样的。
如果一样,说明数据传输没问题,如果不一样,说明数据已经出错。

如果数据内容一定,按照同样的算法得到的校验和也是 0xaabb。

如果数据出错了,接收方得到的数据是我草,那么此时重新计算校验和就会与得到的校验和不一样。
接收方得到的校验和是 0xaabb,重新计算校验和得到的可能是 0xbbaa,此时说明数据传输就出错了。


值得注意的地方

如果内容相同,得到的校验和一定相同;校验和相同,原始内容不一定相同。(存在小概率时间)
但是在实际的工程实践中,这种情况忽略不记了,一般认为,校验和相同,原始内容也想同

因为毕竟 计算得到的校验和和之前得到的校验和一样 的情况出现的概率极低,也就忽略不记了。

比方说发送 hello 的校验和是 0xaabb,而发送 我草 的校验和也是 0xaabb。(好像不太可能会出现这种情况)


校验和一般会和内容挂钩,基于数据内容算出来的校验和,只要内容一变,就能够及时发现。

比如张三去买菜,一共要买 鸡蛋、西红柿、黄瓜、小葱这四种。

一共四样,这实际上也是一个校验和,可以随时根据这四个字来验证当前买菜的状态,但这不是一个基于内容的校验和。
如果张三买的时候有一样买错了,虽然内容不一样了,但是一共还是四样,是无法及时发现的。

1.3 生成校验和的算法


针对网络传输的数据来说,生成校验和的算法有很多种,下面介绍几个比较知名的:

1、CRC:循环冗余校验

比较简单粗暴,把数据上的每个字节循环往上累加。如果累加溢出了,高位就不要了。
这种算法虽然比较好算,但是校验结果不是特别理想。

万一数据同时变动了两个比特位。(前一个字节少1,后一个字节多1这种),就会出现内容变了, 但是 CRC 没变这样的情况。


2、MD5 不是简单相加,有一系列的公式来进行更复杂的数学运算。

MD5 算法特点:

1、定长。无论原始数据多长,得到 MD5 长度都是固定长度(有4字节版本,也有8字节版本)
2、冲突概率很小。原始数据哪怕只变动一个地方,算出来 MD5 值都会差别很大。(让 MD5 结果更分散了)
3、不可逆。通过原始数据计算 MD5 很容易,通过 MD5 还原原始数据(找到哪个数据生成了这个 MD5的)很难。


3、SHA1 和 MD5 的思路是非常相似的。

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

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

相关文章

计算机网络之http02| HTTPS HTTP1.1的优化

post与get请求的区别 get 是获取资源,Post是向指定URI提交资源,相关信息放在body里 2.http有哪些优点 (1)简单 报文只有报文首部和报文主体,易于理解 (2)灵活易拓展 URI相应码、首部字段都没有…

ORB-SLAM2编译、安装等问题汇总大全(Ubuntu20.04、eigen3、pangolin0.5、opencv3.4.10)

ORB-SLAM2编译、安装等问题汇总大全(Ubuntu20.04、eigen3、pangolin0.5、opencv3.4.10) 1:环境说明: 使用的Linux发行版本为Ubuntu 20.04 SLAM2下载地址为:git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2 2&a…

Element UI框架学习篇(二)

Element UI框架学习篇(二) 1 整体布局 1.1 前提说明 el-container标签里面的标签默认是从左往右排列,若想要从上往下排列,只需要写el-header或者el-footer就行了 <el-container>&#xff1a;外层容器 <el-header>&#xff1a;顶栏容器。 <el-aside>&#…

Android框架源码分析——从设计模式角度看 Retrofit 核心源码

Android框架源码分析——从设计模式角度看 Retrofit 核心源码 Retrofit中用到了许多常见的设计模式&#xff1a;代理模式、外观模式、构建者模式等。我们将从这三种设计模式入手&#xff0c;分析 Retrofit2 的核心源码。 1. 宏观 Retrofit 是一个外观模式的设计 外观模式&am…

Intel处理器分页机制

分页模式 Intel 64位处理器支持3种分页模式&#xff1a; 32-bit分页PAE分页IA-32e分页 32-bit分页 32-bit分页模式支持两种页面大小&#xff1a;4KB以及4MB。 4KB页面的线性地址转换 4MB页面的线性地址转换 PAE分页模式 PAE分页模式支持两种页面大小&#xff1a;4KB以及…

Java 验证二叉搜索树

验证二叉搜索树中等给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下&#xff1a;节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1&…

ChatGPT注册流程攻略,含验证码接收(图文步骤)

本文给大家分享一下我成功注册的流程&#xff01; 其实方法都类似&#xff0c;若无海外手机号码可用接验证码的平台&#xff08;ps&#xff1a;我之前使用的是SMS-Activate&#xff09; 必要准备 能够科学上网&#xff08;并且全局模式&#xff09; 能确认登录的电子邮箱&…

ffmpeg硬解码与软解码的压测对比

文章目录ffmpeg硬解码与软解码的压测一、基本知识二、压测实验1. 实验条件及工具说明2. 压测脚本3. 实验数据结果ffmpeg硬解码与软解码的压测 一、基本知识 本文基于intel集显进行压测 软解码&#xff1a;cpu对视频进行解码硬解码&#xff1a;显卡或者多媒体处理芯片对视频进…

Python编程自动化办公案例(1)

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.使用库讲解 1.xlrd 2.xlwt 二.主要案例 1.批量合并 模板如下&#xf…

Python 如何快速搭建环境?

Python可应用于多平台包括 Linux 和 Mac OS X。 你可以通过终端窗口输入 “python” 命令来查看本地是否已经安装Python以及Python的安装版本。 Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, SunOS, IRIX, 等等。) Win 9x/NT/2000 Macintosh (Intel, PPC, 68K) OS/2 DOS (多个…

67. Python的绝对路径

67. Python的绝对路径 文章目录67. Python的绝对路径1. 准备工作2. 路径3. 绝对路径3.1 概念3.2 查看绝对路径的方法4. 课堂练习5. 用绝对路径读取txt文件6. 加\改写绝对路径6.1 转义字符知识回顾6.2 转义字符改写7. 总结1. 准备工作 对照下图&#xff0c;新建文件夹和txt文件…

小知识点:MySQL 的 redo log、undo log、binlog 以及 Java 监控 binlog

SQL 入库流程 服务器与 MySQL 建立连接依次经过 MySQL 服务器内存中 Server 层的分析器、优化器、执行器执行器根据执行计划操作 InnoDB 引擎InnoDB 从磁盘数据文件中将 data 读到缓冲池中修改之前&#xff0c;会写入 undo log 将 data 存起来然后将缓冲池中的 data 改成 new_d…

数据结构复习(三)顺序表oj

目录 27. 移除元素 26. 删除有序数组中的重复项 88. 合并两个有序数组 27. 移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外…

多数据库学习之GBase8s查询数据库表元信息常用SQL

多数据库学习之GBase8s查询数据库表元信息常用SQL简介常用SQL创建用户创建数据库及模式获取表元数据其他参考链接简介 背景介绍 GBase 8t是基于IBM informix源代码、编译和测试体系自主研发的交易型数据库产品。 南大通用安全数据库管理系统&#xff08;简称 GBase 8s&#xff…

Linux基础命令2(常见的文件相关命令)

目录 查找文件命令 pwd 显示当前所在的工作目录&#xff08;Print working directory&#xff09; cd 切换命令&#xff08;change directory&#xff09; ls 查看目录下的文件&#xff08;list&#xff09; tree 查看目录下的子目录&#xff08;查看目录结构&#…

Grafana 系列文章(十二):如何使用Loki创建一个用于搜索日志的Grafana仪表板

概述 创建一个简单的 Grafana 仪表板, 以实现对日志的快速搜索. 有经验的直接用 Grafana 的 Explore 功能就可以了. 但是对于没有经验的人, 他们如何能有一个已经预设了简单的标签搜索的仪表板&#xff0c;以帮助一些团队在排除故障时快速找到他们正在寻找的东西。虽然 Expl…

云仓仓储的运行模式是什么?

仓库能够简单地定义为一个规划空间&#xff0c;通常是一个用于处置和贮存货物的大型商业建筑。因而&#xff0c;仓储是指在这样一个规划空间中存储和处置货物所触及的一切过程。仓库中常见的货物包括&#xff1a;;机械零配件、建筑资料、废品农产品、家具和电子产品。仓库中的一…

【面试题】经典面试题:让 a == 1 a == 2 a == 3 成立?

一、问题解析 if (a == 1 && a == 2 && a == 3) {console.log(Win) } 复制代码 如何打印除Win? 看到题目的第一眼,我是蒙蔽的.怎么可能会有如此矛盾的情况发生呢?就相当于一个人怎么可能即是小孩,又是成年人,还是老年人呢? 冷静下来,发现一些端倪。

VHDL语言基础-组合逻辑电路-概述

目录 概述&#xff1a; 组合逻辑电路&#xff1a;——电路无记忆功能 组合逻辑电路的设计方法&#xff1a; 传统的设计方法&#xff1a;采用标准组件进行设计 组合逻辑电路的设计方法&#xff1a; 两种设计方法的比较&#xff1a; 概述&#xff1a; 数字电路按其完成逻辑…

[Android]图片加载库Glide

目录 Glide的介绍 Glide的基本使用 指定图片的格式 Glide占位符 指定图片的大小 过渡动画 图片变换 Generated API Glide的介绍 Glide是一个快速高效的Android图片加载库&#xff0c;可以自动加载网络&#xff0c;本地文件&#xff0c;app资源中的文件&#xff0c;注重于平…