原贴地址:https://blog.csdn.net/djl806943371/article/details/88770493

错误探查三种方式:Checksum(检验和)、Cyclic Redundancy Codes(循环冗余CRC)、Message Authentication Codes(消息身份验证MAC)

大家可以首先做下这个课程中的quiz,如果你的答案跟图中是一致的,说明可能你真的是理解了,如果有一点不一致,说明你对某种错误探查方式有盲点,那么你可以好好看一下这篇文章:

Checksum(校验和):

应用举例:

TCP、IP、UDP使用反码算法计算校验和。传输层、网络层。

IP Checksum实现方式:

首先将校验和位置零,将packet中所有的16-bits以16进制相加,每当要进位时(大于65535),则-65536+1,即进位到最后一位。所有bit加完之后将结果取反作为校验和。这意味着如果把整个包包含校验位的所有bit相加将得到0xffff。

存在一个边界情况,当不包含校验和的所有位相加为0xffff时,不进行取反,因为0代表没有校验位。

优缺点:

非常快,即使是在软件层面进行计算成本都非常低,早期都是在软件层面实现的,因此非常有帮助;

不是特别强大,能绝对保证检验出的错误是1bit发生变化。(关于这点我有以下思考:为什么只有1bit发生变化才能检测到,难道不是只要有奇数位发生变化就会检测到吗。后来我想通了,因为它是以16bit为一个单位进行累加的,而不是每一位累加,因此奇数位发生变化也有可能使校验和不变,比如前16bit:0x0000,后16bit:0x0010,出错后变为前16bit:0x0001,后16bit:0x0001,此时一共三位出错,但是校验和是不变的。因此实际能稳定检验出的错误应该是在同一个16bit中任意1-16bit出现错误都能检测到,但是一旦是跨16bit单位的将不能保证。

Cyclic Redundancy Codes(循环冗余CRC):

应用举例:

USB、BLUETOOTH使用16bit CRC。链路层常用。

实现方式:

本部分摘自https://blog.csdn.net/snow_5288/article/details/73472398。

CRC码由两部分组成,前一部分是k+1个比特的待发送信息(固定不变),后一部分是r个比特的冗余码。 
计算过程中主要用到两个多项式:f(x) 和 G(x)。 f(x) 是一个k阶多项式,其系数是待发送的k+1个比特序列; G(x) 是一个r阶的生成多项式,由发收双方预先约定。CRC校验举例

设实际要发送的信息序列为1010001101(10个比特,k = 9),则以它们作为f(x) 的系数,得到对应的9阶多项式为:


再假设发收双方预先预订了一个5阶(r = 5)的生成多项式:


则其系数序列为110101。

CRC码的产生方法如下:

  • 生成 r 个比特的冗余码:用模2除法进行 x^r f(x) / G(X) 运算,得余数R(x) ,其系数即是冗余码。

其中的余数01110即为冗余码,对应的余式:


注意:模2除法在做减法时不借位,相当于在进行异或运算。

  • 得到带CRC校验的发送序列:用模2减法进行 x^5 f(x) - R(x) 运算得到带CRC校验的发送序列,即x^5 f(x) - R(x) = 101000110101110。形式上看,就是在原信息序列后面附加上冗余码。在接收方,用同样的生成多项式G(x) 除所收到的序列。若余数为0,则表示传输无差错,否则说明传输过程出现差错。若收到的序列是101000110101110,用它除以(即110101),因为余数为0,所以收到的序列无差错。

优缺点:

计算成本比检验和高,但是在如今是很容易实现的,在硬件上很容易实现;

c bit长的CRC,可以检测到任意奇数位错误、两位错误、长度小于等于c位的突发错,比校验和更强大。

Message Authentication Codes(消息身份验证MAC):

应用举例:

Transfer Layer Security(TLS)传输层,主要保证数据的安全。

实现方式:

利用密码学的知识,数据交换双方均持有一个事先约定好的秘密s,则MAC码计算公式:,即c由消息内容及秘密s耦合计算得出。其中秘密s是一组随机产生的bits,因此很难被破解,因此如果不是事先知道这个秘密,是很难得到一条消息的c的,并且即使知道了c,也很难制造另一条消息的c是相同的。因此如果一条来源不明的消息M+c都能通过验证,那么说明对方很大概率已经破解了这个秘密。并且,如果消息中某一位发生了变化,那么计算出来的c中每一位的变化情况是随机的,否则将很容易被破解。

优缺点:

对于检测恶意修改非常有效,但对error效果不是很好;

对于c bit长的MAC,当1bit发生反转时,它有概率MAC值不变。

总结:

看到这里再回头看看开头的quiz是否能做对了吧!其实从quiz结果可以看到,每一种侦测方式都不能保证百分百检测出某些错误,但是各种错误检测方式组合起来,除了提到的几种,应用层一般也会有自己的检测方式,总体来看一个数据包出错而不被检测出来的概率是很小的。这就足够了。

Introduction to Computer Networking学习笔记(九):error detection 错误探查 Checksum、CRC、MAC相关推荐

  1. Introduction to Computer Networking学习笔记(十五):Queue Model 包交换中的缓冲模型

    本章知识点比较零散,因此一篇文章进行总结,并且不具有连贯性,仅记录自己认为有价值的内容. 将较大的包拆分为小包进行传输,可以减小端对端延迟,原因如下图: 数据传输时,突发大量的数据包会增加延迟,简单周 ...

  2. IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法...

    IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法 Author:hmjiangqq Email:jiangqqlmj@163.com ...

  3. python3.4学习笔记(九) Python GUI桌面应用开发工具选择

    python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者 http://www.admin10000.com/document/9 ...

  4. 吴恩达《机器学习》学习笔记九——神经网络相关(1)

    吴恩达<机器学习>学习笔记九--神经网络相关(1) 一. 非线性假设的问题 二. 神经网络相关知识 1.神经网络的大致历史 2.神经网络的表示 3.前向传播:向量化表示 三. 例子与直觉理 ...

  5. ROS学习笔记九:用C++编写ROS发布与订阅

    ROS学习笔记九:用C++编写ROS发布与订阅 本节主要介绍如何用C++编写一个简单的ROS发布与订阅. 编写发布节点 在之前创建的例子beginner_tutorials软件包中,在其目录下的src ...

  6. at24c16如何划分出多个读写区_AVR学习笔记九、基于AT24C16的数据存储实验

    Ema{@AVR 学习笔记九.基于 AT24C16 的数据存储实验 ------- 基于 LT_Mini_M16 9.1 用 I/O 口模拟 I2C 总线实现 AT24C16 的读写 9.1.1 .实 ...

  7. JavaScript学习笔记(九)(验证框架,layer弹出层)

    JavaScript学习笔记(九) 一.jQuery Validate验证框架 1.引入相关插件路径 2. 修改一些规则 3. 自定义验证规则 4.异步验证 整体代码 二.layer弹出层 1.引入相 ...

  8. OpenCV学习笔记(九)——图像轮廓(下)

    <OpenCV轻松入门:面向Python>学习笔记(九) 1-3 查找并绘制轮廓.矩特性及Hu矩 4-5 轮廓拟合及凸包 6. 利用形状场景算法比较轮廓 6.1 计算形状场景距离 6.2 ...

  9. Polyworks脚本开发学习笔记(九)-公差控制及制作报告

    Polyworks脚本开发学习笔记(九)-公差控制及制作报告 定义公差 系统有默认的公差设置,可以在选项中进行系统的默认设置,但往往不是想要的.比如下图的XYZ三向都是-/+1,我想只控制Y向并且公差 ...

  10. 学习笔记 :E1696 C1107 错误提示

    学习笔记 :E1696 C1107 错误提示 错误提示: 错误提示很多,几百个. E1696 命令行错误: 无法打开 元数据 文件 "platform.winmd" Error C ...

最新文章

  1. Python基础(1) - 初识Python
  2. IDL关系运算符Eq Ne Le Lt Gt Ge含义说明
  3. bpython使用_使用Python实现一个简单的A/B测试
  4. CG CTF CRYPTO easy!
  5. Jupyter与PyCharm不可兼得?Jupytext就是你需要的!
  6. 飞天大数据平台助力轻松筹数字化运营
  7. ORA-12504:TNS:监听程序在CONNECT_DATA中未获得SERVICE_NAME
  8. NLP情感分析笔记(三):Faster 情感分析
  9. PowerShell管理SCOM_批量设置维护模式(上 )
  10. Ubuntu18 mongodb 离线安装
  11. userdel: user xxx is currently used by process xxx
  12. [SLAM基础学习简记]非线性优化
  13. 阿里出海遭遇挑战,Lazada三年换三帅仍无法制霸东南亚
  14. 仿朋友圈图片查看功能
  15. 流量变现平台市场分析报告-
  16. 整数、长整型、浮点型、字符串
  17. Linux命令行初体验
  18. 华为Watch Buds耳机为什么降噪不好?
  19. 什么叫磁场强度、磁通势、磁阻、导磁率、电磁力、涡流?
  20. 解决九号老C(C30/C40/C60/C80)电动车坐垫感应失灵的问题

热门文章

  1. Transport level information does not match with SOAP Message namespace URI错误的理解
  2. asp.net学习笔记1
  3. The process cannot access the file '' because it is being used by another process.....
  4. SpringApplication run方法解析:SpringApplicationRunListeners(二)
  5. 面试题之Java中线程的几种状态
  6. Java主线程等待所有子线程执行完毕再执行解决办法集
  7. X 1 BT5kali
  8. Java循环练习: 有1、2、3、4四个数字,能组成多少个无重复数字的三位数?都是多少?...
  9. 雀巢联手京东,发布人工智能家庭营养健康助手
  10. 自动化查询及增加配置参数功能