1、UDP数据包格式

java udp 解析包头和包体 udp包头格式_udp


UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

格式详解:

端口号:两个字节,UDP协议使用端口号为不同的应用保留其各自的数据传输通道。数据发送一方(可以是客户端或服务器端)将UDP数据包通过源端口发送出去,而数据接收一方则通过目标端口接收数据。

长度:数据报的长度是指包括报头和数据部分在内的总字节数。

校验值:检测UDP数据报在传输中是否有错,有错则丢弃,对报头和数据一起校验。该字段是可选的,当源主机不想计算校验和,则直接令该字段全为0。在计算校验和的时候,需要在UDP数据报之前增加12字节的伪首部,伪首部并不是UDP真正的首部。只是在计算校验和,临时添加在UDP数据报的前面,得到一个临时的UDP数据报。校验和就是按照这个临时的UDP数据报计算的。伪首部既不向下传送也不向上递交,而仅仅是为了计算校验和。这样的校验和,既检查了UDP数据报,又对IP数据报的源IP地址和目的IP地址进行了检验。

校验方法:

前提:引入伪首部,长度为12B,需要知道伪首部的引入只是在计算校验和时用到,该伪首部既不向上递交也不会向下传送。

具体步骤:

  1. 发送方首先把全零放入校验和字段并添加伪首部,然后把UDP数据报视为许多16位的字连接起来。
  2. 若UDP数据报的数据部分不是偶数个字节,则要在数据部分末尾增加一个全零字节(但此字节不发送)。
  3. 接下来按二进制反码计算出这些16位字的和,并将此和的二进制反码写入校验和字段。
  4. 接收方把收到的UDP数据报加上伪首部(如果不为偶数个字节,那么还需要补上全零字节)后,按二进制反码计算出这些16位字的和。
  5. 当无差错时其结果应全为1,否则表明有差错出现,接收方就应该丢弃这个UDP数据报。

例子:

java udp 解析包头和包体 udp包头格式_UDP_02

注意:
1、校验时,若UDP数据报部分的长度不是偶数个字节,则需填入一个全0字节,如图5.5 所示。但是此字节和伪首部一样,是不发送的。
2、通过伪首部,不仅可以检查源端口号、目的端口号和UDP用户数据报的数据部分,还可以检查IP数据报的源IP地址和目的地址。