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

news/2024/5/18 16:08:44 标签: 网络协议, 网络, java, udp

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


http://www.niftyadmin.cn/n/1592518.html

相关文章

WPF圣经——《WPF揭秘》

WPF圣经——《WPF揭秘》 推荐阅读: 1.众星捧月——ASP.NET之父等力荐——《WPF揭秘》 2.王洪超:WPF催熟整个软件生态链 3.Tony Qu的《WPF揭秘》情节 基本信息: 原 书 名:Windows Presentation Foundation Unleashed 原出版社…

jvm-java虚拟机栈详解

java虚拟机栈虚拟机栈存储内容栈帧Local Variables 局部变量表Operand Stacks 操作数栈Dynamic Linking 动态链接Invocation/Completion 方法返回地址例子对java文件进行分析对calc()方法分析虚拟机栈存储内容 栈帧 每个栈帧对应一个被调用的方法,可理解为一个方法…

一个超级简单的留言薄 只有一张表

1.这个图就是这个留言本的数据表 2.这个图就是留言本的界面 就是 两个TextBox 和一个 Repeater 控件 3.IDE中的图 呵呵~ 4.下面就是运行的效果图了这个例子非常简单,有说的就是 Repeater 控件 e.item.FindControl 方法找到 TextBox 的ID 继而用其值! /Fi…

package io.netty.util.ReferenceCounted

package xmg.quest.netty.core;/*** 一个引用计数对象需要显式的回收* <p>* 当一个新的{link ReferenceCounted} 被创建好&#xff0c;这个对象的引用计数就是{code 1}。* 调用{link #retain()}方法会增加这个引用计数&#xff0c;调用 {link #release()}会减少这个…

解决USB key在citrix虚拟桌面里使用的问题

1.首先保证VDA和本地客户端PC都装有U盾的驱动&#xff0c;2.先用USBDeview工具把U盾的VID,PID,class 和subclass记下来&#xff0c;如&#xff1a;&#xff0c;SubClass00 &#xff0c;VID096e&#xff0c;PID0801 3.在VDA里改注册表&#xff0c; 定位到此路径&#xff08;HK…

VMware合作伙伴技术研讨会-6月12日上海站

登记注册详情请参考网址[url]http://www.chnteamax.com/sh612edm/edm.html[/url]转载于:https://blog.51cto.com/virtualman/80216

AtomicIntegerFieldUpdater要点总结

1.更新器更新的必须是int类型变量&#xff0c;不能是其包装类型。 2.更新器更新的必须是volatile类型的&#xff0c;确保线程之间共享变量时的立即可见性。 3.变量不能是static的&#xff0c;必须是实例变量。因为Unsafe.objectFieldOffset()方法不支持静态变量&#xff08;C…

JavaScript笔记之数组 keyword(存储和释放堆栈 按值 引用)

1.数组创建及初始化 var objnew Array(); var arr[]; 可以延伸为长度一定的&#xff0c;字面量定义数组 2.堆栈 按值传递 引用类型 数组是引用类型&#xff0c;不是值传递&#xff0c; 栈&#xff1a;系桶自动分配和释放 &#xff0c;比如函数的参数、局部变量 先进后出 一级缓…