UDP校验和计算-理解和java实现

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 代码参考

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

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页