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

TCP报文校验和(checksum)计算

一. 原理

将TCP相关内容(TCP伪头部+TCP头部+TCP内容)转换成16比特的字符,然后进行累加,最后结果进行取反。TCP伪头部是固定的,下文有相关代码展示。

二. 源码

  1. 源码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ether.h>// 伪头部结构体
struct pseudo_header {uint32_t source_address;uint32_t dest_address;uint8_t zero;uint8_t protocol;uint16_t tcp_length;
};// 计算16位校验和
uint16_t calculate_checksum(uint16_t *buff, int size) {uint32_t sum = 0;while (size > 1) {sum += *buff++;size -= 2;}if (size > 0) {sum += *buff & 0xFF;}while (sum >> 16) {sum = (sum & 0xFFFF) + (sum >> 16);}return (uint16_t)(~sum);
}// 计算TCP校验和
uint16_t calculate_tcp_checksum(struct iphdr *ip_hdr, uint8_t *tcp_packet, int tcp_len) {struct pseudo_header pshdr;uint16_t *header_ptr;int total_len = sizeof(struct pseudo_header) + tcp_len;pshdr.source_address = ip_hdr->saddr;pshdr.dest_address = ip_hdr->daddr;pshdr.zero = 0;pshdr.protocol = IPPROTO_TCP; // TCP protocol number, =6pshdr.tcp_length = htons(tcp_len);// Allocate memory for pseudo header and TCP packetuint8_t *data = malloc(total_len);memcpy(data, (char *)&pshdr, sizeof(struct pseudo_header));memcpy(data + sizeof(struct pseudo_header), tcp_packet, tcp_len);// Calculate checksumuint16_t checksum = calculate_checksum((uint16_t *)data, total_len);free(data);return checksum;
}int main() {//IP信息char ip_head[] = {0x45, 0x00, 0x00, 0xc8, 0x14, 0x2b, 0x40, 0x00,0x3f, 0x06, 0xa3, 0x2f, 0xc0, 0xa8, 0x01, 0x21,0xc0, 0xa8, 0x01, 0x64};//TCP包信息(头+内容)char tcp_packet[] = {0x05, 0x99, 0xd6, 0x83, 0x8a, 0x4a, 0x40, 0x80, 0x42, 0xa8, 0x40, 0x65, 0x80, 0x18, 0x01, 0xfa,0x65, 0x15, 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0xf3, 0x31, 0xdc, 0x0f, 0xa4, 0xd3, 0x50, 0x8d,0x04, 0x01, 0x00, 0x94, 0x00, 0x36, 0x01, 0x00, 0xaa, 0x7c, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x0a,0x0f, 0x33, 0x00, 0x27, 0x00, 0x73, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x65, 0x00, 0x70, 0x00, 0x27,0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x20,0x00, 0x61, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x67, 0x00, 0x6e,0x00, 0x69, 0x00, 0x7a, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x62, 0x00, 0x75, 0x00, 0x69,0x00, 0x6c, 0x00, 0x74, 0x00, 0x2d, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x66, 0x00, 0x75,0x00, 0x6e, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6e,0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x2e, 0x00, 0x04, 0x76, 0x00, 0x72, 0x00, 0x72, 0x00,0x70, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xfd, 0x02, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00};// Calculate TCP checksumprintf("TCP old checksum: 0x%02X%02X\n", tcp_packet[16], tcp_packet[17]);tcp_packet[16] = tcp_packet[17] = 0; //先将checksum置空// uint16_t checksum = calculate_tcp_checksum(0x2101a8c0, 0x6401a8c0, tcp_packet, sizeof(tcp_packet)); uint16_t checksum = calculate_tcp_checksum((struct iphdr *)ip_head, tcp_packet, sizeof(tcp_packet)); printf("TCP new checksum: 0x%04X\n", htons(checksum)); //为了打印,需要将主机序换成网络序号(真实赋值給tcp头时不需要转换)return 0;
}

gcc -o tcp_checksum_test tcp_checksum_test.c 即可以生成相应可执行程序(本测试运行环境ubuntu)
2. 结果
在这里插入图片描述

相关文章:

TCP报文校验和(checksum)计算

一. 原理 将TCP相关内容&#xff08;TCP伪头部TCP头部TCP内容&#xff09;转换成16比特的字符&#xff0c;然后进行累加&#xff0c;最后结果进行取反。TCP伪头部是固定的&#xff0c;下文有相关代码展示。 二. 源码 源码 #include <stdio.h> #include <stdlib.h&…...

【ue5】虚幻5同时开多个项目

正常开ue5项目我是直接在桌面点击快捷方式进入 只会打开一个项目 如果再想打开一个项目需要进入epic 再点击启动就可以再开一个项目了...

【Python实战因果推断】23_倾向分3

目录 Propensity Score Matching Inverse Propensity Weighting Propensity Score Matching 另一种控制倾向得分的常用方法是匹配估计法。这种方法搜索具有相似可观测特征的单位对&#xff0c;并比较接受干预与未接受干预的单位的结果。如果您有数据科学背景&#xff0c;您可…...

Qt源码解析之QObject

省去大部分virtual和public方法后&#xff0c;Qobject主要剩下以下成员&#xff1a; //qobject.h class Q_CORE_EXPORT Qobject{Q_OBJECTQ_PROPERTY(QString objectName READ objectName WRITE setObjectName NOTIFY objectNameChanged)Q_DECLARE_PRIVATE(QObject) public:Q_I…...

【算法专题】模拟算法题

模拟算法题往往不涉及复杂的数据结构或算法&#xff0c;而是侧重于对特定情景的代码实现&#xff0c;关键在于理解题目所描述的情境&#xff0c;并能够将其转化为代码逻辑。所以我们在处理这种类型的题目时&#xff0c;最好要现在演草纸上把情况理清楚&#xff0c;再动手编写代…...

分库分表真的适合你的系统吗?

曾几何时&#xff0c;“并发高就分库&#xff0c;数据大就分表”已经成了处理 MySQL 数据增长问题的圣经。 面试官喜欢问&#xff0c;博主喜欢写&#xff0c;候选人也喜欢背&#xff0c;似乎已经形成了一个闭环。 但你有没有思考过&#xff0c;分库分表真的适合你的系统吗&am…...

9 redis,memcached,nginx网络组件

课程目标: 1.网络模块要处理哪些事情 2.reactor是怎么处理这些事情的 3.reactor怎么封装 4.网络模块与业务逻辑的关系 5.怎么优化reactor? io函数 函数调用 都有两个作用:io检测 是否就绪 io操作 1. int clientfd = accept(listenfd, &addr, &len); 检测 全连接队列…...

【MySQL】事务四大特性以及实现原理

事务四大特性 原子性&#xff08;Atomicity&#xff09; 事务中的所有操作要么全部完成&#xff0c;要么全部不执行。如果事务中的任何一步失败&#xff0c;整个事务都会被回滚&#xff0c;以保持数据的完整性。 一致性&#xff08;Consistency&#xff09; 事务应确保数据库…...

【控制Android.bp的编译】

1.首先Android.bp的语法是不支持if 条件语句的 2.查到可以用enabled来控制Android.bp中的模块是否参与编译&#xff0c;但是并不能实现动态的控制&#xff0c;比如你需要根据获取到的安卓版本来控制一个Android.bp是否编译&#xff0c;是无法做到的。enabled只能是固定的true或…...

【车载开发系列】J-Link/JFlash 简介与驱动安装方法

【车载开发系列】J-Link/JFlash 简介与驱动安装方法 【车载开发系列】J-Link/JFlash 简介与驱动安装方法 【车载开发系列】J-Link/JFlash 简介与驱动安装方法一. 软件介绍二. 下载安装包二. 开始安装三. 确认安装四. J-Flash的使用 一. 软件介绍 J-Link是SEGGER公司为支持仿真…...

207 课程表

题目 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示如果要学习课程 ai 则 必须 先学习课程 bi 。 …...

罗剑锋的C++实战笔记学习(一):const、智能指针、lambda表达式

1、const 1&#xff09;、常量 const一般的用法就是修饰变量、引用、指针&#xff0c;修饰之后它们就变成了常量&#xff0c;需要注意的是const并未区分出编译期常量和运行期常量&#xff0c;并且const只保证了运行时不直接被修改 一般的情况&#xff0c;const放在左边&…...

宁德时代天行发布,商用车超充时代来临

近日&#xff0c;宁德时代正式推出商用动力电池品牌——“宁德时代天行”&#xff0c;同时发布“宁德时代天行轻型商用车&#xff08;L&#xff09;-超充版”和“宁德时代天行轻型商用车&#xff08;L&#xff09;-长续航版”两款产品&#xff0c;可实现4C超充能力和500km的实况…...

硅纪元应用评测 | 弱智吧大战GPT4o和Claude 3.5 Sonnet

"硅纪元AI应用测评"栏目&#xff0c;深入解析和评测最新的人工智能应用&#xff0c;提供专业见解和实用建议。不论您是AI专家还是科技爱好者&#xff0c;都能找到权威、详尽的测评&#xff0c;帮助您在快速发展的AI领域中做出最佳选择。一起探索AI的真实潜力&#xf…...

注意力机制 attention Transformer 笔记

动手学深度学习 这里写自定义目录标题 注意力加性注意力缩放点积注意力多头注意力自注意力Transformer 注意力 注意力汇聚的输出为值的加权和 查询的长度为q&#xff0c;键的长度为k&#xff0c;值的长度为v。 q ∈ 1 q , k ∈ 1 k , v ∈ R 1 v {\bf{q}} \in {^{1 \times…...

开始尝试从0写一个项目--后端(二)

实现学生管理 新增学生 接口设计 请求路径&#xff1a;/admin/student 请求方法&#xff1a;POST 请求参数&#xff1a;请求头&#xff1a;Headers&#xff1a;"Content-Type": "application/json" 请求体&#xff1a;Body&#xff1a; id 学生id …...

【图解大数据技术】Hive、HBase

【图解大数据技术】Hive、HBase Hive数据仓库Hive的执行流程Hive架构数据导入Hive HBaseHBase简介HBase架构HBase的列式存储HBase建表流程HBase数据写入流程HBase数据读取流程 Hive Hive是基于Hadoop的一个数据仓库工具&#xff0c;Hive的数据存储在HDFS上&#xff0c;底层基于…...

composables 目录下的文件(web前端)

composables 目录通常用于存放可组合的函数或逻辑&#xff0c;这些函数或逻辑可以在不同的组件中复用。具体来说&#xff0c;composables 目录下的文件通常包含以下内容&#xff1a; 组合式函数 (Composable Functions)&#xff1a; 这些函数利用 Vue 3 的组合式 API&#xff0…...

使用Python绘制堆积柱形图

使用Python绘制堆积柱形图 堆积柱形图效果代码 堆积柱形图 堆积柱形图&#xff08;Stacked Bar Chart&#xff09;是一种数据可视化图表&#xff0c;用于显示不同类别的数值在某一变量上的累积情况。每一个柱状条显示多个子类别的数值&#xff0c;子类别的数值在柱状条上堆积在…...

DP:二维费用背包问题

文章目录 &#x1f3b5;二维费用背包问题&#x1f3b6;引言&#x1f3b6;问题定义&#x1f3b6;动态规划思想&#x1f3b6;状态定义和状态转移方程&#x1f3b6;初始条件和边界情况 &#x1f3b5;例题&#x1f3b6;1.一和零&#x1f3b6;2.盈利计划 &#x1f3b5;总结 &#x1…...

工业镜头设计实战:用ZEMAX从零搭建一个线扫镜头(波长、视场、F数设置避坑指南)

工业镜头设计实战&#xff1a;用ZEMAX从零搭建一个线扫镜头&#xff08;波长、视场、F数设置避坑指南&#xff09; 在机器视觉领域&#xff0c;线扫镜头因其高分辨率、大视场和稳定的成像质量&#xff0c;成为工业检测、印刷品质量控制和半导体检测等场景的首选。与普通面阵镜头…...

别再瞎画了!用嘉立创4层板+Si9000搞定50欧阻抗匹配的保姆级教程

从零掌握50Ω阻抗匹配&#xff1a;嘉立创4层板与Si9000实战指南 在2.4GHz无线通信项目中&#xff0c;许多工程师常陷入一个典型误区——试图用双层板实现精确的50Ω阻抗匹配。这种尝试往往事倍功半&#xff0c;就像用普通螺丝刀拆卸精密手表零件。本文将带您穿透表象&#xff…...

2021 年 3 月青少年软编等考 C 语言四级真题解析

目录 T1. 酒鬼 思路分析 T2. 重启系统 思路分析 T3. 鸣人的影分身 思路分析 T4. 宠物小精灵之收服 思路分析 T1. 酒鬼 题目链接:SOJ D1053 Santo 刚刚与房东打赌赢得了一间在 New Clondike 的大客厅。今天,他来到这个大客厅欣赏他的奖品。房东摆出了一行瓶子在酒吧上。瓶子…...

【问题】cursor无法识别python包

目录 问题描述解决方法 问题描述 pip install -e .安装的python可以正常导入&#xff0c;不报错&#xff0c;但cursor无法跳转&#xff0c;这应该怎么修复呢&#xff1f; 解决方法 在cursor的打开目录中新建pyrightconfig.json&#xff0c;填入extraPaths路径&#xff0c; …...

从CTF题到实战:手把手教你用Python的sympy和gmpy2破解RSA变种(附完整脚本)

从CTF题到实战&#xff1a;手把手教你用Python的sympy和gmpy2破解RSA变种&#xff08;附完整脚本&#xff09; 在网络安全竞赛和实际渗透测试中&#xff0c;RSA加密算法的各种变种经常出现。这些变种往往通过引入特殊的数学性质或构造方式&#xff0c;使得标准的RSA攻击方法失效…...

独角数卡:10分钟开启数字商品自动售卖新时代

独角数卡&#xff1a;10分钟开启数字商品自动售卖新时代 【免费下载链接】dujiaoka &#x1f984;独角数卡(自动售货系统)-开源站长自动化售货解决方案、高效、稳定、快速&#xff01;&#x1f680;&#x1f680;&#x1f389;&#x1f389; 项目地址: https://gitcode.com/g…...

VSCode 高效开发:配置 Pixel Dream Workshop 模型调用的代码片段与插件

VSCode 高效开发&#xff1a;配置 Pixel Dream Workshop 模型调用的代码片段与插件 1. 为什么需要优化开发工作流 如果你经常使用Pixel Dream Workshop这类AI模型进行开发&#xff0c;可能会遇到一个共同痛点&#xff1a;每次调用API时都要重复编写相似的请求代码&#xff0c…...

工业能量:01 电源是谁?开关电源 vs UPS

01 电源是谁?开关电源 vs UPS 在工厂里,最昂贵的不是设备,而是“停机一秒的代价”。 咱今天不聊加班不聊绩效,就拉家常聊聊厂里那个最“低调”的英雄——电源系统。 你以为停电就是灯灭了,大家歇会儿喝口水?兄弟,醒醒!在真工业现场,尤其是半导体、汽车总装、医药车间…...

LinuxMint 22.1(Ubuntu24.04)下通过Wine完美运行同花顺远航版的实战指南

1. 为什么要在LinuxMint上运行同花顺远航版 作为一个长期使用Linux系统的投资者&#xff0c;我深知在Linux平台上找到一款功能完善的行情软件有多难。同花顺Linux原生版虽然能用&#xff0c;但功能停留在基础行情展示&#xff0c;而且自2022年起就停止了更新。这对于习惯使用Wi…...

FPGA时序路径实战解析:从理论到约束的四大关键场景

1. 时序路径基础&#xff1a;FPGA设计的生命线 第一次接触FPGA时序约束时&#xff0c;我盯着时序报告里密密麻麻的路径延迟数据发懵——这些红色警告就像交通信号灯&#xff0c;而我完全看不懂它们的规则。直到真正理解了时序路径这个概念&#xff0c;才明白它其实就是FPGA设计…...