TCP一定可靠吗

devtools/2024/10/18 22:37:15/

背景

公司某个服务发送TCP报文后,得到的响应是非预期数据
原因竟然是:TCP包的 payload 数据某个bit位被翻转,但是 checksum 的值一样,错误的包被分发给了上层服务

Checksum介绍

IP 头有自己的 Checksum,TCP、UDP 也有自己的 Checksum,分别校验不同部分的数据
IP 头的 Checksum 用于校验 IP 头的数据是否正确
TCP 的 Checksum 用于校验 TCP 头、TCP 数据部分是否正确
UDP 的 Checksum 用于校验 UDP 头、UDP 数据是否正确

TCP的校验和(Checksum)是用于检测 TCP 数据包中的数据错误的重要机制
它在数据传输过程中强制执行了数据完整性检查,以确保数据在传输过程中没有被损坏
TCP 校验和是 TCP 头的一部分,它覆盖了 TCP 头和 TCP 数据,还涉及到 IP 头的部分内容

校验和计算原理

TCP校验和是通过一种特定的方法计算出来的,它包括以下几部分内容:

  1. 伪头部(Pseudo-Header)
  2. TCP头
  3. TCP数据

伪头部

伪头部并不是实际传输的数据的一部分,而是一种在计算校验和时,用来增强数据完整性的机制
伪头部包含了一些 IP 层的信息
伪头部总共 12 字节(源IP、目的IP、占位符、协议、TCP长度)
伪头部格式如下
±---------------------±---------------------±---------------------±---------------------+
| 源地址 (32位) | 目的地址 (32位) |
±---------------------±---------------------±---------------------±---------------------+
| 零 (8位) | 协议 (8位) | TCP长度 (16位) |
±---------------------±---------------------+

  • 源地址:发送方的IP地址
  • 目的地址:接收方的IP地址
  • 零:8位的0值
  • 协议:8位的值,6代表TCP协议
  • TCP长度:TCP头和TCP数据部分的总长度,以字节为单位

计算校验和

校验和是通过计算16位字的和,然后取其反码(二进制反码)得到
具体步骤如下:
1、 先将需要计算checksum数据中的checksum设为0
2、 计算checksum的数据按2byte划分开来,每2byte组成一个16bit的值,如果最后有单个byte的数据,补一个byte的0组成2byte
3、 将所有的16bit值累加到一个32bit的值中
4、 将32bit值的高16bit与低16bit相加到一个新的32bit值中,若新的32bit值大于0Xffff,再将新值的高16bit与低16bit相加
5、 将上一步计算所得的16bit值按位取反,即得到checksum值,存入数据的checksum字段即可

校验和字段

TCP头中的第17~18字节(从1开始)是校验和字段
在这里插入图片描述

发送方在计算校验和时,这两个字节初始化为0 (注意,初始化为 0xFFFF 也出现过问题)
计算所得的校验和填充到这两个字节,接收方则通过相同的方式重新计算校验和,并与接收到的校验和进行比较以验证数据完整性
检验和,2B,检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。

示例代码

static u16_t chksum(void *dataptr, u16_t len)
{u32_t acc;u16_t src;u8_t *octetptr;acc = 0;octetptr = (u8_t*)dataptr;while (len > 1) {src = (*octetptr) << 8;octetptr++;src |= (*octetptr);octetptr++;acc += src;len -= 2;}if (len > 0) {src = (*octetptr) << 8;acc += src;

http://www.ppmy.cn/devtools/57878.html

相关文章

在linux系统centos上面安装php7gmp扩展

ps:在ubuntu上面安装gmp(最简单) $ sudo apt-get install php7.0-gmp然后再php.ini添加extensionphp_gmp.so <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<…

1.Python学习笔记

一、环境配置 1.Python解释器 把程序员用编程语言编写的程序&#xff0c;翻译成计算机可以执行的机器语言 安装&#xff1a; 双击Python3.7.0-选择自定义安装【Customize installation】-勾选配置环境变量 如果没有勾选配置环境变量&#xff0c;输入python就会提示找不到命令…

什么是数据分析?数据分析如何创造企业发挥价值?

数据分析是在具体的业务场景下&#xff0c;如何借助工具&#xff0c;通过数据解决问题的思路 数据底层的四大优势 1.可反复读取和使用 2.客观 3.量化 4.机器可处理 使用数据指导业务&#xff0c;基于数据量化生产 只要是基于量化的信息提升生产力&#xff0c;就是数据分析&a…

关于C#如何在打开新界面时,将旧界面的指定数据发送到新界面的方法

关于C#如何在打开新界面时&#xff0c;将旧界面的指定数据发送到新界面的方法 1.主界面代码1.打开的新界面代码 1.主界面代码 private void Btn_Click(object sender, RoutedEventArgs e) {string value1 "NULL";string value2 "NULL";string value3 &…

在Conda环境中高效使用Kubernetes:跨平台容器化实践指南

摘要 Conda 是一个流行的跨平台包和环境管理器&#xff0c;广泛用于Python社区。而 Kubernetes 是一个开源的容器编排系统&#xff0c;用于自动化部署、扩展和管理容器化应用程序。本文将探讨如何在 Conda 环境中使用 Kubernetes&#xff0c;包括设置 Conda 环境、容器化应用程…

(vue)eslint-plugin-vue版本问题 安装axios时npm ERR! code ERESOLVE

(vue)eslint-plugin-vue版本问题 安装axios时npm ERR! code ERESOLVE 解决方法&#xff1a;在命令后面加上 -legacy-peer-deps结果&#xff1a; 解决参考&#xff1a;https://blog.csdn.net/qq_43799531/article/details/131403987

Cocos Creator 游戏性能优化指南

性能优化 引言一、减少Draw Call什么是Draw Call&#xff1f;为什么要减少Draw Call&#xff1f;减少Draw Call的方法1、剔除I、视锥剔除&#xff1a;摄像机的位置和视角形成一个视锥体&#xff0c;只有位于视锥体内的对象才会被渲染。可以通过检查对象的包围盒&#xff08;Bou…

【链表】【双指针】1、合并两个有序链表+2、分隔链表+3、删除链表的倒数第N个结点+4、链表的中间结点+5、合并两个链表

3道中等2道简单 数组和字符串打算告一段落&#xff0c;正好最近做的几乎都是双指针&#xff0c;所以今天做链表&#xff01; 1、合并两个有序链表&#xff08;难度&#xff1a;简单&#xff09; 该题对应力扣网址 AC代码 思路简单 /*** Definition for singly-linked list.…