Introduction to Computer Networking学习笔记(九):error detection 错误探查 Checksum、CRC、MAC
原贴地址: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相关推荐
- Introduction to Computer Networking学习笔记(十五):Queue Model 包交换中的缓冲模型
本章知识点比较零散,因此一篇文章进行总结,并且不具有连贯性,仅记录自己认为有价值的内容. 将较大的包拆分为小包进行传输,可以减小端对端延迟,原因如下图: 数据传输时,突发大量的数据包会增加延迟,简单周 ...
- IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法...
IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法 Author:hmjiangqq Email:jiangqqlmj@163.com ...
- python3.4学习笔记(九) Python GUI桌面应用开发工具选择
python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者 http://www.admin10000.com/document/9 ...
- 吴恩达《机器学习》学习笔记九——神经网络相关(1)
吴恩达<机器学习>学习笔记九--神经网络相关(1) 一. 非线性假设的问题 二. 神经网络相关知识 1.神经网络的大致历史 2.神经网络的表示 3.前向传播:向量化表示 三. 例子与直觉理 ...
- ROS学习笔记九:用C++编写ROS发布与订阅
ROS学习笔记九:用C++编写ROS发布与订阅 本节主要介绍如何用C++编写一个简单的ROS发布与订阅. 编写发布节点 在之前创建的例子beginner_tutorials软件包中,在其目录下的src ...
- at24c16如何划分出多个读写区_AVR学习笔记九、基于AT24C16的数据存储实验
Ema{@AVR 学习笔记九.基于 AT24C16 的数据存储实验 ------- 基于 LT_Mini_M16 9.1 用 I/O 口模拟 I2C 总线实现 AT24C16 的读写 9.1.1 .实 ...
- JavaScript学习笔记(九)(验证框架,layer弹出层)
JavaScript学习笔记(九) 一.jQuery Validate验证框架 1.引入相关插件路径 2. 修改一些规则 3. 自定义验证规则 4.异步验证 整体代码 二.layer弹出层 1.引入相 ...
- OpenCV学习笔记(九)——图像轮廓(下)
<OpenCV轻松入门:面向Python>学习笔记(九) 1-3 查找并绘制轮廓.矩特性及Hu矩 4-5 轮廓拟合及凸包 6. 利用形状场景算法比较轮廓 6.1 计算形状场景距离 6.2 ...
- Polyworks脚本开发学习笔记(九)-公差控制及制作报告
Polyworks脚本开发学习笔记(九)-公差控制及制作报告 定义公差 系统有默认的公差设置,可以在选项中进行系统的默认设置,但往往不是想要的.比如下图的XYZ三向都是-/+1,我想只控制Y向并且公差 ...
- 学习笔记 :E1696 C1107 错误提示
学习笔记 :E1696 C1107 错误提示 错误提示: 错误提示很多,几百个. E1696 命令行错误: 无法打开 元数据 文件 "platform.winmd" Error C ...
最新文章
- Python基础(1) - 初识Python
- IDL关系运算符Eq Ne Le Lt Gt Ge含义说明
- bpython使用_使用Python实现一个简单的A/B测试
- CG CTF CRYPTO easy!
- Jupyter与PyCharm不可兼得?Jupytext就是你需要的!
- 飞天大数据平台助力轻松筹数字化运营
- ORA-12504:TNS:监听程序在CONNECT_DATA中未获得SERVICE_NAME
- NLP情感分析笔记(三):Faster 情感分析
- PowerShell管理SCOM_批量设置维护模式(上 )
- Ubuntu18 mongodb 离线安装
- userdel: user xxx is currently used by process xxx
- [SLAM基础学习简记]非线性优化
- 阿里出海遭遇挑战,Lazada三年换三帅仍无法制霸东南亚
- 仿朋友圈图片查看功能
- 流量变现平台市场分析报告-
- 整数、长整型、浮点型、字符串
- Linux命令行初体验
- 华为Watch Buds耳机为什么降噪不好?
- 什么叫磁场强度、磁通势、磁阻、导磁率、电磁力、涡流?
- 解决九号老C(C30/C40/C60/C80)电动车坐垫感应失灵的问题
热门文章
- Transport level information does not match with SOAP Message namespace URI错误的理解
- asp.net学习笔记1
- The process cannot access the file '' because it is being used by another process.....
- SpringApplication run方法解析:SpringApplicationRunListeners(二)
- 面试题之Java中线程的几种状态
- Java主线程等待所有子线程执行完毕再执行解决办法集
- X 1 BT5kali
- Java循环练习: 有1、2、3、4四个数字,能组成多少个无重复数字的三位数?都是多少?...
- 雀巢联手京东,发布人工智能家庭营养健康助手
- 自动化查询及增加配置参数功能