UDP 的报文结构和注意事项

1. UDP的特点

1.无连接

就像发短信给对方,只需要对方的端口和IP地址。不需要连接。

2.不可靠传输

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

3.面向数据报
应⽤层交给UDP多⻓的报⽂(载荷),UDP原样发送,既不会拆分,也不会合并

4.缓冲区
UDP只有接收缓冲区,没有发送缓冲区:
4.1 UDP没有真正意义上的 发送缓冲区。发送的数据会直接交给内核,由内核将数据传给⽹络层
协议进⾏后续的传输动作;
4.2 UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺
序⼀致;如果缓冲区满了,再到达的UDP数据就会被丢弃;
4.3 UDP的socket既能读,也能写,这个概念叫做 全双工

5.大小受限

UDP协议⾸部中有⼀个16位的最⼤⻓度。也就是说⼀个UDP能传输的数据最⼤⻓度是64K(包含UDP⾸部)

2. UDP报文结构

下图就是UDP的大概结构:

2.1源端口和目的端口

可以通过下图来简单理解:

2.2 UDP长度

16位报文长度描述的是UDP数据报中数据的大小。其大小是2个字节,其表示的范围就是0-65535,换算出来就是64KB的大小。因此,一个UDP数据报一次最大只能传输64KB大小的数据。

但如果应用层数据报超过了64KB怎么办?那么我们就可以:

1.在应用层,通过代码的方式针对应用层数据报进行手动的分成若干部分,拆分成多个UDP数据报进行传输(send多次)。

2.把UDP的全部改为TCP进行传输。

2.3 UDP检验和

2.3.1 CRC算法

UDP中校验和,使用的是一种比较简单的方式,CRC算法来完成校验。

伪代码:

java 复制代码
        short checksum = 0;
        for(遍历取出数据报中的每个字节数据){
            checksum += 当前字节的数据; 
        }

**注意点:**在这里checksum 相加的过程中,产生的数据可能比较大,超出short的俩个字节的范围,就溢出了,在这里的话也不管溢出。

**工作原理:**UDP数据报发送方,在发送之前,先计算一遍CRC,把算好的CRC值放到UDP数据报中(设这个CRC值为value1),接下来这个数据包通过网络传输到达接收端,接收端收到这个数据之后,也会按照同样的算法,再算一遍CRC的值,得到的结果是value2。比较自己计算的value2和收到的value1 是否一致,如果是一致的,就说明数据是ok的。如果不一致传输过程中发生了比特翻转了。

**注意点:**上述CRC算法中,如果只有一个bit位发生翻转,此时就能发现问题,如果有多个bit位发生翻转,有可能恰好校验和之前一样(虽然概率很低,但是也不希望这样子的事情发生)。

2.3.2 除了CRC之外高精度的校验和算法

其实除了CRC,在业界还有一个很常用的,md5/sha1 算法。

md5的特点:

  1. 定长: 无论原始数据多长,算出来的md5的最终值都是固定长度,常见的md5有16位版本(2字节),32为版本(4字节),64为版本(8字节)。

  2. 分散: 计算md5的过程中,原始数据只要变化了一点点,算出来的md5值就会差异很大。

  3. 不可逆: 给一个源字符串,计算md5值,这个过程非常简单,但是给你一个算好的md5值,让你把他还原回原始字符串,理论上无法完成的。(就像猪肉变成火腿一样)。

相关推荐
Wang's Blog16 分钟前
Java 项目实战: 交友项目 - 圈子互动章总结与自检清单
java·bootstrap·交友
xyouyuweizhu1 小时前
字节流与字符流:Java IO 的两条主线该怎么选
java·开发语言·python
代码方舟1 小时前
零信任架构实战:基于天远人企关联构建自动化供应链核心企业关联穿透与利益冲突审查网关
java·人工智能·架构·自动化
liyi_hz20082 小时前
O2OA(翱途) V10.1 即将发布|功能再升级,安全再加固,协同更高效!
java·javascript·windows·开源软件
骑着蜗牛撵大象3272 小时前
AI Agent 工程化开发实战(三):用 StateGraph 给智能体搭一条可回放的状态流水线
java·开发语言·jvm·ai·状态管理·langgraph·stategraph
鬼手点金2 小时前
KV Cache 未必是一次性的:可编辑、可组合的“笔记”
java·人工智能·笔记·学习·自动化·1024程序员节
摇滚侠2 小时前
《On Java 中文版 基础卷》阅读笔记 初始化和清理 08
java·开发语言·笔记
海鸥-w3 小时前
Redis 配置与排错说明
java·数据库·redis·bootstrap
XiYang-DING3 小时前
P4009.和为K的子数组个数 & P5522.异或和为 k 的子数组个数
java·开发语言
TinyKey3 小时前
malloc_debug_notes
java