Internet 校验和(Checksum)仅计算头部的正确性,这一点很重要,这意味着 IP 协议不检查 IPv4 packet 有效载荷部分的数据正确性。为了保证有效载荷部分的正常传输,其他协议必须通过自己的协议数据完整性检测机制来保护重要数据。我们可以看到在封装在 IP 的几乎所有协议(UDP、TCP、ICMP、IGMP)在自己头部中都有一个涵盖头部数据的校验和。

IPv6 放弃了校验和字段。原因如下:位错误带来的后果一般是数据被投递到错误的目的地、数据的来源显示错误、有效载荷中的位错误。由于位错误比较少见,而且其他上层协议的字段提供了对有效载荷部分的更有力的确保正确性的机制,因此IPV6删除了这个字段。

特别的,当 IPv4 的数据包经过一台路由器时,TTL 字段减一会导致头部校验和的重新计算,即每一跳路由都会导致校验和的重新计算。

校验和检测失败时 IPv4 将直接丢弃接收到有误的数据包不会生成差错信息,更高层需要以某种方式检测丢失的数据报并在必要时重新传输。

internet校验和的内容

Internet 校验和的内容如下

  1. 将校验和的字段设置为零。
  2. 将整个头部(仅有 header 部分)认为是一个 16 bits integer 的一个序列。计算这一系列的 16 位整数的反码和。将运算结果存放到校验和字段内。
  3. 收到 IPv4 packet 时,对整个 header (校验和字段不是 0 而是有填充)进行相同的计算。反码和结果应该为 0 ,代表数据无误。若非 0 ,则代表数据有误

实例

例如要发送的 packet 内容是 :E3 4F 23 96 44 27 99 F3 【00 00】 (checksum 字段清零)

将整个序列看成 16 位的整数,一个十六进制数是 4 bits,所以要看成 4 个十六进制数为一个整数。

二进制反码求和:从低位到高位逐列进行和计算,如果最高位(16位)进位,则得到的结果加1,一直循环到最高位没有进位为止.最后把得到的结果取反.

可以用如下的简单方法求反码和:对几个数进行补码和,也就是我们通常所用的加法,然后将进位的数字加到最低位。

最后把结果取反。

  • 补码和:E34F + 2396 + 4427 + 99F3 = 1E4FF
  • 反码和:进位的数字加到最低位:E4FF + 1 = E500
  • 取反:checksum = ~(E500) = 1AFF

则填充 checksum 之后发送的 packet 内容变成:E3 4F 23 96 44 27 99 F3 【1A FF】

接收方检测过程:计算包括 checksum 在内的整个 packet 的反码和,再取反。

  • 补码和:E34F + 2396 + 4427 + 99F3 + 1AFF = 1FFFE
  • 反码和:进位的数字加到最低位:FFFE + 1 = FFFF
  • 取反结果 = ~(FFFF) = 0

若结果为 0 ,说明数据在传输过程中没有发生变动。若结果不为 0 ,则数据在传输过程中有变动、受损。

数学性质

这里运用到离散数学中关于群论的知识点。

集合 G 不为空集,在 G 上的二元运算满足封闭性、结合律、存在单位元、每个元素都有逆元,则称<G, +> 为群,若满足交换律,则称群 G 为阿贝尔群。

可以通过观察发现,16 位整数的一个十六进制值序列集合 V = {0001,0002,...,FFFF} ,定义 + 为二进制反码和运算,<V, +> 构成阿贝尔群

  • 对于任意的 X,Y in V, (X + Y) in V [封闭]
  • 对于任意的 X,Y,Z in V, X + (Y + Z) = (X + Y) + Z [可结合]
  • 对于任意的 X in V, e + X = X + e = X ,e = FFFF [单位元 e 是 FFFF]
  • 对于任意的 X in V, 存在 X′ in V 使 X + X′ = e [每个元素都存在逆元]
  • 对于任意的 X,Y in V, (X + Y) = (Y + X) [交换律]

事实上,观察构造 checksum 的过程我们可以得知:checksum 其实是前面 4 个 16 bit integer 做二进制反码和运算(下文用 ‘+’ 代替)的结果的取反取反这个操作特别的有意思,因为你对任何一段长度为 n 的二进制数据取反,与原来的数据相加,结果一定是长度为 n 的 1 串。

例如:1011,取反是 0100。1011 + 0100 = 1111

所以,对于 16 bit integer,这个结果一定是 FFFF。FFFF 在我们前面的分析中,就是阿贝尔群<V, +>单位元!所以我们可以得出一个结论:在构造 packet checksum 时,checksum 其实就是其余数据在群<V, +>中的逆元!!

当收到 packet 的一方,在做验证的时候,因为前面的 4 个 16 bit integer 和后面这 2 个字节的 checksum 是互为逆元的,所以对它们进行 + 的运算结果一定是单位元 FFFF。而由于整个运算集合构成了一个群,因此确保了每一个元素都有一个对应的逆元,也就证明了:如果检验和检测正确,意味着数据完好,如果出错,意味着数据受损。

关于这个十六位整数的十六进制值序列集合,非常让人感兴趣的一点是 其中没有 0000。这是为什么呢?我们考虑一下,如果将数字0000放入集合,则 <V, +> 不再是一个阿贝尔群。

0000 显然可以作为单位元 e。对于群,每个元素都要有一个逆元,取随意的元素 AB12 来说,需要有一个逆元 X′ + AB12 = 0000,这样的 X′ 在<V, +>是不存在的。因此,我们需要排除 0000 ,使得<V, +> 构成阿贝尔群。

那么排除 0000的道理又何在呢?首先,排除 0000 使得<V, +>是一个阿贝尔群,之前已经说过了。第二条理由是,任何一个合法的 IPv4 包,不可能所有的字节都为 0 。如果要将 0000 纳入群众,则是考虑存在一个合法的 IPv4 包,除了 checksum 之外的字节都为 0 的情况,而这种情况

  1. 会导致<V, +> 不再是一个阿贝尔群。
  2. 实际是不存在的,不存在任何一个合法的 IPv4 头部全是 0 的情况。

因此我们可以排除 0000,由此推断出 Internet 校验和的群属性。


参考链接:http://blog.csdn.net/qq_34369618/article/details/60603867

Internet 校验和的数学性质的更多相关文章

  1. gym101201J Shopping 二分+RMQ+数学性质

    题目传送门 题目大意: 给出n个商品的价格,排成一列,q次查询,每次查询如果你有x的钱,从l格子走到r格子,每种商品有无数个,能买就买,最后还会剩多少钱. 思路: 每一次买都要找离自己最近的且买的起的 ...

  2. TCP-IP详解笔记3

    TCP-IP详解笔记3 地址解析协议 IP协议的设计目标是为跨越不同类型物理网络的分组交换提供互操作. 网络层软件使用的地址和底层网络硬件使用的地址之间进行转换. 对于TCP/IP网络,地址解析协议( ...

  3. 《统计推断(Statistical Inference)》读书笔记——第5章 随机样本的性质

    有了前四章知识的铺垫,第五章进入了统计研究的正题——样本的研究.样本可以说是统计学研究中最基本的对象,样本的数学性质也是最重要的研究课题,统计学的一大任务就是从一大堆样本中提取出有价值的知识,正如对原 ...

  4. PCA的数学原理

    PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维 数据的 ...

  5. PCA数学原理

    PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...

  6. PCA的数学原理(转)

    PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...

  7. TCP/IP 笔记 - Internet协议

    IP是TCP/IP协议族中的核心协议,TCP.UDP.ICMP.IGMP数据都通过IP数据报传输.IP提供了一种"尽力而为.无连接"的数据交付服务:尽力而为表示不保证IP数据报能成 ...

  8. pca数学原理(转)

    PCA的数学原理 前言 数据的向量表示及降维问题 向量的表示及基变换 内积与投影 基 基变换的矩阵表示 协方差矩阵及优化目标 方差 协方差 协方差矩阵 协方差矩阵对角化 算法及实例 PCA算法 实例 ...

  9. opencv——PCA(主要成分分析)数学原理推导

    引言: 最近一直在学习主成分分析(PCA),所以想把最近学的一点知识整理一下,如果有不对的还请大家帮忙指正,共同学习. 首先我们知道当数据维度太大时,我们通常需要进行降维处理,降维处理的方式有很多种, ...

随机推荐

  1. 用NI的数据采集卡实现简单电子测试之5——压控振荡器的测试

    本文从本人的163博客搬迁至此. 为了展示连续信号采集的方法,以其外部触发采集功能.我用运算放大器实现了一个最简单的低频压控振荡器(VCO),作为USB-6009采集的信号源.在LabVIEW下编写的 ...

  2. flex 自定义组件的编写

    使用flex也很久了,也改过别人写的flex自定义组件,但是就是没有系统的研究下flex组件的编写步骤,和要注意的东西,在这里我参照一本书中的例子,好好的理解下,也为了巩固下自己对flex的理解! 1 ...

  3. [Qt扒手2] PyQt5 路径绘画例子

    [说明] 此例扒自 Qt 官网,原例是 C++ 代码,我把它改写成了 Python + PyQt5 版本. 有了前一个例子的成功,这个例子改写的非常之快.记得第一个例子花了我几天的时间,而这个例子只花 ...

  4. 17-[JavaScript]- 内置对象 Array,String,Date,Math

    1.Array数组 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  5. CF 1114 D. Flood Fill

    D. Flood Fill 链接 题意: 一个颜色序列,每个位置有一个颜色,选择一个起始位置,每次可以改变包含这个位置的颜色段,将这个颜色段修改为任意一个颜色, 问最少操作多少次.n<=5000 ...

  6. 5249: [2018多省省队联测]IIIDX

    5249: [2018多省省队联测]IIIDX 链接 分析: 贪心. 将给定的权值从大到小排序,从第一个往后挨个赋值,考虑第i个位置可以赋值那些树.首先满足前面必须至少有siz[i]个权值没选,如果存 ...

  7. 奇技淫巧之 unordered_map

    哇,虽然我不知道到为什么这个东西比map快(快了一倍),注意unordered_map要在c++11以上的编译环境下才能用,如c++11,GNU G++11 5.1.0,GNU G++14 .

  8. JAVAEE Eclipse 控制台用起来感觉很不方便的原因

    这是因为切换成了java面板的原因 因为之前有切换到过 java project 项目,所以才转到了这个面板,之后如果不手动改即便是用javaee也会是这个面板,因而用起来不方便 解决方法: 切换到j ...

  9. python 排序模块 ———— heapq(学习笔记)

    from heapq import * def heasort(initi):# 排序 h=[] for value in initi: heappush(h,value)#将每一个item进入hea ...

  10. linux 查看服务器序列号

    1.安装工具 dmidecode yum install dmidecode -y 2.使用 dmidecode -t  1