特点
无连接:无需建联断联,发完即走,就像发消息一样,不需要建立连接,只需要消息发出和被收到不可靠传输:不提供任何传输层的可靠性保障机制,后面说到TCP的时候会提到什么是可靠什么是不可靠面向数据报:保边界,一次发送一次接收,整包交付,应用层交给UDP多长的报文,UDP都原样照发全双工:同一端口对可同时收发数据。半双工就像单向车道一样,只能单车通行,不能双车对向行驶。全双工就是双向车道
结构
UDP数据报=报头+载荷(应用层数据包)

- 报头和载荷之间可以想象成字符串拼接的过程
- UDP的载荷就负责承载数据包里的内容
- UDP报头一共4个字段,一个字段2字节,一共8字节
- 两个端口号都是2个字节来表示的,所以取值是0到65535
数据报长度:使用两个字节来表示,用这一个数据来表示,一个UDP数据报有多长。- 由于是两个字节来表示的,所以这里能表示的最大值就是64KB(65535),因此一个UDP数据报最大长度就是64KB,无法更长了。
- 一旦整个数据报的长度超出了64KB此时就可能会出现数据截断,导致原本数据是完整的,但是后面的部分表示不出来,没了
总的UDP数据报能表示的最大长度是64KB,载荷部分实际能够承担的最大长度应该是64KB - 8(自身的),64KB - 8 约等于 64KB,我们使用语言描述的时候就会采取近似值
校验和:在网络传输的过程中,数据可能受到外界环境的干扰,发生比特反转,然后坏掉。网络中的校验和并非是简单的按照长度或者数量作为校验的标准,而是一定要让数据的内容能够参与进去。- UDP中,校验和,使用比较简单的方式-->CRC算法(循环冗余校验)来完成校验
- 比如,要生产一个两个字节的校验和,这里我们写一段伪代码
short
for(遍历取出数据报中的每个字节的数据){
checksum += 当前字节的数据
}
- 在加的过程中,数据可能比较大,会超出short两个字节的范围,我们也不需要在意,因为最后都是一个固定的结果
- UDP数据报发送方,在发送前,先计算一遍CRC,然后把算好的CRC值放到UDP数据报的校验和中,接下来数据包到达对端,对端接收数据之后,也会再计算一般CRC,然后对比两边计算出来的校验和是否一致,如果不一致,说明在传输的过程中损坏了
- 严格来说,校验和只能用来
证明真伪,如果数据出错了,是无法确保这个数据100%正确。但在实践中可以近似的认为校验和一致,原来的数据就一致 - ⚠️如果有多个比特位发生了,校验和是有小概率出现,恰好还和之前算出的校验和一样的情况。这样的情况概率比较低,可以忽略不计,如果希望这里有更高的检查精度,就需要用到其他更为严格的校验和算法了
高精度校验和算法
md5算法是业界常用的校验和算法- md5的背后有一系列的数学公式,来进行计算,不同于CRC这么简单
- 认识一下md5的
特点 1.定长:无论原始数据有多长,计算出来的md5的最终值都是固定长度2.分散:计算md5的过程中,原始数据,只需要变化一点点,算出的md5值就会有很大的差异,在网络传输中,如果出现了比特翻转,意味着只是极少的比特位翻转了,也会导致最终的md5差异很大3.不可逆:把数据计算成md5值的过程很简单,但是给你一个算好的md5值,让你还原回原始的字符串,理论上是无法完成的。从原始的字符串到md5这个过程,有很多的信息量损失了,就像是木头到纸的过程,你看着一张纸很难想象到它是由木头制作而来的。- 由于这些特性,md5也可以用于一些加密的场景,很多网站都会采取密码加密存储的方式,防止密码的明文泄露