当前位置: 首页 > ds >正文

深入浅出讲解UDP检验中如何计算检验和

一、计算机中的进制:二进制与十六进制

1. 十进制(Decimal)
  • 特点:用0-9表示,逢10进1。

  • 例子:数字 123 表示 1×102+2×101+3×1001×102+2×101+3×100。

2. 二进制(Binary)
  • 特点:用0和1表示,逢2进1。

  • 例子:二进制 1101 转为十进制:

    1×23+1×22+0×21+1×20=8+4+0+1=131×23+1×22+0×21+1×20=8+4+0+1=13
  • 快速转换

    • 二进制 → 十进制:记住权值 20=1,21=2,22=4,23=820=1,21=2,22=4,23=8,逐位相加。

    • 十进制 → 二进制:不断除以2取余数,倒序排列。

      13 ÷ 2 = 6 余 1 → 最低位
      6 ÷ 2 = 3 余 0
      3 ÷ 2 = 1 余 1
      1 ÷ 2 = 0 余 1 → 最高位
      结果为 1101
3. 十六进制(Hexadecimal)
  • 特点:用0-9和A-F(A=10, B=11, ..., F=15)表示,逢16进1。

  • 例子1A3 转为十进制:

    1×162+10×161+3×160=256+160+3=4191×162+10×161+3×160=256+160+3=419
  • 二进制 ↔ 十六进制快速转换

    • 每4位二进制对应1位十六进制(不足补0)。

      二进制 1101 0011 → D3(1101=D, 0011=3)
      十六进制 F → 1111

二、为什么UDP需要校验和?

  • 核心目的:检测数据传输过程中是否发生位错误(如电磁干扰导致0变1或1变0)。

  • 设计特点

    • UDP本身不保证可靠性,但校验和是可选的安全基线。

    • 校验失败时,UDP直接丢弃数据包,不会重传。


三、UDP校验和的计算步骤

1. 数据分片
  • 将UDP报文(头部+数据)按16位(2字节)分组,不足则补0。

    示例数据(十六进制):
    源端口:11 22
    目的端口:33 44
    长度:00 08(8字节)
    校验和:00 00(初始值)
    数据:AA BB CC DD
    → 分片为:1122, 3344, 0008, 0000, AABB, CCDD
2. 反码求和
  • 反码(Ones' Complement):二进制数按位取反(0→1,1→0)。

  • 计算步骤

    1. 所有16位分片按二进制相加。

    2. 若结果超过16位(溢出),将溢出部分加到低位(循环进位)。

    3. 对最终结果取反码,即为校验和。

3. 实际计算示例
  • 示例数据(用十六进制简化计算):

    分片:0x1122, 0x3344, 0x0008, 0x0000, 0xAABB, 0xCCDD
  • 步骤1:十六进制直接相加

    1122+3344+0008+0000+AABB+CCDD1122+3344+0008+0000+AABB+CCDD

    转换为十进制计算:

    1122 = 4386
    3344 = 13124
    0008 = 8
    0000 = 0
    AABB = 43707
    CCDD = 52445
    总和 = 4386 + 13124 + 8 + 0 + 43707 + 52445 = 113,670
  • 步骤2:处理溢出

    • 113,670 转为二进制:11011101100000110(17位,溢出1位)。

    • 循环进位:将溢出的1加到低位:

      剩余16位:1011101100000110(十进制为 47,622)
      加溢出位:47,622 + 1 = 47,623 → 0xB9E7(十六进制)
  • 步骤3:取反码

    • 0xB9E7 的二进制:1011100111100111

    • 取反码:0100011000011000 → 0x4618

  • 最终校验和:0x4618。


四、验证校验和的接收方行为

  1. 接收方将整个UDP报文(含校验和)按同样步骤计算。

  2. 若计算结果为 0xFFFF(全1),说明数据未损坏。

  3. 否则,数据包被丢弃。


五、趣味记忆法

1. 二进制加法 → 堆积木
  • 想象每16位分片是一堆积木,总和超过高度(溢出)时,把多余的积木移到最下面。

2. 校验和 → 安全封印
  • 发送方将数据包“封印”(校验和),接收方验证封印是否完整。


六、动手实验

1. 用Python计算UDP校验和
import numpy as npdef udp_checksum(data):# 将数据按16位分组(假设data为字节流)if len(data) % 2 != 0:data += b'\x00'  # 补0words = np.frombuffer(data, dtype='>H')  # 大端序读取16位total = sum(words)# 处理溢出(循环进位)while total > 0xFFFF:total = (total & 0xFFFF) + (total >> 16)# 取反码return np.uint16(~total)# 示例数据
data = bytes.fromhex('1122334400080000AABBCCDD')
checksum = udp_checksum(data)
print(f"校验和: 0x{checksum:04X}")  # 输出 0x4618

总结

  • 进制基础:二进制和十六进制是计算机的“母语”,掌握快速转换是理解底层机制的关键。

  • UDP校验和:本质是反码求和,通过简单的位运算实现数据完整性检查。

  • 学习技巧:用代码和实际数据包验证理论,将抽象计算具象化。

http://www.xdnf.cn/news/711.html

相关文章:

  • 标准的JNI (Java Native Interface) 加载函数 JNI_OnLoad
  • 4.凸包-Graham Scan
  • Spring Boot 版本与对应 JDK 版本兼容性
  • SpringCloud小白入门+项目搭建
  • `ImadcnIdentifierGenerator` 深度解析
  • 豆瓣图书数据采集与可视化分析(二)- 豆瓣图书数据清洗与处理
  • priority_queue优先级队列的模拟实现
  • 计算机视觉与深度学习 | RNN原理,公式,代码,应用
  • 手写call,bind,apply
  • 博客系统案例练习2-用户注册-redis
  • 1.69G 雨晨 26100.3909 Windows 11 IoT 企业版 LTSC 24H2 极简
  • ebpf: CO-RE, BTF, and Libbpf(三)
  • BurpSuite 1.4.07 详细使用指南:安装、配置与渗透测试实战
  • OpenCV 模板与多个对象匹配方法详解(继OpenCV 模板匹配方法详解)
  • 零基础上手Python数据分析 (19):Matplotlib 高级图表定制 - 精雕细琢,让你的图表脱颖而出!
  • 初级达梦dba的技能水准
  • C++:详解命名空间
  • 清醒思考的艺术
  • 二叉树的顺序结构及实现
  • 【第一天】一月速通python,第一天基本语法
  • ZYNQ笔记(九):定时器中断
  • (done) 吴恩达版提示词工程 1. 引言
  • 软件测试笔记(测试的概念、测试和开发模型介绍、BUG介绍)
  • C语言之机房机位预约系统
  • oracle认证大师ocm学习
  • 学习笔记:黑马程序员JavaWeb开发教程(2025.3.23)
  • 基于Spring AI Alibaba实现MCP协议的SSE实时流式服务深度解析
  • 肖特基二极管详解:原理、作用、应用与选型要点
  • Cribl 对Windows-xml log 进行 -Removing filed-06
  • PySide6 GUI 学习笔记——常用类及控件使用方法(常用类尺寸QSizeF)