checkSum的计算_tcp checksum计算-程序员宅基地

技术标签: udp  checkSum  网络协议  计算机网络  

目录

1、Introduction

 2、CheckSum Function(GO)

3、demo(GO)


1、Introduction

        下面主要介绍IP协议与UDP协议中校验和的计算(TCP与UDP类似),主要是自己记录一下,以后可以快速使用。传输层的以 UDP 为例。

        IP与UDP的校验和算法是一样的,都遵循 RFC1071。唯一的不同在于 IP 校验和的范围只包含 IP 头部,而 UDP 则包含 伪头部,UDP 头部 和 数据部分。UDP及其伪头部如下图所示。

 2、CheckSum Function(GO)

func checksum(data []byte) uint16 {
	csum := uint32(0)
	length := len(data) - 1
	for i := 0; i < length; i += 2 {
		csum += uint32(data[i]) << 8
		csum += uint32(data[i+1])
	}
	if len(data)%2 == 1 {
		csum += uint32(data[length]) << 8
	}
	for csum > 0xffff {
		csum = (csum >> 16) + (csum & 0xffff)
	}
	return ^uint16(csum)
}

3、demo(GO)

package main

import (
	"golang.org/x/sys/unix"
	"log"
	"net"
)

func checksum(data []byte) uint16 {
	csum := uint32(0)
	length := len(data) - 1
	for i := 0; i < length; i += 2 {
		// For our test packet, doing this manually is about 25% faster
		// (740 ns vs. 1000ns) than doing it by calling binary.BigEndian.Uint16.
		csum += uint32(data[i]) << 8
		csum += uint32(data[i+1])
	}
	if len(data)%2 == 1 {
		csum += uint32(data[length]) << 8
	}
	for csum > 0xffff {
		csum = (csum >> 16) + (csum & 0xffff)
	}
	return ^uint16(csum)
}

func rawSocket(ifaceName string) (fd int, err error) {
	protol := (unix.ETH_P_ALL<<8)&0xff00 | unix.ETH_P_ALL>>8
	fd, err = unix.Socket(unix.AF_PACKET, unix.SOCK_RAW, int(protol))
	if err != nil {
		return -1, err
	}
	ifIndex := 0
	if ifaceName != "" {
		iface, err := net.InterfaceByName(ifaceName)
		if err != nil {
			return -1, err
		}
		ifIndex = iface.Index
	}
	s := &unix.SockaddrLinklayer{
		Protocol: uint16(protol),
		Ifindex:  ifIndex,
	}
	err = unix.Bind(fd, s)
	return fd, err
}

var buff = []byte{0,12,41,222,152,91,0,12,41,222,152,91,8,0,69,0,0,38,159,34,64,0,64,17,0,0,192,168,2,201,192,168,2,201,
	29,50,29,49,0,18,0,0,1,1,1,1,1,1,1,1,1,1}

func main(){
	fd, _ := rawSocket("ens33")
	// ip
	cs := checksum(buff[14:34])
	buff[24] = byte(cs >> 8)
	buff[25] = byte(cs & 0xff)
	// udp
	ud := make([]byte, 12 + 8 + 10)
	copy(ud[:4], buff[26:30])
	copy(ud[4:8], buff[30:34])
	ud[8] = 0
	ud[9] = 17
	ud[10] = 0
	ud[11] = 18
	copy(ud[12:], buff[34:])
	ucs := checksum(ud)
	buff[40] = byte(ucs >> 8)
	buff[41] = byte(ucs & 0xff)
	log.Print(buff)
	unix.Write(fd, buff)
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37437983/article/details/120452103

智能推荐

Opencv学习——霍夫圆变换_vector<vec3f> circles; int min_dis = 120; int para-程序员宅基地

文章浏览阅读275次。HoughCircles()函数:void HoughCircles( InputArray image, OutputArray circles, int method, double dp, double minDist, double param1 = 100, ..._vector circles; int min_dis = 120; int param1 = 45

破解锐捷3.35-0618的密码_锐捷网关登录解密-程序员宅基地

文章浏览阅读1.8w次。我们上校园网时多半都让锐捷记住了密码,有可能时间久了会把密码忘掉,这样充值时就会有点麻烦。解决办法:1、凭证到网络中心去问;2、运行锐捷,先不要认证,用WinHex打开进程8021x.exe的整个内存,搜索用户名,在其后附近即可看到密码;3、打开注册表项[HKEY_LOCAL_MACHINE\SOFTWARE\锐捷网络\Ruijie Supplicant],将Password和Passwordle_锐捷网关登录解密

【go/vscode】远程环境搭建(离线版/传统插件版)_go vscode 离线安装插件-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏6次。文章目录说在前面VS Code离线安装VS Code Extensions离线安装下载Go插件插件地址插件下载(Windows)错误处理1远程主机安装测试补全跳转说在前面vscode 版本:golang 版本测试环境:wsl(ubuntu)VS Code离线安装VS Code Extensions离线安装下载Go插件插件地址网上很多教程有离线下载的地址,但是有的博文年代久远,链接未维护,所以这里使用的是vscode github地址插件gocodegopkgsgo-_go vscode 离线安装插件

psql常用简单命令_psq 连接命令-程序员宅基地

文章浏览阅读208次。psql的命令都是以"“开头,且可不加”;"1. 数据库相关1.1 连接数据库psql -h 127.0.0.1 -p 5432 -U postgres -d DB_NAME1.2 断开数据库连接\q1.3 查看数据库列表\lstudent=# \l List of databases Name ..._psq 连接命令

Android init.rc启动shell脚本_android rc service 没法启动shell 脚本-程序员宅基地

文章浏览阅读2.1k次。最近在解决客户的一个问题的时候,帮忙调试了一个开机脚本,其中涉及了部分SELinux的权限的配置,因此记录一下,该案例基于amlogicS905L3A芯片开发,在AndroidP上进行的测试,在其他设备上大同小异,请自行查找或替换为对应的路径。注AndroidP上为了区分系统和厂商定制化内容,脚本应编译至vendor/bin下,而不是system/bin下。..._android rc service 没法启动shell 脚本

黑马程序员pink老师前端入门教程,零基础必看的JavaScript基础语法视频教程(DOM)_黑马前端pink-程序员宅基地

文章浏览阅读686次。APIDOMDOM简介什么是DOMDOM树获取元素getElementById获取元素得到一个元素对象object用dir打印,还可以得到它的属性 div#timegetElementsByTagName获取对象集合_黑马前端pink

随便推点

浅谈简洁与全面,智能与可配置_简约与智能-程序员宅基地

文章浏览阅读4.2k次。我在写上一篇文章Visual Studio Intellisense、Eclipse Content Assist与理念式编程对比Visual Studio和Eclipse时对两个开发环境在功能、界面上的风格差异有些感想,联想思索之下发挥成这篇文章。主要谈的是各种产品设计上体现出的两对趣味相异的理念,可见于机械、电子、软件等各个行业,文中举的例子来自我比较熟悉的软件业。简洁与全面简洁与综合..._简约与智能

RTL8211E应用(一)之芯片功能介绍-程序员宅基地

文章浏览阅读6.6k次,点赞2次,收藏11次。TL8211E是Realtek瑞昱推出的一款高集成的网络接收PHY芯片,它符合10Base-T,100Base-TX和1000Base-T IEEE802.3标准,可以通过CAT 5 UTP电缆及CAT 3 UTP电缆传输网络数据,该芯片在网络通信中属于物理层,用于MAC与PHY之间的数据通信。目前有RTL8211E-VB-CG、RTL8211E-VL-CG、RTL8211EG-VB-CG等三个版本。主要应用于网络接口适配器,网络集线器,网关以及一些嵌入式设备当中。RTL8211E的主要功能特性包括_8211e

解决: Message: invalid selector: Compound class names not permitted报错的问题-程序员宅基地

文章浏览阅读2.4k次。对于出现消息:无效的选择器:不允许使用复合类名的问题?该页面解析:原始代码:self.driver.find_element_by_class_name('s-btn btn-ok').click()问题:代码出现如下清空:Traceback (most recent call last):File "D:\CollectionOverview\unittest\p..._message: invalid selector: compound class names not permitted

创建React App + Express 前后台交互项目_react 和express 如何交互-程序员宅基地

文章浏览阅读2.1k次。创建express app 全局安装 express-generator $ npminstall-g express-generator 创建express app $express react-backend 安装依赖包 $ npminstall目录: 修改react-backend/routes/users.js, 返回简单的..._react 和express 如何交互

软件工程-图书馆管理系统_以开发图书馆为例,根据所学过的软件工程中的开发软件方法和步骤,完成需求分析阶段-程序员宅基地

文章浏览阅读3.2w次,点赞41次,收藏562次。随着计算机和网络技术的飞速发展,计算机的应用领域不断扩大。在现代大学图书馆管理系统中,如何为读者提供方便快捷的服务,提高图书的利用率等问题变得越来越突出。图书馆管理系统正是趋于这个目标而设计的。本文首先介绍了课题的研究目的及现状,给出课题的研究目标和意义;以MicroSoft Visio、Project、Rose、VSS、Power Designer为例学习计算机辅助软件工程工具的基本使用方法,在理论的基础上完成了系统的设计。本文主要包括以下几个方面:(1)进行系统需求分析,采用MicroSoft_以开发图书馆为例,根据所学过的软件工程中的开发软件方法和步骤,完成需求分析阶段

springCloud→Stream:实战_server.port = ${}-程序员宅基地

文章浏览阅读626次。SpringCloud Stream之消费者环境搭建测试环境搭建1、cloud-stream-rabbitmq-consumer88022、pom <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-_server.port = ${}