当前位置: 首页 > 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;重新定义成功与成就…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...