UDP,全称User Datagram Protocol,用户数据报协议,是TCP/IP四层参考模型中传输层的一种面向报文的、无连接的、不能保证可靠的、无拥塞控制的协议。UDP协议因为传输效率高,常用于即时通信,比如视频/语音聊天,直播等。

1. UDP数据报的格式

用户数据报UDP有两个字段:数据字段和首部字段。首部字段很简单,只有8个字节,有四个字段组成,每个字段的长度都是两字节。各段意义如下:

  • 源端口:源端口号。在需要对方回信时选用。不需要时可用全0。
  • 目的端口:目的端口号。这在终点交付报文时必须要使用到。
  • 长度:UDP用户数据报的长度,其最小值是8(仅首部)。
  • 校验和:检测UDP用户数据报在传输中是否有错。有错就丢弃。

2. UDP校验和的计算

UDP的校验和需要计算UDP首部加数据荷载部分,但也需要加上UDP伪首部。这个伪首部指,源地址、目的地址、UDP数据长度、协议类型(0x11),协议类型就一个字节,但需要补一个字节的0x0,构成12个字节。伪首部+UDP首部+数据一起计算校验和。

UDP检验和的计算方法是:

  • 按每16位求和得出一个32位的数;
  • 如果这个32位的数,高16位不为0,则高16位加低16位再得到一个32位的数;
  • 重复第2步直到高16位为0,将低16位取反,得到校验和。

3. UDP校验和计算方法的Java实现

一个实际例子:

key hex
源IP地址 0x0aaa, 0x3bbf
目的IP地址 0xd20e, 0x960d
协议类型 0x0011
UDP长度 0x001c
源端口 0xd123
目的端口 0x2742
长度 0x001c
校验和 0x285c(用于验证)
UDP数据 0x0000, 0x6c41, 0x5661, 0x0000, 0x0e00, 0xf8b6, 0xd401, 0x9313, 0x0000, 0x0000, 0x0000

Java实现:

public class CheckSumDemo {
public static void main(String[] args) {
/**
* 源IP
* 目的IP
* 协议类型
* UDP数据长度
* 源端口
* 目的端口
* UDP数据
* UDP数据
*/
int[] udp = {
0x0aaa, 0x3bbf,
0xd20e, 0x960d,
0x0011,
0x001c,
0xd123,
0x2742,
0x001c,
0x0000,0x6c41,0x5661,0x0000,0x0e00,0xf8b6,0xd401,0x9313,0x0000,0x0000,0x0000
};
int checkSum = 0x285c; String s = udpCheckSum(udp);
System.out.println(s);
System.out.println(Integer.toHexString(checkSum).equals(s));
} public static String udpCheckSum(int[] nums) {
int res = 0;
for (int num : nums) {
res += num;
if (res >>> 16 != 0) {
res = (res >>> 16) + (res & 0xffff);
}
}
return Integer.toHexString(~res).substring(4);
}
}

结果输出:

285c
true

理解传输层中UDP协议首部校验和以及校验和计算方法的Java实现的更多相关文章

  1. Linux内核--网络栈实现分析(五)--传输层之UDP协议(上)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明出处http://blog.csdn.net/yming0221/article/details/7532512 更多请看专栏, ...

  2. 传输层中的协议 TCP & UDP

    面向连接的TCP协议 “面向连接”就是在正式通信前必须要与对方建立起连接.比如你给别人打电话,必须等线路接通了.对方拿起话筒才能相互通话.TCP(Transmission Control Protoc ...

  3. Linux内核--网络栈实现分析(九)--传输层之UDP协议(下)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7549340 更多请查看专栏,地 ...

  4. 实验:传输层:UDP协议 学习笔记

    一.传输层协议 从之前介绍的网络层协议来看,通信的两端是两台主机,IP数据报首部就标明了这两台主机的IP地址.但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此,严格地 ...

  5. 传输层:UDP 协议

    一.传输层协议 从之前介绍的网络层协议来看,通信的两端是两台主机,IP 数据报首部就标明了这两台主机的 IP 地址.但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此, ...

  6. 传输层:TCP 协议

    传输层:TCP 协议 一.概述 TCP 和 UDP 处在同一层——运输层,但是它们有很多的不同.TCP 是 TCP/IP 系列协议中最复杂的部分,它具有以下特点: (1) TCP 提供 可靠的 数据传 ...

  7. Excel连接SSAS提示“传输层中遇到错误”的问题

    用Excel连接SSAS,在身份验证时弹出对话框提示“传输层中遇到错误”,后来发现其实就是用户名或密码不对,不知道为何Excel不提示一个明确一点的信息.

  8. TCP/IP 协议图--传输层中的 TCP 和 UDP

    TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP. TCP 是面向连接的.可靠的流协议.流就是指不间断的数据结构,当应用程序采用 TCP 发送消息时,虽然可以保证发送的顺序,但 ...

  9. 计算机网络传输层之TCP协议(tcp协议特点、tcp报文段首部格式、tcp连接建立---三次握手、tcp连接释放---四次握手)

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105516090 学习课程:<2019王道考研计算机网络> 学习目的 ...

随机推荐

  1. circle踢人(约瑟夫环) c++

    这里更新指针法,真的每句都是坑 (寥寥数十句,句句都是坑) // // Created by snnnow on 2020/4/12. //question:转圈,一共N个人,数到M的出列,求最后一个 ...

  2. Vue中数组元素被替换,页面没有动态展示

    原始代码 页面没有相应goodsList替换,打印goodsList数据已经被替换: (借用https://www.cnblogs.com/belongs-to-qinghua/p/11112613. ...

  3. pass 出错问题

    ''' a = 10 b = 8 print("a>b") if a>b else pass pass 为何报错问题: 第一部分:print 第二部分:("a ...

  4. PHP substr_replace() 函数

    实例 把 "Hello" 替换成 "world": <?php高佣联盟 www.cgewang.comecho substr_replace(" ...

  5. 2019 HL SC day4

    自闭场本来 以为 顶多一些不太会 结果发现 一堆不太会 . 树状数组  感觉 好久没看 了有点遗忘 不过还好 现在我来了.莅临之神将会消灭一切知识点哦. 今天说点不一样东西 树状数组 hh 很有用的东 ...

  6. Python自动化运维 技术与最佳实践PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书

    点击获取提取码:7bl4 一.内容简介 <python自动化运维:技术与最佳实践>一书在中国运维领域将有"划时代"的重要意义:一方面,这是国内第一本从纵.深和实践角度探 ...

  7. .NetCore 入门

    .net core是什么? .net core是一个可以用来构建现代.可伸缩和高性能的跨平台软件应用程序的通用开发框架. 我们为什么要使用.net core,也就是说.net core有什么好处? 跨 ...

  8. 《Head First 设计模式》:单件模式

    正文 一.定义 单件模式确保一个类只有一个实例,并提供一个全局访问点. 要点: 定义持有唯一单件实例的类变量. 私有化构造,避免其他类产生实例. 对外提供获取单件实例的静态方法. 二.实现步骤 1.创 ...

  9. springMVC 与 html RESTful 解决方案

    若前端为html 而非jsp  且 拦截如下 <servlet-mapping> <servlet-name>springMVC</servlet-name> &l ...

  10. Python要点总结,我使用了100个小例子!