【golang基础】校验和计算

2023-11-11

首先,IP、ICMP、UDP和TCP报文头都有检验和字段,大小都是16bit,算法基本上也是一样的。
在发送数据时,为了计算数据包的检验和。应该按如下步骤:
1、把校验和字段设置为0;
2、把需要校验的数据看成以16位为单位的数子组成,依次进行二进制反码求和;
3、把得到的结果存入校验和字段中
在接收数据时,计算数据包的检验和相对简单,按如下步骤:
1、把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段;
2、检查计算出的校验和的结果是否为0;
3、如果等于0,说明被整除,校验和正确。否则,校验和就是错误的,协议栈要抛弃这个数据包。

虽然说上面四种报文的校验和算法一样,但是在作用范围存在不同:IP校验和只校验20字节的IP报头;而ICMP校验和覆盖整个报文(ICMP报头+ICMP数据);UDP和TCP校验和不仅覆盖整个报文,而且还有12个字节的IP伪首部,包括源IP地址(4字节)、目的IP地址(4字节)、协议(2字节)、TCP/UDP包长(2字节)。另外UDP、TCP数据报的长度可以为奇数字节,所以在计算校验和时需要在最后增加填充字节0(填充字节只是为了计算校验和,可以不被传送)。

package main

import (
	"fmt"
	"encoding/hex"
)

func IPv4CheckSum(data []byte) uint16 {
	var (
		sum    uint32
		length int = len(data)
		index  int
	)
	//以每16位为单位进行求和,直到所有的字节全部求完或者只剩下一个8位字节(如果剩余一个8位字节说明字节数为奇数个)
	for length > 1 {
		sum += uint32(data[index])<<8 + uint32(data[index+1])
		index += 2
		length -= 2
	}
	//如果字节数为奇数个,要加上最后剩下的那个8位字节
	if length > 0 {
		sum += uint32(data[index])
	}
	//加上高16位进位的部分
	sum += (sum >> 16)
	//别忘了返回的时候先求反
	return uint16(^sum)
}

func main() {
	//ipv4的checksum在第10字节开始
	//str := "4500002831c840008006952dc0a8d901c0a8d987" //校验和952d
	//str := "4500002831c8400080060000c0a8d901c0a8d987"
	str := "4500005831cd400080060000c0a8d901c0a8d987"   //94f8
	b, _ := hex.DecodeString(str)

	encodedStr := hex.EncodeToString(b)
	fmt.Printf(" bytes-->%02x \n", b)
	fmt.Printf("string-->%s \n", encodedStr)

	ret := IPv4CheckSum(b)
	fmt.Printf("ret:%x \n", ret)
}

运行结果:
[root@localhost]# go run checksum.go
bytes–>4500005831cd400080060000c0a8d901c0a8d987
string–>4500005831cd400080060000c0a8d901c0a8d987
ret:94f8

针对ipv4和ipv6的校验和计算,可以参考nff-go的checksum.go。
ipv6校验和计算,linux内核参考:__sum16 csum_ipv6_magic(const struct in6_addr *saddr,const struct in6_addr *daddr,__u32 len, __u8 proto, __wsum csum)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【golang基础】校验和计算 的相关文章

  • UNIX系统调用监视器

    如何监控进程的系统调用 Check strace http linux die net man 1 strace 在最简单的情况下 strace 运行指定的命令直到退出 它拦截并记录进程调用的系统调用以及进程接收的信号 每个系统调用的名称
  • awk/Unix 分组依据

    有这个文本文件 name age joe 42 jim 20 bob 15 mike 24 mike 15 mike 54 bob 21 试图得到这个 计数 joe 1 jim 1 bob 2 mike 3 Thanks awk F NR
  • 如何在 Bash 中给定超时后终止子进程?

    我有一个 bash 脚本 它启动一个子进程 该进程时不时地崩溃 实际上是挂起 而且没有明显的原因 闭源 所以我对此无能为力 因此 我希望能够在给定的时间内启动此进程 如果在给定的时间内没有成功返回 则将其终止 有没有simple and r
  • 按进程名称过滤并记录 CPU 使用情况

    Linux 下有选项吗顶部命令 https www man7 org linux man pages man1 top 1 html我可以在哪里按名称过滤进程并将每秒该进程的 CPU 使用情况写入日志文件 top pgrep 过滤输出top
  • 使用 Grep 查找两个短语之间的文本块(包括短语)

    是否可以使用 grep 来高亮所有以以下内容开头的文本 mutablePath CGPathCreateMutable 并以以下内容结尾 CGPathAddPath skinMutablePath NULL mutablePath 这两个短
  • 安装 R 包。包含目录为空。开发标头

    我目前正在尝试运行一些最初在 2 11 0 下运行的 R 代码 我使用的 R 版本 2 14 1 无法运行该代码 我不熟悉 R 及其向后兼容性 据我所知 我的问题可能与版本无关 我会很高兴得知这是我做错的事情 其余的代码是无关紧要的 即使我
  • 用户的完整 UNIX 用户名

    想知道您是否知道是否有一种巧妙的方法可以从 shell 获取完整的用户名 示例 如果我的 UNIX 用户名是 froyo 那么我想获取我的全名 在本例中 如系统中注册的那样 froyo Abhishek Pratap Finger 命令可以
  • 在 UNIX 中删除相同的文件

    我正在处理大量 30 000 个 大小约为 10MB 的文件 其中一些 我估计 2 实际上是重复的 我只需要为每个重复的对 或三元组 保留一个副本 您能建议我一种有效的方法吗 我正在unix上工作 您可以尝试使用此代码片段在删除之前先获取所
  • fork 和 exec 之间的区别

    两者有什么区别fork and exec 指某东西的用途fork and exec它体现了 UNIX 的精神 它提供了一种非常简单的方法来启动新进程 The fork调用基本上复制了当前进程 在almost任何方式 并非所有内容都会被复制
  • 安装SIGTSTP前台进程

    我正在尝试为正在运行的前台进程安装 CTRL Z SIGTSTP 处理程序 我设置了处理程序 sigaction 就在我之前wait在父级中 这是正确的地方吗 好像不太好用 EDIT 我正在写一个外壳 这是我的代码的概要 我目前在父级中设置
  • 使用 sed 将反斜杠替换为斜杠[重复]

    这个问题在这里已经有答案了 我需要更换 with 我有一个文件 其中包含 test test2 test3 test4 I tried VRS Ruta cat ruta lst sed s g sed s g output test te
  • 如何将命令输出作为多个参数传递给另一个命令

    我想将命令的每个输出作为多个参数传递给第二个命令 例如 grep pattern input returns file1 file2 file3 我想复制这些输出 例如 cp file1 file1 bac cp file2 file2 b
  • 是否可以在unix cut 命令中使用字符串作为分隔符?

    如果我想使用字符串作为分隔符来剪切文本列表 这可能吗 例如 我有一个目录 其中一系列 shell 脚本调用相同的 perl 脚本 abc pl 所以当我这样做时 grep abc pl 在该目录中 它给了我以下结果 xyz sh abc p
  • 如何使用 Perl 在 Unix 中获取文件创建时间

    如何使用 perl 在 unix 中获取文件创建时间 我有这个命令显示文件的最后修改时间 perl MPOSIX le print strftime d b Y H M localtime lstat 9 for ARGV file txt
  • 如何创建路径别名?

    那么 cs 将映射到 College 以便我可以运行命令 cd cs 我相信您在问如何创建符号链接 或符号链接 例如 ln s College cs 不过 还有其他方法可以加快工作流程 例如设置 CDPATH export CDPATH C
  • Git - 致命:无法获取当前工作目录?

    When I git clone从回购协议中 我得到 fatal Could not get current working directory No such file or directory 我该怎么办 我检查了服务器并发现 git文
  • import java 导入错误:没有名为 java 的模块

    我似乎遇到了障碍 根本无法解决这个问题 任何人都可以帮我弄清楚为什么我无法导入 java 模块吗 Error Traceback most recent call last File datasource config py line 3
  • 如何使用 bash 粘贴来自单独文件的列?

    我想用分隔符 合并不同的列表 第一个列表有 2 个单词 cat first one who 第二个列表有 10000 个单词 cat second languages more simple advanced home expert tes
  • 如何将文本数据从 ruby​​ 控制台传递到剪贴板而不保存到文件?

    我试图将我创建的全局变量中包含的数组传递到我的 mac 上的剪贴板中 它很长 所以我不想在控制台上突出显示 复制和粘贴 我想使用嵌入式unix代码 特别是pbcopyMac 笔记本电脑控制台的功能 允许我将文本传递到我的计算机剪贴板中 准备
  • 如何在 VIm 和终端中始终拥有相同的当前目录?

    我希望我的终端当前目录跟随我的 VIM 目录 Example 在终端中 gt pwd gt Users rege gt vim 然后在VIM中 cd Users rege project

随机推荐

  • AndroidStudio内各个模拟器的安装位置

    As中 下载的本地模拟器的位置位于 android avd目录下 当该目录被删除后 打开AndroidStudio的AVD 会发现所有的下载过的模拟器都没有了
  • 【2021-04-07华为机试】第二题:各任务执行完毕需要的时间

    题目 给定N个任务 1 lt N lt 100 任务编号从0开始顺序累加 这N个任务在系统中排队顺序执行 每个任务的自身执行时间为非负整数 依次为t1 t2 tn 部分任务之间存在依赖关系的 某任务所依赖的任务如果没有执行 则该任务需要重回
  • IDEA 中设置自动补全方法

    最近转用 IDEA 但习惯于 Eclipse 的快捷键和快捷输入 以下是在 IDEA 中增添快捷键和快捷输入的方法 1 File Settings 2 Editor Live Templates Add Template Group gt
  • Ant Design Pro新增页面步骤

    新增页面步骤 根据页面结构规范创建页面文件后 接着在项目根目录寻找config文件夹下的routes js中添加该页面项的路由配置 如创建子路由则在父路由下定义routes属性 值为一个数组 数组中为该路由的子路由路由配置项 如下图 exp
  • 微信隐藏功能系列3:微信关闭朋友圈广告推送

    我们使用微信好多年了 这个工具不仅仅在社交上为我们带来许多好处 工作 消费中也是给我们带来不少方便之处 大家对微信隐藏功能了解多少 本期分享 微信关闭朋友圈广告推送 虽然微信为我们带来许多方便 但令人不适的东西也是有的 广告就是其中之一 特
  • python如何创建二维数组

    关于python中的二维数组 主要有list和numpy array两种 好吧 其实还有matrices 但它必须是2维的 而numpy arrays ndarrays 可以是多维的 两者可以相互转化 下边是两者区别 数组list gt g
  • linux va_start 编译,如何把unix 下的c程序移植到suse linux下,编译出错?

    FILE gfp out stdout 第45行 报 err c 45 error initializer element is not constant include int err set info char ps error typ
  • c++:STL容器及其接口(string、vector、deque、stack、queue、list、set/multiset、map/multimap)

    STL Standard Template Library 标准模板库 目录 一 STL 六大组件简介 二 string容器 2 1 string容器基本概念 2 2 string 构造函数 2 3 string基本赋值操作 2 4 str
  • 第五章可视化

    1散点图 1 代码 A 未处理异常值 import ggplot as gp import pandas as pd import numpy as np crime pd read csv crimeRatesByState2005 cs
  • git交互式暂存 git add -i 这个骚操作存在的意义为何

    文章目录 启用交互暂存 暂存常用的命令 交互暂存的意义在哪 应该场景的进一步说明 你已经能非常熟练的使用 git了 暂存是其中最基本的操作了 交互暂存是暂存的高级用法 虽然可以不用 但是在某些特定场景下 可以提高我们的工作效率 下边请看详细
  • Opencv3.1+python2.7的CentOS7安装

    time Jan 13 2016 20 29 author duanxxnj 163 com 花了两天时间才把Openv3 1的Python安装完成 中间遇到了好多奇怪的错误 在这里记录下整个安装过程 系统环境 Duanxx CentOS
  • js debugger的两种方式

    第一种 在js代码中加上debugger class ReactiveEffect constructor fn scheduler this fn fn this scheduler scheduler this active true
  • HDU - 6126 Give out candies

    Give out candies 题解 第一次遇见这样处理的网络流模型 将问题转换成最小割问题 具体的题解参考自 传送门 先将每个人的拆成m个人 然后s向第1人连边流量为inf 第i个人向第i 1个人连边 流量为 3000 w 将t视为每组
  • 自用IdeaVim配置

    具体配置如下 nnoremap
  • STL之set集合容器

    set集合容器实现了红黑树 Red Black Tree 的平衡二叉检索树的的数据结构 在插入元素时 它会自动调整二叉树的排列 把该元素放到适当的位置 以确保每个子树根节点的键值大于左子树所有节点的键值 而小于右子树所有节点的键值 另外 还
  • 校门外的树C语言详解

    题目描述 某校大门外长度为 l 的马路上有一排树 每两棵相邻的树之间的间隔都是 1 米 我们可以把马路看成一个数轴 马路的一端在数轴 0 的位置 另一端在 l 的位置 数轴上的每个整数点 即 0 1 2 l 都种有一棵树 由于马路上有一些区
  • 自动化办公:4、 Python操作PDF

    1 相关介绍 PyPDF2 读取 写入 分割 合并PDF文件 pdfplumber 读取 PDF 文件中内容和提取 PDF 中的表格 pip install PyPDF2 pip install pdfplumber 2 批量拆分 将一个完
  • 2017“编程之美”终章:AI之战勇者为王

    编者按 8月15日 第六届微软 编程之美 挑战赛在选手的火热比拼中圆满落下帷幕 编程之美 挑战赛是由微软主办 面向高校学生开展的大型编程比赛 自2012年起 微软每年都在革新比赛命题 紧跟时代潮流 如今的 编程之美 挑战赛已成为优秀学子切磋
  • 火爆科研圈的三维重建技术:Neural radiance fields (NeRF)

    如果说最近两年最火的三维重建技术是什么 相信NeRF 1 是一个绝对绕不过去的名字 这项强到逆天的技术 一经提出 就被众多研究者所重视 对该技术进行深入研究并提出改进已经成为一个热点 仅仅过了不到两年的时间 NeRF及其变种已经成为重建领域
  • 【golang基础】校验和计算

    首先 IP ICMP UDP和TCP报文头都有检验和字段 大小都是16bit 算法基本上也是一样的 在发送数据时 为了计算数据包的检验和 应该按如下步骤 1 把校验和字段设置为0 2 把需要校验的数据看成以16位为单位的数子组成 依次进行二