UDP校验和计算
- UDP概述
- UDP首部
- UDP计算校验和
- UDP实际例子
UDP概述
UDP是User Datagram Protocol的简称,中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联)参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,UDP在IP报文的协议号是17。
UDP首部
用户数据报UDP有两个字段:数据字段和首部字段。首部字段很简单,只有8个字节,有四个字段组成,每个字段的长度都是两字节。各段意义如下:
源端口:源端口号。在需要对方回信时选用。不需要时可用全0。
目的端口:目的端口号。这在终点交付报文时必须要使用到。
长度:UDP用户数据报的长度,其最小值是8(仅首部)。
校验和:检测UDP用户数据报在传输中是否有错。有错就丢弃。
UDP计算校验和
UDP计算校验和的方法和IP数据报首部校验和的方法相似。不同的是:IP数据报校验和只校验IP数据报的首部,但UDP的校验和是把首部和数据部分一起都检验。
UDP的校验和需要计算UDP首部加数据荷载部分,但也需要加上UDP伪首部。这个伪首部指,源地址、目的地址、UDP数据长度、协议类型(0x11),协议类型就一个字节,但需要补一个字节的0x0,构成12个字节。伪首部+UDP首部+数据一起计算校验和。
UDP检验和的计算方法是:
1.按每16位求和得出一个32位的数;
2.如果这个32位的数,高16位不为0,则高16位加低16位再得到一个32位的数;
3.重复第2步直到高16位为0,将低16位取反,得到校验和。
UDP实际例子
校验和的计算公式如下:(udp伪首部+udp报文(除了校验和))
所有都按照16位相加=源ip+目的ip+协议号(17)+包长度
+源端口号+目的端口号+包长度
+数据
java 代码参考
java">package mian;
/**
*
* UDP校验和计算
* @author xuminggang
*
* @Version 2020年5月20日
*/
public class UDPCheck {
public static void main(String[] args) {
int[] arr = {0xc0a8,0x016a,0x0b6f,0x6f6f,0x0011,0x0011,0xf83d,0x3039,0x0011,0x6865
,0x6c6c,0x6f20,0x5544,0x5000};
udpCheck(arr);
}
public static void udpCheck(int[] arr) {
int sum = 0;
for(int num:arr) {
sum += num;
if(sum>>>16>0) {
sum = (sum >>> 16) + (sum & 0xffff);
}
}
//System.out.println(sum);
System.out.println(Integer.toBinaryString(sum));
//取低16位
System.out.println(Integer.toHexString(~sum).substring(4));
}
}
输出结果
100111011010010
b12d