观前提示:本篇博客演示使用的 IDEA 版本为2021.3.3版本,使用的是Java8(又名jdk1.8)
电脑使用的操作系统版本为 Windows 10
目录
前言
在上一篇博客中(网络初识),讲到封装的时候,提到了一个"hello"是通过层层包装,才能进行传递,里面涉及到了 UDP 报头,本篇博客将详细介绍 UDP 协议
UDP协议
UDP 特点
在学习 UDP 协议之前,先了解一下UDP 的特点
UDP 有以下四个特点
-
不可靠性:只管传输,不管是否成功接收
-
无连接:没有建立连接
-
面向数据报:报文
-
全双工:可以同时进行接收和发送
UDP 报文协议
下图为常见的 UDP 报文协议图,但是,实际上这样画不严谨,这样画是为了方便排版
实际上的 UDP 报文协议,如下图所示
一个 UDP 报文 = UDP 报头 + UDP 载荷
UDP 就会把载荷数据(通过 UDP socket,也就是send 方法拿来的数据,基础上再在前面拼装上几个字节的报头)
UDP 报头里面包含了一些特定的属性,携带了一些重要的信息
不同的协议,功能不同,报头中携带的属性信息就不同
对于 UDP 来说,报头一共就8个字节,分成四个部分(每个部分两个字节)
2字节 源端口 (发送方端口)
2字节目的端口 (接收方端口)
2字节 UDP 报文长度
2字节 校验和
一次网络通信,涉及到五元组
源IP,目的IP,源端口,目的端口,协议类型
UDP 报文长度,2个字节长度表示
ps:复习一下不同字节长度,表示的数据范围
2个字节表示的范围是 0 -> 65535 ,换算单位就是64 kb
一个 UDP 数据报,最大只能传输 64kb 的数据
那么问题来了:超过 64kb ,怎么办?
有两种解决办法
1.在应用层通过代码的方式针对应用层数据报进行手动分包,拆成多个包通过多个 UDP 数据报进行传输(本来send 一次,现在send 多次)
2.不同 UDP ,换成TCP(TCP没有这个限制)
那么这两种方法,哪一个更好呢?
方法1,需要多写很多代码,进行多次测试,还需要处理很多bug
那么不言而喻,方法2,更棒
校验和
校验和:作用是验证传输的数据是否是正确的
网络传输过程中,可能会收到一些干扰,在这些干扰下可能出现"比特翻转"(0变成1,1变成0)
网络传输本质上就是光电信号,这些可能受到一些物理环境的影响(电场,磁场,高能射线)
比如:1111 0000变成了1111 0001
一旦数据变了,对于数据的含义可能是致命的
出名的事故有:
2008年10月7日,澳洲航空72号航班,一架A330于FL370高度飞行时,突然自动执行了先上升再下降等一连串“修正动作”,最后机组关闭了自动驾驶系统,成功着陆,事件导致119人受伤。
《空中浩劫》第18季第7节演绎了这个事件,澳大利亚调查机构ATSB也发布过详细的调查报告。
这样的现象是客观存在的,不可避免,我们能做的就是及时识别出,当前的数据是否出现问题
因此引入了校验和来进行鉴别
针对数据内容进行一系列数学运算,得到一个比较短的结果(比如两字节)
如果数据内容一定,得到的结果和就一定
如果数据内容变了,得到的结果就一定变了
那么是否可能出现这种情况?
假设数据传输过程出错了,但是计算得到的校验和和之前的校验恰好一样?
这种情况理论上存在,但是概率极低,因此忽略不计
校验和算法
针对网络传输的数据来说,生成校验和的算法有很多种
其中比较知名的几个:
1.CRC
循环冗余校验
简单粗暴,把数据的每个字节,循环往上累加,如果累加溢出,高位不要
优点是好算,但是校验效果不理想,万一你的数据同时变动;两个 bit 位(前一个字节少1,后一个字节多1)就会出现内容变了,但是 CRC 没变
2. MD5
MD5是一种常用的哈希(Hash)算法,它可以将任意长度的消息(message)转换为一个128位的摘要(digest),也被称为MD5值。MD5主要具有以下四个特点:
-
不可逆性:MD5是一种不可逆的哈希算法,这意味着无法通过MD5值反推出原始消息。对于相同的输入,MD5生成的固定长度的哈希值总是相同的,而不同的输入则会生成不同的哈希值。
-
独立性:MD5生成的哈希值与原始消息的长度无关,只与消息内容相关。这意味着无论输入的消息大小如何,MD5总是能够以固定长度的值来表示该消息。
-
低碰撞率:MD5算法在设计时考虑了尽可能降低哈希值冲突的概率。虽然MD5算法已经存在一些碰撞攻击方法,但目前在普通计算机上实现碰撞攻击仍需要较大的计算资源和时间。
3. SHA-1
SHA-1(Secure Hash Algorithm 1)是一种常用的哈希算法,它能够将任意长度的消息(message)转换为160位的摘要(digest),也被称为SHA-1值。SHA-1与MD5类似,但较之MD5更安全,具有以下特点:
-
碰撞概率低:SHA-1算法在设计时考虑了尽可能降低哈希值冲突的概率,比MD5等其它哈希算法碰撞率更低。虽然SHA-1算法已经出现一些破解方法,但其安全性比MD5要高。
-
不可逆性:SHA-1是一种不可逆的哈希算法,与MD5类似,无法通过SHA-1值反推出原始消息,只能通过再次计算哈希值来验证消息是否相同。
-
独立性:SHA-1生成的哈希值与原始消息的长度无关,只与消息内容相关。这意味着无论输入的消息大小如何,SHA-1总是能够以固定长度的值来表示该消息。
-
高效性:SHA-1算法具有高效性,能够快速地处理大量数据并生成哈希值,在网络传输中得到广泛应用。相对于其它哈希算法,如SHA-256、SHA-512等,SHA-1算法的运算速度较快。
本文完,感谢观看,有什么错误和不足的地方请在评论区指出,一起进步,谢谢 !