1 UDP 协议简介

UDP 是一种面向数据包协议,应用层向下传递的每一次操作都会产生一个 UDP 数据包,这一个 UDP 数据包会组装成一份 IP 数据包,这里是一一对应的关系。当 IP 数据包向下传的时候,如果 IP 数据包的长度超过了网络的 MTU,那么就会对 IP 数据包进行分片,并且每个网络之间都会进行分片。因此应用程序必须关注 IP 数据包的长度,不然可能会对数据包的传输造成很大的影响。

下图是 UDP 数据包封装为 IP 数据包的样子:

UDP 数据包封装为 IP 数据包

下图是 UDP 数据包的内部结构:

UDP 数据包的结构

UDP 的数据结构,1、2 两个字节表示源端口号,3、4 字节表示目标端口号,5、6 字节表示 UDP 数据包长度长度,7、8 字节表示 udp 校验和。这里的数据包长度包含包头,所以其最小值为 8。

2 UDP 协议中的校验和

UDP 的校验和计算方式和 IP 数据包首部的校验和计算方式是相同的。不过 IP 数据包的校验和只校验 IP 数据包的首部,不校验数据,而 UDP 的检验和会校验数据。二者均采用 16 位二进制反码求和的方式计算校验和。

UDP 中的校验和是可选的 TCP 中的校验和是必须的

  • 当 UDP 中的校验和全为 0 的时候表示发送端没有计算校验和
  • 当 UDP 计算校验为 0 的时候,将校验和全部置为 1 进行传输

由于 UDP 数据包可能出现奇数字节,那么 16 位二进制反码求和的运算就行不通,所以当出现奇数字节的时候通过在尾巴上补 0 来补成偶数,但是在实际传输的时候,补的 0 是不参与的。

并且,UDP 在计算校验和时候会在头上补上 12 个字节的内容,其中包含源 IP 地址和目标 IP 地址。

下图展示在校验的时候校验的字节:

UDP 校验时候校验的字节

接收端接收到数据会对数据进行校验,分为两种情况,一,发现校验和不全为 0,那么接收端进行计算,对不上,说明传的有差错,二、接收端接收到数据,发现校验和全为 0,说明发送端没计算,直接上传给应用层。

这里有两种特殊的情况,一,如果发送的时候是计算了的,但是传到接收端的时候出现了差错,接收端拿到的校验和全是 0,虽然是错的,但是它会以为这是发送端没有计算,同样会上传给应用层。二,因为校验采用的是 16 位反码和的方式,那么如果两个 16 位交换,同样检测不出来。

3 关于 UDP 包在 IP 层分片的情况

IP 层在发送数据报的时候,会查看该接口的 MTU,然后对数据报进行分片,在数据报传输到下一跳之后,在下一跳的 IP 层会对数据报重新组装。

4 UDP 协议的应用

// todo 待完成

参考资料

  1. TCP-IP 详解:用户数据报协议