传输层协议——UDP协议

news2025/7/20 17:25:28

❣️关注专栏:JavaEE


传输层虽然是操纵系统内核已经实现好了的,但是我们程序猿写代码要调用系统提供的 socket API 完成网络编程,其中 socket 就属于传输层部分。

🌱  UDP协议

🌱 1 UDP协议端格式

 上图就是UDP协议报文结构。

下面这里使用更加简洁明了的图文表示传输层报文结构:

UDP报头里边包含了一些特定的属性,懈怠了一些重要的信息。不同的协议,功能不同,报头中携带的属性信息就不同,对于UDP来说,报头一共是8个字节,分成4个部分,每个部分2个字节。2字节 源端口,2字节 目的端口,2字节 UDP报文长度,2字节 校验和。我们可以将这个报文想象成搬家时候的货拉拉:

  1.  UDP载荷:UDP就会把载荷数据通过 UDP socket ,也就是 send 方法得到的数据,在其基础上再到前面拼装上几个字节的报头,拼装就相当于是字符串拼接(此处是二进制的,不是文本的)。
  2. (1)其中的源端口和目的端口在TCP和UDP协议报头中都会有,都是用2字节:16bit位来表示的,一个端口号的取值范围是:0-65535,但是我们自己写程序的时候绑定的端口号是从1024开始的,因为0-1023这个范围的端口称为“知名端口号/具体端口号”,这些端口号是属于已经分配给了一些知名的广泛使用的应用程序了。1023以下的端口不是完全不能用,只是不建议使用,这些端口虽然被分配给了特定的程序,但是这个程序具体在你的电脑上是否运行着,电脑是否安装了这些程序,都是不一定的。那么如果写代码的时候你非要绑定一个1023以内的端口号的话,先要保证两点:(1)先确定你使用的这个端口确定没有程序在绑定(2)确定你有管理员权限。
  3. UDP报文长度也是2个字节表示,2个字节表示的范围是:0-65535,换算单位是64KB,一个UDP数据报,最大只能传输64KB的数据。这个64KB是非常小的,想象一下我们用手机拍的照片就是几个MB呢。如果应用数据报,超过了64KB怎么办呢?(1)在应用层通过代码的方式针对应用层数据进行手动的分包,拆分成多个包通过多个UDP数据报进行传输(本来是send一次就好了,现在需要 send 多次了),但是使用这个方案,需要写很多的代码,还要进行测试,处理bug...这就相当于是搬家的时候,货拉拉一次拉不完,所以需要多装几个车,但是约车,装车,清点都是非常麻烦的,所以干嘛不叫一个大一点的车一次性装完呢?所以就有了(2)不用UDP,直接换成TCP(TCP没有传输大小的限制)
  4. 校验和:作用是验证传输的数据是否正确。网络传输过程中,可能会受到一些干扰,在这些干扰下就可能出现“比特翻转”的情况,1->0,0->1的情况。网络传输,本质上就是光信号/电信号,这些信号可能会受到一些物理环境的影响,所以会导致一些数据发生改变,因此就引入了检验和来鉴别。校验和就是针对数据内容进行一系列的数学运算,得到一个比较短的结果(比如2字节),如果数据内容相同,得到的校验和结果就是一定的,如果数据内容改变,得到的校验和就变了。通过图示展示如何校验:

总结下来就是 ---- 发送方:把要发送的数据计算出校验和1;接收方:把收到的数据按照同样的方法再计算一次校验和2,然后比较校验和1和校验和2是否相同。

  •  针对网络传输的数据来说,生成校验和的算法有很多种,比较知名的是:

(1)CRC:循环冗余校验。简单粗暴,把数据的每个字节循环网上累加,如果累加溢出了,高位就不要了。虽然好算,但是校验和不是很理想,万一数据变动了2个bit位(前一个字节少1,后一个字节多一),就会出现了内容变了,CRC没变这样的情况。

(2)MD5:MD5不是简单地相加,有一系列的公式,来进行更复杂的数学运算.

算法特点:

1)定长:无论原始数据多长,得到的MD5值都是固定长度(有4字节版本、也有8字节版本.....)

2)冲突概率很小:原始数据哪怕只变动了一个地方,算出来的MD5值都会差别很大,让MD5结果更加分散。

3)不可逆:通过原始数据计算MD5容易,通过MD5还原成原始数据很难,理论上是不可实现的。

MD5这样的特点,就让它的作用更多了,校验和、作为计算hash值得方式、加密

(3)SHA1

🌱 2 UDP特点

🌱 2.1 无连接

知道对端的IP和端口号就直接进行传输,不需要建立连接

🌱 2.2 不可靠传输

没有任何安全机制,发送端发送数据报以后,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息;

🌱 2.3 面向数据报

应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并

🌱 2.4 全双工

UDP的socket既能读,也能写,这个概念叫做 全双工

🌱 2.5 缓冲区

UDP只有接收缓冲区,没有发送缓冲区:
UDP没有真正意义上的 发送缓冲区。发送的数据会直接交给内核,由内核将数据传给网络层协议
进行后续的传输动作;UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致;如果缓冲区满了,再到达的UDP数据就会被丢弃。

🌱 2.6 大小受限

UDP协议首部中有一个16位的最大长度。也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。
 

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

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

相关文章

Java面向对象特征之三:多态

一:面向对象三大特征之三:多态 1.多态是什么? 同类型的对象,执行同一个行为,会表现出不同的行为特征。 比如:猫和狗都是动物类型,执行同一个行为,但是会表现出不同的行为特征&…

flink sql 源码走读 --- 解释flink jdbc where 条件为什么没有下推数据库

本文通过一个具体案例,说明 flink sql 如何实现 connector 加载、source/sink 端操作、数据库连接等。可以帮助大家了解其原理,并在代码中找到落库执行SQL生成逻辑,得到where条件并没有下推到库执行的结论。 案例如下: create t…

Zookeeper集群和Hadoop集群安装(保姆级教程)

1. HA HA(Heigh Available)高可用 解决单点故障,保证企业服务 7*24 小时不宕机单点故障:某个节点宕机导致整个集群的宕机 Hadoop 的 HA NameNode 存在单点故障的可能,需要配置 HA 解决引入第二个 NameNode 作为备份同…

C语言学习(三)

#include <stdio.h> int main(void){int a; scanf("%d",&a); printf("%d",a); return 0&#xff1b;} 正在上传…重新上传取消正在上传…重新上传取消&符号作用是把键盘中输入的值给变量a,使用scanf()时输入数值&#xff0c;需要按一下enter…

MySQL知识点全面总结2:Mysql语句的执行(DDL DML 完整性约束)

二.MySQL知识点全面总结2&#xff1a;mysql语句的执行&#xff08;DDL DML 完整性约束&#xff09; 1.对数据库的操作&#xff08;DDL&#xff09; 2.对数据表的操作&#xff08;DDL&#xff09; 3.对数据表字段的操作&#xff08;DDL&#xff09; 4.对数据表内容的增删改&…

Science Direct 高级检索、使用技巧、寻找目标期刊、E lsevi er 投稿指南

ScienceDirect使用教程&E ls evier投稿指南1. 高级检索功能1.1 布尔值运算符和短语搜索&#xff08;构建检索式&#xff09;1.2 搜索特殊字符和公式1.3 非搜索用词2. 如何使用搜索结果页面&#xff1f;3. 下载多个文档3.1 从搜索结果列表中下载多个文档3. 利用 JournalFind…

java高性能并发计数器之巅峰对决

并发计数器各个方案介绍方案概述1. jdk5提供的原子更新长整型类 AtomicLong2. synchronized3. jdk8提供的 LongAdder 【单机推荐】4. Redisson分布式累加器【分布式推荐】方案介绍jdk5提供的原子更新长整型类 AtomicLong在JDK1.5开始就新增了并发的Integer/Long的操作工具类Ato…

VS2022+qt5.14.2配置qcustomplot2.1.16(坑很多)

目录1. 前言2. 下载QCustomPlot的源码3. 将QCustomPlot添加到QT项目&#xff08;一些遇到的问题&#xff09;1. 前言 QCustomPlot 是一个超强超小巧的qt绘图类&#xff0c;非常漂亮&#xff0c;非常易用&#xff0c;只需要加入一个qcustomplot.h和qcustomplot.cpp文件即可使用…

Android 基础知识4-3.7 ProgressBar(进度条)详解

一、简介 ProgressBar&#xff08;进度条&#xff09;是UI界面中一种非常实用的组件&#xff0c;通常用于向用户像是某个耗时操作完成的百分比。进度条可动态地显示进度&#xff0c;因此避免长时间地执行某个操作时&#xff0c;让用户感觉程序失去了响应&#xff0c;从而更好地…

常用反弹 shell 方式总结

在对 Linux 系统进行渗透测试中&#xff0c;常常会用到反弹 shell 的操作&#xff0c;今天来总结一下常用反弹 shell 的方式。 什么是反弹shell&#xff1a; 反弹shell&#xff0c;就是攻击机监听在某个TCP/UDP端口为服务端&#xff0c;目标机主动发起请求到攻击机监听的端口…

Spark 配置项

Spark 配置项硬件资源类CPU内存堆外内User Memory/Spark 可用内存Execution/Storage Memory磁盘ShuffleSpark SQLJoin 策略调整自动分区合并自动倾斜处理配置项分为 3 类: 硬件资源类 : 与 CPU、内存、磁盘有关的配置项Shuffle 类 : Shuffle 计算过程的配置项Spark SQL : Spar…

MySQL 中的 distinct 和 group by 的性能比较

1 先说大致的结论&#xff08;完整结论在文末&#xff09;在语义相同&#xff0c;有索引的情况下&#xff1a;group by和 distinct 都能使用索引&#xff0c;效率相同。在语义相同&#xff0c;无索引的情况下&#xff1a;distinct 效率高于group by。原因是 distinct 和 group …

【软件开发】基于PyQt5开发的标注软件

这里是基于PyQt5写的面向目标检测的各类标注PC端软件系统。目前现有的labelme软件和labelImg开源软件无法满足特殊数据集的标注要求&#xff0c;而且没有标注顺序的报错提示。当然我设计的软件就会不具有适用性了&#xff08;毕竟从下面开发的软件可以明显看出来我做的基本上是…

spark-submit报错

spark-submit --class ${main_class} \ --master yarn \ --deploy-mode client \ --driver-memory 8g \ --executor-memory 6g \ --num-executors 1 \ --executor-cores 34 \ ${HOME_PATH}/obs_finance-1.0-SNAPSHOT-jar-with-dependencies.jar ${year_month} 注意这个34超过…

【教学典型案例】28.单表的11个Update接口--MyBatis

目录一&#xff1a;背景介绍二&#xff1a;前期准备引入pom依赖MyBatis配置文件数据库连接文件MyBatis配置类三&#xff1a;代码编写Mapper编写接口通用mapper实体pojojunit测试编写测试结果四&#xff1a;总结一&#xff1a;背景介绍 在进行项目开发编写更新接口时&#xff0…

顶级动漫IP加持之下,3A策略游戏Mechaverse如何改变GameFi

2021年是元宇宙发展的元年&#xff0c;元宇宙与GameFi创造了一波又一波市场热点。在经历第一波热潮之后&#xff0c;元宇宙的到来让不少人看到了加密市场的潜力&#xff0c;同时大家也意识到这将是未来的重要方向。如何将元宇宙推向更广阔的市场&#xff0c;让更多人能够轻松进…

项目管理工具DHTMLX Gantt灯箱元素配置教程:显示任务内容

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求&#xff0c;具备完善的甘特图图表库&#xff0c;功能强大&#xff0c;价格便宜&#xff0c;提供丰富而灵活的JavaScript API接口&#xff0c;与各种服务器端技术&am…

神经网络(容易被忽视的基础知识)

主要内容&#xff1a; 基本神经元作为线性分类器的单个神经元为什么要是深度神经网而不是”肥胖“神经网络&#xff1f;为什么在人工神经网络中的神经元需要激活函数&#xff1f;一些主要的激活函数神经网络中的偏置有什么意义&#xff1f;初始化神经网络的参数可以全为0吗&am…

【java】java基本类型和包装类型的区别

文章目录简介1.包装类型可以为 null&#xff0c;而基本类型不可以2.包装类型可用于泛型&#xff0c;而基本类型不可以3.基本类型比包装类型更高效4.自动装箱和自动拆箱简介 Java 的每个基本类型都对应了一个包装类型&#xff0c;比如说 int 的包装类型为 Integer&#xff0c;d…

ECOLOY直接更换流程表单后导致历史流程中数据为空白的解决方案

用户反馈流历史流程打开是空白了没有内容。 一、问题调查分析&#xff1a; 工作流“XX0204 员工培训协议审批流程”workflowId37166产生的7个具体流程中&#xff0c;创建日期为2021年的4个具体流程原先引用的数据库表单应该是“劳动合同签订审批表”(formtable_main_190)&…