图解TCP/IP:UDP首部格式

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日)

你可能感兴趣的:(#,Internet)