1.UDP的报文结构
UDP的报文结构如图:
画成一行会比较好理解:
主要由两部分组成:UDP报头和UDP载荷。
UDP载荷其实就是数据。
UDP报头分为四个部分,每个部分占两个字节。
- 源端口
- 目的端口
- 报文长度
- 校验和
下面介绍报头里各个部分的作用。
1.1源端口和目的端口
源端口和目的端口各占2字节(Byte)
,端口号范围:0~65535
比如:源端口是3306,目的端口是8866。
就表示从数据从3306这个端口发送到8866这个端口,通过这两个端口就可以知道数据从哪个进程发送到哪个进程。
注意:上图的MySQL和IDEA两个端口是随便给的,跟实际的不一样。
1.2报文长度
报文的长度也用2个字节表示,范围是0~65535
,单位是字节(Byte)
。
一般我们都说UDP最大报文长度是64KB (65536B)
,实际上是65535B
。
所以UDP能传送的数据比较有限,那为什么不把这个报文长度改成用4个字节8个字节呢或者更大呢?
也不是不行,只是影响太大。
因为世界上有那么多主机、服务器、和其他设备。
如果其中有一些主机或者服务器把系统升级,然后按照新的UDP协议进行通信,但是其他主机或者服务器没升级系统(用的还是老的UDP协议),可能通信就会现问题了。
世界上那么多设备,将每个设备的系统都升级,这是很不现实的操作。
采用新UDP协议
的主机发送数据报给采用旧UDP协议
的主机
解析数据:
解析出错:
1.3校验和
网络上传输数据是有可能发生数据错误的,可能因为环境(磁场、电磁波等)的影响,导致数据发生了错误,1变0,0变1,这时候对方收到的数据就是错误的。
校验和就是用来检验数据是否发生错误的。
先说一段小故事,体会体会校验和的作用🙃
小红和小明是男女朋友关系,有一天小红叫小明去买菜,如图:
小红吩咐了,小明也答应了,结果:
小红继续吐槽:
小明屁颠屁颠又跑到菜市场把西红柿买回来:
完结
- 在故事中小红发现小明只买了3样菜,本来是4样的。
然后小红很友好地叫小明去买之前没买的西红柿。 - 这个故事中的校验和其实就是菜的样数。
校验和是数据经过校验和算法得到的一个数值,用来校验数据是否出错。
如图:
计算校验和:
比较:
不相等:
校验和不相等,说明发送方的数据和接收方的数据一定不一样。
但是校验和相等,发送方和接受方的数据不一定相等。
比如:
发送方和接收方的数据不一样,但是经过校验和算法计算,校验和有可能是一样的。
UDP
用的算法是CRC
算法。
2.注意事项
在使用UDP
编程的时候,数据报不能太长。
数据报太长会导致很多问题。
比如:
数据报太长会导致数据报可能会被分片传输,重组的时候,某部分数据报丢失或者损坏都会导致重组失败。
如果UDP数据报太大,可以选择如下做法:
- 可以把数据报分成各个小的数据报
- 使用TCP传输协议