UDP首部由源端口号、目标端口号、包长和校验和组成。
# UDP数据包格式
源端口号(Source Port) | 目标端口号(Destination Port)
包长度(Length) | 校验和(Checksum)
数据部分(Data)
源端口号(Source Port)
没有源端口号的时候该字段的值设置为0,可用于不需要返回的通信中。
校验和(Checksum)
校验和
是为了提供可靠的UDP首部和数据而设计。在计算校验和时,附加在UDP伪首部与UDP数据报之前。通过在最后一位增加一个“0”将全长增加16倍。此时将UDP首部的校验和字段设置为“0”。然后以16比特为单位进行1的补码和,并将所得到的1的补码和写入校验和字段。
- 在校验和计算中之所以使用1的补码形式,是因为即使有一位溢出会回到第1位,也不会造成信息丢失。而且在这种形式下0可以有两种表示方式,因此有用0表示两种不同意思的优点。
# 校验和计算中使用的UDP伪首部
源IP地址
目标IP地址
填充0 | 协议号17 | UDP包长度
接收主机在收到UDP数据报以后,从IP首部获知IP地址信息构造UDP伪首部,再进行校验和计算。校验和字段的值是校验和字段以外剩下部分的1的补码和。因此,包括校验和字段在内的所有数据之和结果为“16位全部为1”时,才会被认为收到的数据是正确的。
- 1的补码中该值为0(负数0)。二进制中为1111111111111111、十六进制中为FFFF、十进制中则为65536。
另外,UDP中也有可能不用校验和,此时,校验和字段中填入0。然而UDP首部的端口号或是IP首部的IP地址遇到损坏,那么可能会对其他通信造成不好的影响。因此,在互联网中比较推荐使用校验和检查。
校验和计算中计算UDP伪首部的理由:TCP/IP中识别一个进行通信的应用需要5大要素,它们分别为源IP地址、目标IP地址、源端口、目标端口、协议号。然而在UDP的首部中只包含它们当中的两项,余下的3项都包含在IP首部里。假定其他3项的信息被破坏会产生什么样的后果?很明显,这极有可能会导致应该收包的应用收不到包,不该收到包的应用却收到了包。为了避免这类问题,有必要验证一个通信中必要的5项识别码是否正确。为此在校验和的计算中引入了伪首部的概念。
(最近更新:2019年09月18日)