TCP一定可靠吗

news2024/11/27 0:41:21

背景

公司某个服务发送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.coloradmin.cn/o/1903536.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux系统】动态库和静态库 动态库加载

认识动态库静态库 我们有没有使用过库呢&#xff1f;-- 用过c、c的标准库 c的各种函数&#xff0c;c的各种STL容器&#xff0c;我们使用他们内部必须得有具体实现。 Linux: .so(动态库) .a(静态库) Windows: .dll(动态库) .lib(静态库) 库是拿来给别人使用的&#xff0c;所…

Spring源码十六:Bean名称转化

在上一篇Spring源码十五&#xff1a;Bean的加载 中我们通过前面的案例方法&#xff0c;找到了Spring真正开始创建Bean的入口&#xff0c;也就是doGetBean方法。该方法是Spring框架中Bean创建与获取的核心逻辑&#xff0c;实现了复杂的Bean生命周期管理。通过单例缓存、合并Bean…

文章解读与仿真程序复现思路——太阳能学报EI\CSCD\北大核心《计及电-热-氢负荷与动态重构的主动配电网优化调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【双一流高校主办,Springer-LNICST出版,EI稳定检索】2024年应用计算智能、信息学与大数据国际会议(ACIIBD 2024,7月26-28)

2024年应用计算智能、信息学与大数据国际学术会议&#xff08;ACIIBD 2024&#xff09;将于2024年7月26-28日在中国广州举办。会议将聚焦于计算智能及其应用、信息、大数据等相关的研究领域&#xff0c; 广泛邀请国内外知名专家学者&#xff0c;共同探讨相关学科领域的最新发展…

Maya崩溃闪退常见原因及解决方案

Autodesk Maya 是一款功能强大的 3D 计算机图形程序&#xff0c;被电影、游戏和建筑等各个领域的设计师广泛使用。然而&#xff0c;Maya 就像任何其他软件一样可能会发生崩溃问题。在前文中&#xff0c;小编给大家介绍了3ds Max使用V-Ray渲染时的崩溃闪退解决方案&#xff1a; …

电路基础知识汇总

1.0 串连&#xff0c;并联&#xff0c;混连 串联的定义 电路串联是一种电路元件的连接方式&#xff0c;其中各个元件沿着单一路径互相连接&#xff0c;形成一个连续的链。在串联电路中&#xff0c;每个节点最多只连接两个元件&#xff0c;这意味着电流只有一条路径可以通过整个…

“来来来,借一步说话”,让前端抓狂的可视化大屏界面。

可视化大屏的前端开发难度要远远高于普通前端&#xff0c;尤其是当设计师搞出一些花哨的效果&#xff0c;很容易让UI和前端陷入口水大战中。 可视化大屏的前端开发相比普通前端开发的难度要高&#xff0c;主要是因为以下几个方面&#xff1a; 1. 数据量大&#xff1a; 可视化…

01:spring

文章目录 一&#xff1a;常见面试题1&#xff1a;什么是Spring框架&#xff1f;1.1&#xff1a;spring官网中文1.2&#xff1a;spring官网英文 2&#xff1a;谈谈自己对于Spring IOC和AOP的理解2.1&#xff1a;IOCSpring Bean 的生命周期主要包括以下步骤&#xff1a; 2.2&…

STM32-输入捕获IC和编码器接口

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. 输入捕获IC1.1 输入捕获IC简介1.2 频率测量1.3 输入捕获通道1.4 主从触发模式1.5 输入捕获基本结构1.6 PWMI基本结构 2. 输入捕获库函数及代码2.1 输入捕获库函数2.2 6-6 输入捕获模式测频率2.2.1 硬件连接2.2.2 硬…

DevEco Studio无法识别本地模拟器设备的解决方法

目录 场景 解决办法 方式1 方式2 场景 有很多小伙伴遇到过安装了手机模拟器, 但是开发工具设备栏不识别手机设备的问题, 如下图,明明模拟器都安装了,并启动, 但为什么设备栏不显示呢? 解决后的截图,应该是这样(其实跟 android 类似 )

拓扑排序,PageRank(markov),实对称矩阵等

拓扑排序 多件事情有先后顺序&#xff0c;如何判断哪个先哪个后 拓扑排序算法&#xff1a; 1.读入图时&#xff0c;需要记录每个顶点的入度&#xff0c;以及相邻的所有顶点 2.将入度为0的顶点入队&#xff08;先进先出&#xff09; 3.取出队首元素a&#xff0c;&#xf…

检测到弱密码:并非所有密码套件均支持完全前向保密解决方案

问题 检测到弱密码&#xff1a;并非所有密码套件均支持完全前向保密&#xff08;弱密码套件 - ROBOT 攻击&#xff1a;服务器支持易受攻击的密码套件&#xff09; 背景介绍 HTTP 协议自身没有加密机制&#xff0c;但可以通过与 TLS (Transport Layer Security) / SSL (Secur…

QThread moveToThread的妙用

官方文档描述 总结就是移动到线程的对象不能有父对象&#xff0c;执行start即起一个线程&#xff0c;示例是将myObject移动到主线程中。QT中这种方式起一个线程是非常简单的。 示例描述以及代码 描述往Communicate线程中频繁添加任务&#xff0c;等任务结束的时候统计计算的结…

用C#调用Windows API向指定窗口发送按键消息详解与示例

文章目录 1. 按键消息的定义及功能2. 引入所需的命名空间3. 定义Windows API函数4. 定义发送消息的方法5. 获取窗口句柄6. 调用API发送按键消息7. 使用示例注意事项总结 在C#中调用Windows API向指定窗口发送按键消息是一种常见的操作&#xff0c;这通常用于自动化脚本、游戏辅…

中国科学技术大学发布了2024年少年班录取名单

7月7日&#xff0c;中国科学技术大学发布了2024年少年班录取名单公示&#xff0c;来自上海的12岁“小孩哥”刘尧进入名单。 据澎湃新闻此前报道&#xff0c;刘尧是因为此前通过了中科大少年班的校测考试&#xff0c;提前拿到了“高考体验券”。他所在的上海市实验学校&#xff…

Vue3+.NET6前后端分离式管理后台实战(二十九)

1&#xff0c;Vue3.NET6前后端分离式管理后台实战(二十九)

go语言Gin框架的学习路线(六)

gin的路由器 Gin 是一个用 Go (Golang) 编写的 Web 框架&#xff0c;以其高性能和快速路由能力而闻名。在 Gin 中&#xff0c;路由器是框架的核心组件之一&#xff0c;负责处理 HTTP 请求并将其映射到相应的处理函数上。 以下是 Gin 路由器的一些关键特性和工作原理的简要解释…

【Unity2D 2022:Particle System】添加拾取粒子特效

一、创建粒子特效游戏物体 二、修改粒子系统属性 1. 基础属性 &#xff08;1&#xff09;修改发射粒子持续时间&#xff08;Duration&#xff09;为3s &#xff08;2&#xff09;取消勾选循环&#xff08;Looping&#xff09; &#xff08;2&#xff09;修改粒子存在时间&…

《梦醒蝶飞:释放Excel函数与公式的力量》9.4 NPV函数

9.4 NPV函数 NPV函数是Excel中用于计算净现值的函数。净现值&#xff08;Net Present Value, NPV&#xff09;是财务管理和投资决策中常用的指标&#xff0c;用于评估投资项目的价值。NPV表示的是未来一系列现金流的现值总和减去初始投资后的余额。 9.4.1 函数简介 NPV函数通…

【位运算】基础算法总结

目录 基础位运算给一个数n&#xff0c;确定它的二进制表示的第x位是0还是1将一个数n的二进制表示的第x位修改成1将一个数n的二进制表示的第x位修改成0位图思想&#xff08;哈希表&#xff09;提取一个数&#xff08;n&#xff09;二进制表示中的最右侧的1&#xff08;lowbit&am…