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. 結果
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/41041.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/41041.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/41041.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

3D雞哥又上開源項目!單圖即可生成,在線可玩

大家好&#xff0c;今天和大家分享幾篇最新的工作 1、Unique3D Unique3D從單視圖圖像高效生成高質量3D網格&#xff0c;具有SOTA水平的保真度和強大的通用性。 如下圖所示 Unique3D 在 30 秒內從單視圖野生圖像生成高保真且多樣化的紋理網格。 例如屬于一張雞哥的打球寫真照 等…

js 遞歸調用 相同對象--數組遞歸調用

<div class="save-cl"> <a-button @click="saveCl" >保存為常用策略</a-button> </div> saveCl(){ console.log(this.form.filterList[0],--------常用策略)// 此對象為上圖對象 console.log(this.allElementsHaveValue(thi…

Windows的管理工具

任務計劃程序&#xff1a;這是一個用來安排任務自動運行的工具。你可以在這里創建新的任務&#xff0c;設定觸發條件&#xff0c;并指定任務的操作。 事件查看器&#xff1a;這是一套日志記錄和分析工具&#xff0c;&#xff0c;你可以了解到系統的工作狀況&#xff0c;幫助診…

損失函數篇

損失函數 1、邊界框損失函數/回歸損失函數bbox_loss 2、分類損失函數cls_loss 3、置信度損失函數obj_loss YOLOv8損失函數 1、概述 通過YOLOv8-訓練流程-正負樣本分配的介紹&#xff0c;我們可以知道&#xff0c;經過預處理與篩選的過程得到最終的訓練數據&#xff1a; a…

微信小程序/uniapp:class和style不生效的問題

非常重要&#xff1a;小程序端不支持 classObject 和 styleObject 語法。 文檔&#xff1a;https://uniapp.dcloud.net.cn/tutorial/vue-basics.html#class-與-style-綁定 目錄 對象語法數組語法字符串語法computed其他方案 對象語法 <!-- class --> <view class&quo…

AI是在幫助開發者還是取代它們?

在這個科技日新月異的時代&#xff0c;人工智能&#xff08;AI&#xff09;已經滲透到了我們生活的方方面面&#xff0c;尤其是在軟件開發和編程領域&#xff0c;其影響更是深遠。AI技術的飛速發展引發了廣泛討論&#xff1a;它究竟是開發者們的得力助手&#xff0c;還是未來可…

2024 年最佳 Figma 字體

字體不僅僅是文本字符&#xff0c;它們還塑造了用戶體驗。從引導用戶瀏覽界面到傳達品牌個性&#xff0c;字體對于設計??至關重要。然而&#xff0c;找到適合您的網站或應用風格的完美字體可能具有挑戰性。 但不要害怕&#xff0c;我們會幫助您&#xff01;請繼續關注&#x…

C語言 指針和數組——指針的算術運算

目錄 指針的算術運算 指針加上一個整數 指針減去一個整數 指針相減 指針的關系比較運算 小結 指針的算術運算 指針加上一個整數 指針減去一個整數 指針相減 指針的關系比較運算 小結 ? 指針變量 – 指針類型的變量&#xff0c;保存地址型數據 ? 指針變量與其他類型…

負載均衡(服務器)

vi /etc/sysconfig/network-scripts/ifcfg-ens33 systemctl restart network 防火墻 systemctl stop firewalld systemctl disable firewalld vi /etc/selinux/config setenforce 0 yum install gcc gcc-c mkdir /lnmp cd /lnmp/ tar -zxvf zlib-1.2.12.tar.gz tar -zxv…

在Ubuntu 16.04上安裝和配置ownCloud的方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站。 簡介 ownCloud 是一個文件共享服務器&#xff0c;允許您將個人內容&#xff08;如文檔和圖片&#xff09;存儲在一個類似 Dropbox 的集…

[C++][CMake][CMake基礎]詳細講解

目錄 1.CMake簡介2.大小寫&#xff1f;3.注釋1.注釋行2.注釋塊 4.日志 1.CMake簡介 CMake是一個項目構建工具&#xff0c;并且是跨平臺的 問題 – 解決 如果自己動手寫Makefile&#xff0c;會發現&#xff0c;Makefile通常依賴于當前的編譯平臺&#xff0c;而且編寫Makefile的…

vue的學習--day3

1、嘗試使用json文件模擬增刪改查 json server:準備一份自己的數據&#xff08;這里我用的是老師給的&#xff09;。 轉到d盤&#xff0c;然后打開json文件&#xff1a; 下面模擬增刪改查&#xff1a; 借助工具postman或apifox或apipost&#xff1a; 這里我下載了apifox&…

前端之CSS篇--面試題總結

CSS的特性&#xff1a;繼承性、層疊性、優先級 優先級&#xff1a;寫css樣式的時候&#xff0c;會給同一個元素添加多個樣式&#xff0c;此時誰的權重搞就顯示誰的樣式。 !important >行內樣式>id>類>標簽>全局選擇器 隱藏元素的方法 display:none 元素在頁面…

產品公告 | MemFire Cloud 現已支持微信授權登錄,為移動應用帶來更便捷的認證服務

MemFire Cloud推出的“開箱即用”的后端服務&#xff0c;提供了云數據庫、身份驗證與授權、云存儲、靜態托管、實時realtime、自動生成API等功能&#xff0c;本次升級新增/優化功能如下&#xff1a; 標題微信授權登錄&#xff08;移動應用&#xff09; 為了順應國內用戶的使用…

Python面試題:如何在 Python 中實現單例模式?

在 Python 中&#xff0c;有多種方法可以實現單例模式&#xff08;Singleton Pattern&#xff09;。單例模式是一種設計模式&#xff0c;確保一個類只有一個實例&#xff0c;并提供一個全局訪問點。以下是幾種常見的方法來實現單例模式&#xff1a; 方法一&#xff1a;使用類變…

Elasticsearch:Ingest architectures - 攝取架構

我們提供各種采集架構&#xff0c;以滿足各種用例和網絡配置的需求。 要將數據采集到 Elasticsearch&#xff0c;請使用最符合你的需求和用例的選項。對于許多用戶和用例來說&#xff0c;最簡單的方法是使用 Elastic Agent 采集數據并將其發送到 Elasticsearch。Elastic Agent…

深度學習——深度學習中感受野的計算

感受野 在卷積神經網絡&#xff08;CNN&#xff09;中&#xff0c;感受野&#xff08;Receptive Field&#xff09; 是一個非常重要的概念。它描述了網絡中某一層的輸出&#xff08;通常是特征圖上的一個像素點&#xff09;所對應的輸入圖像上的空間范圍。這個范圍代表了該輸出…

【CSS】了解grid-template-areas屬性

grid-template-areas 屬性是 CSS Grid 布局中一個非常有用的特性&#xff0c;它允許你通過命名網格區域&#xff08;grid areas&#xff09;來直接控制網格項目的布局。這個屬性通過引用網格容器內部網格項目的名稱來定義網格區域的布局&#xff0c;使得布局的設計更加直觀和易…

SARscape——地理編碼與輻射定標

目錄 一、算法原理1、概述2、參考文獻 二、軟件操作三、結果展示1、原始圖像2、處理結果 一、算法原理 1、概述 SAR系統觀測到的是電磁波入射地球表面后反射&#xff08;后向散射&#xff09;的雷達脈沖的強度和相位信息。這個信息編碼到雷達坐標系統下&#xff0c;即斜距坐標…

DataFrame 的常用操作

DataFrame是什么&#xff1f; DataFrame 是一種用于處理和分析數據的二維標簽數據結構。它類似于Excel中的電子表格或數據庫中的表格&#xff0c;由行和列組成。每個列可以是不同的數據類型&#xff08;如整數、浮點數、字符串等&#xff09;&#xff0c;并且可以進行各種數據操…