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

计算机网络(7) 错误检测

一.校验和

使用补码计算校验和是一种常见的错误检测方法,应用于网络协议如IP和TCP。补码是二进制数的一种表示方法,可以有效地处理符号位和进位。下面是如何利用补码计算校验和的详细步骤和算数例子。

### 计算步骤

1. **将数据分块**:将数据分成16位(2字节)一块。
2. **求和**:将所有16位块的值求和,如果求和结果超过16位,则将高位的进位加回到结果中。
3. **取反**:将最终的和取反,得到校验和。

### 算数例子

假设我们有一个简单的数据序列,用于计算IP或TCP校验和。这里以16进制表示的数据序列为例:

```
4500 003C 1C46 4000 4006 B1E6 C0A8 0001 C0A8 00C7
```

#### 第一步:分块

将数据分成16位(2字节)一块:

```
4500
003C
1C46
4000
4006
B1E6
C0A8
0001
C0A8
00C7
```

#### 第二步:求和

将每个16位块转换为十进制并求和,注意每一步保持结果在16位以内(即如果有进位,则将进位加回到和中):

```
4500 -> 0x4500 = 17664
003C -> 0x003C = 60
1C46 -> 0x1C46 = 7238
4000 -> 0x4000 = 16384
4006 -> 0x4006 = 16390
B1E6 -> 0xB1E6 = 45542
C0A8 -> 0xC0A8 = 49320
0001 -> 0x0001 = 1
C0A8 -> 0xC0A8 = 49320
00C7 -> 0x00C7 = 199
```

将这些值相加:

```
17664 + 60 + 7238 + 16384 + 16390 + 45542 + 49320 + 1 + 49320 + 199 = 201118
```

由于这个和超过16位,我们需要将进位加回:

```
201118 = 0x313AE (以16进制表示)
将0x313AE分解为16位和进位部分:
0x313AE = 0x13AE + 0x30000 = 5038 + 3 = 5041 (0x13AE + 3 = 0x13B1)
```

所以最终的和为:

```
5041 = 0x13B1
```

#### 第三步:取反

将最终的和取反,得到校验和:

```
0x13B1 -> 取反 -> 0xEC4E
```

所以,校验和为:

```
0xEC4E
```

### 代码示例

下面是上述计算过程的Python实现:

```python
def calculate_checksum(data):
    checksum = 0
    # 将数据分块,每块16位(2字节)
    for i in range(0, len(data), 2):
        word = (data[i] << 8) + (data[i + 1] if (i + 1) < len(data) else 0)
        checksum += word
        # 如果有进位,则加回到结果中
        if checksum > 0xFFFF:
            checksum = (checksum & 0xFFFF) + 1
    # 取反
    checksum = ~checksum & 0xFFFF
    return checksum

# 示例数据,以字节数组形式表示
data = [
    0x45, 0x00, 0x00, 0x3C, 0x1C, 0x46, 0x40, 0x00,
    0x40, 0x06, 0xB1, 0xE6, 0xC0, 0xA8, 0x00, 0x01,
    0xC0, 0xA8, 0x00, 0xC7
]

# 计算校验和
checksum = calculate_checksum(data)
print("校验和: 0x{:04X}".format(checksum))
```

### 解释

1. **分块**:将数据分成16位一块。
2. **求和**:将所有块的值相加,如果超过16位,将进位部分加回到和中。
3. **取反**:将最终的和取反,得到校验和。

通过这个例子,我们可以清楚地看到如何利用补码计算校验和,这种方法在网络协议中广泛应用,确保数据传输的完整性和正确性。

解释

  1. 分块:将数据分成16位一块。
  2. 求和:将所有块的值相加,如果超过16位,将进位部分加回到和中。
  3. 取反:将最终的和取反,得到校验和。

通过这个例子,我们可以清楚地看到如何利用补码计算校验和,这种方法在网络协议中广泛应用,确保数据传输的完整性和正确性。

校验和的工作原理

校验和的目的是检测数据传输中的错误。当发送方发送数据时,它计算数据的校验和,并将这个校验和附加到数据包中。接收方在接收到数据包后,会重新计算数据的校验和,并将这个校验和与接收到的校验和进行比较。如果两个校验和相同,说明数据在传输过程中没有错误;如果不同,则表示数据在传输过程中发生了错误。

取反的作用

取反的目的是使得校验和的计算能够检测到尽可能多的错误类型。具体原因如下:

  1. 生成全零结果:取反后,当接收方计算校验和时,将所有数据块、校验和以及取反结果相加,如果数据传输没有错误,总和应该为全1(即0xFFFF)。这个全1结果取反后应该是全0(即0x0000)。如果数据在传输过程中发生了变化,总和将不会是全1,取反后也不会是全0,从而可以检测到错误。

  2. 错误检测的增强:通过取反,可以确保即使某些位翻转(例如1变成0或0变成1),校验和也能更有效地检测到这些错误。取反增加了检测到单个位错误和多位错误的可能性,从而增强了校验和的错误检测能力。

二.CRC校验(循环冗余码)

 

 

相关文章:

计算机网络(7) 错误检测

一.校验和 使用补码计算校验和是一种常见的错误检测方法&#xff0c;应用于网络协议如IP和TCP。补码是二进制数的一种表示方法&#xff0c;可以有效地处理符号位和进位。下面是如何利用补码计算校验和的详细步骤和算数例子。 ### 计算步骤 1. **将数据分块**&#xff1a;将数…...

实体类status属性使用枚举类型的步骤

1. 问题引出 当实体类的状态属性为Integer类型时&#xff0c;容易写错 2. 初步修改 把状态属性强制为某个类型&#xff0c;并且自定义一些可供选择的常量。 public class LessonStatus {public static final LessonStatus NOT_LEARNED new LessonStatus(0,"未学习"…...

pytorch基础【4】梯度计算、链式法则、梯度清零

文章目录 梯度计算计算图&#xff08;Computational Graph&#xff09;梯度求导&#xff08;Gradient Computation&#xff09;函数与概念 示例代码更多细节梯度求导的过程梯度求导的基本步骤示例代码注意事项总结 链式法则是什么&#xff1f;链式法则的数学定义链式法则在深度…...

mapreduce综合应用案例 — 招聘数据清洗

MapReduce是一个编程模型和处理大数据集的框架&#xff0c;它由Google开发并广泛使用于分布式计算环境中。MapReduce模型包含两个主要的函数&#xff1a;Map和Reduce。Map函数用于处理输入的键值对生成中间键值对&#xff0c;Reduce函数则用于合并Map函数输出的具有相同键的中间…...

发力采销,京东的“用户关系学”

作者 | 曾响铃 文 | 响铃说 40多岁打扮精致的城市女性&#xff0c;在西藏那曲的偏远农村&#xff0c;坐着藏民的摩托车&#xff0c;行驶在悬崖边的烂泥路上&#xff0c;只因为受顾客的“委托”&#xff0c;要寻找最原生态的藏区某款产品。 30多岁的憨厚中年男性&#xff0c;…...

期望23K,go高级社招面试复盘

面经哥只做互联网社招面试经历分享&#xff0c;关注我&#xff0c;每日推送精选面经&#xff0c;面试前&#xff0c;先找面经哥 我最终还是上岸了&#xff0c;花了一周总结了3万字的go社招高级面试知识体系思维导图&#xff0c;分享出来希望能帮助有缘人吧&#xff0c;以下只是…...

电感(线圈)具有哪些基本特性

首先&#xff0c;电感&#xff08;线圈&#xff09;具有以下基本特性&#xff0c;称之为“电感的感性电抗” ?①直流基本上直接流过。 ?②对于交流&#xff0c;起到类似电阻的作用。 ?③频率越高越难通过。 下面是表示电感的频率和阻抗特性的示意图。 在理想电感器中&#…...

tkinter实现一个GUI界面-快速入手

目录 一个简单界面输出效果其他功能插入进度条文本框内容输入和删除标签内容显示和删除 一个简单界面 含插入文本、文本框、按钮、按钮调用函数 # -*- coding: UTF-8 -*-import tkinter as tk from tkinter import END from tkinter import filedialog from tkinter impor…...

Top10在线音频剪辑软件,你了解几款?(免费分享)

多年来&#xff0c;随着音乐制作人和音频工程师的需求不断增长&#xff0c;音频剪辑软件领域经历了巨大的发展。最新的音频剪辑软件提供了从基本录制到最终发布所需的一切功能。其中一些软件专为播客设计&#xff0c;一些软件是免费的&#xff0c;并且一些软件提供了出色的音效…...

mysql报错:You can‘t specify target table ‘Person‘ for update in FROM clause

背景 在做leetcode里数据库的196题删除重复数据时&#xff0c;我参考评论区大佬的方法先用group by找到每个分组里的最小的id的那条记录&#xff0c;然后删掉原表中id不在其中的记录&#xff0c;然后就报了如题所示的错误。 我的写法如下&#xff1a; DELETE FROMPerson WHER…...

Python sorted()方法

sorted() 是Python中的一个内置函数&#xff0c;用于对可迭代对象进行排序。它返回一个新的已排序的列表&#xff0c;而不会修改原始的可迭代对象。sorted() 函数的基本语法如下&#xff1a; sorted(iterable, keyNone, reverseFalse)参数解释&#xff1a; iterable&#xff…...

云上宝库:三大厂商对象存储安全性及差异性比较

前言 看了几家云厂商的对象存储&#xff0c;使用上有相似也有差异&#xff0c;聊聊阿里云、腾讯云、京东云三家对象存储在使用中存在的风险以及防护措施。 0x01 云存储命名 阿里云对象存储OSS(Object Storage Service)&#xff0c;新用户免费试用三个月&#xff0c;存储包容…...

【计算机网络体系结构】计算机网络体系结构实验-www实验

二、www实验 1. 添加网站 2. 浏览器打开...

Windows下MySQL数据库定期备份SQL文件与删除历史备份文件.bat脚本

目录 一、功能需求 二、解决方案 (1)新建文件夹及批处理文件 (2)编写备份脚本 ①完整脚本 ②参数修改 (3)编写定期删除备份脚本 ①根据文件名识别日期进行删除 ② 根据文件的修改日期删除 (4)设置定时器 (5)常见报错与处理 一、功能需求 在Windows系统下…...

electron基础使用

安装以及运行 当前node版本18&#xff0c;按照官网提供操作&#xff0c;npm init进行初始化操作&#xff0c;将index.js修改为main.js&#xff0c;执行npm install --save-dev electron。&#xff08;这里我挂梯子下载成功了。&#xff09;&#xff0c;添加如下代码至package.…...

9.华为交换机telnet远程管理配置aaa认证

目的&#xff1a;telnet远程管理设备 LSW1配置 [Huawei]int Vlanif 1 [Huawei-Vlanif1]ip add 1.1.1.1 24 [Huawei-Vlanif1]q [Huawei]user-interface vty 0 4 [Huawei-ui-vty0-4]authentication-mode aaa [Huawei-ui-vty0-4]q [Huawei]aaa [Huawei-aaa]local-user admin pass…...

xcode报错合集,你都遇到过哪些跳不过的坑

1.报错Consecutive declarations on a line must be separated by ; 其实我这里是用因为创建了一个结构体&#xff0c;然后在没有使用State的情况下&#xff0c;修改它的属性了 当然加上State依然报错&#xff1a; 应该在UI事件中修改&#xff1a;...

六面体大米装袋机长期稳定运行原因分析

随着现代化农业生产的发展&#xff0c;六面体大米装袋机已成为粮食加工行业不可或缺的重要设备。然而&#xff0c;如何确保这些机器长期稳定运行&#xff0c;提高生产效率&#xff0c;降低维护成本&#xff0c;一直是广大粮食加工企业关注的焦点。星派将为您揭示六面体大米装袋…...

android的surface

相信很多Android开发者都知道Canvas类是UI的画布&#xff08;虽然这种说法并不严谨&#xff09;&#xff0c;因为我们在Canvas上完成各种图形的绘制&#xff0c;那么我们Activity上的各种交互控件又是如何展示并渲染到屏幕上的呢&#xff0c;所以在另一个层面上也有一个“画布”…...

Z世代职场价值观的重塑:从“班味”心态到个人成长的追求

近日&#xff0c;社交平台Soul APP联合上海市精神卫生中心&#xff08;俗称“宛平南路600号”&#xff09;发布《2024年Z世代职场心理健康报告》&#xff08;下称“报告”&#xff09;&#xff0c;发现今天的年轻人正以其独特的价值观和行为模式&#xff0c;重新定义成功与成就…...

CameraFileCopy:创新实现手机摄像头离线文件传输的完整解决方案

CameraFileCopy&#xff1a;创新实现手机摄像头离线文件传输的完整解决方案 【免费下载链接】cfc Demo/test android app for libcimbar. Copy files over the cell phone camera! 项目地址: https://gitcode.com/gh_mirrors/cfc/cfc 在无线网络无处不在的今天&#xff…...

宝丽来胶片模拟不等于加噪点!深度拆解Polaroid SX-70光学特性与MJ v6渲染引擎的4层映射偏差,附12组可直接复用的--sref哈希值

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;宝丽来SX-70胶片的光学本质与历史语境 宝丽来SX-70胶片并非传统意义上的“静态感光材料”&#xff0c;而是一套高度集成的自显影光学化学系统。其核心在于多层涂布结构中嵌入的镜面反射层、碱性催化剂囊…...

N8N + Cherry Studio 本地大模型对接|全踩坑保姆级指南(Docker 版)

标签&#xff1a;#N8N #CherryStudio #本地大模型 #AI自动化 #避坑指南 摘要&#xff1a;本文完整记录 Docker 部署的 N8N 对接 Cherry Studio 本地中转服务&#xff0c;从网络连通、接口鉴权、节点选型、模型命名等多维度&#xff0c;整理所有报错原因与可直接复制的解决方案&…...

Whisky完全指南:在macOS上轻松运行Windows程序的终极方案

Whisky完全指南&#xff1a;在macOS上轻松运行Windows程序的终极方案 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 还在为macOS上无法运行某些Windows专属软件而烦恼吗&#xff1f…...

Camunda流程版本管理避坑指南:从Version Tag查询到迁移验证,这些细节决定成败

Camunda流程版本管理实战精要&#xff1a;从精准查询到安全迁移的全链路策略 在企业级流程自动化领域&#xff0c;Camunda作为领先的工作流引擎&#xff0c;其版本管理机制直接影响着业务系统的稳定性和迭代效率。本文将深入剖析版本管理的核心痛点&#xff0c;提供一套覆盖全…...

PentAGI:面向红队实战的开源渗透测试Agent系统

1. 这不是另一个“AI安全”的概念玩具&#xff0c;而是一套能真正进红队实战的渗透测试Agent系统你有没有遇到过这样的场景&#xff1a;在一次内部红队演练中&#xff0c;刚摸到一台边缘业务服务器&#xff0c;想快速判断它是否暴露了Jenkins未授权访问、Confluence远程代码执行…...

从模型文件到孪生场景:一个Three.js三维模型管理系统的完整产品化思考

从技术原型到商业产品&#xff1a;构建Three.js数字孪生系统的全栈实践 在数字孪生技术快速渗透工业制造、智慧城市等领域的今天&#xff0c;如何将一个基于Three.js的模型展示Demo转化为真正具备商业价值的企业级管理系统&#xff1f;这个问题困扰着许多掌握前端3D技术的开发者…...

美团/京东/淘宝闪购外卖红包天天领取口令推荐最新发布今日实测有效的外卖红包每天免费领取入口

今日实测有效可领取外卖红包口令是&#xff1a;淘宝APP在闪购外卖下搜索外卖红包领取口令【 188288 】、美团APP搜索外卖红包领取口令是【 188288 】、词令直达美团/京东/淘宝闪购外卖红包领取口令是【 188288 】。作为天天点外卖的上班族&#xff0c;每天下单前先通过推荐的外…...

2026年AI辅助研发趋势:智能知识问答如何重塑企业知识库的未来?

在2026年的当下&#xff0c;大模型技术已经从最初的"聊天玩具"逐渐渗透到企业级研发的毛细血管中。作为深耕DevOps领域的架构师&#xff0c;我观察到一个显著的变化&#xff1a;企业知识库&#xff08;Knowledge Base&#xff09;正在从单纯的"文档存储中心&quo…...

Linux运维:Jenkins部署

Jenkins 完整部署流程 一句话总结&#xff1a;Jenkins 是自动化流水线工具&#xff0c;把"代码提交→编译打包→测试→部署上线"全流程自动化&#xff0c;不用人工一步步操作。一、先搞懂核心逻辑 Jenkins 就像一个自动化机器人&#xff0c;你告诉它"代码提交后…...