`
lxz891117
  • 浏览: 33309 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

校验和算法

 
阅读更多

首先,IP、ICMP、UDP和TCP报文头部都有校验和字段,大小都是16bit,算法也基本一样:
在发送数据时,为了计算数据包的校验和。应该按如下步骤:
(1)把校验和字段置为0;
(2)把需校验的数据看成以16位为单位的数字组成,依次进行二进制反码求和;
(3)把得到的结果存入校验和字段中。
在接收数据时,计算数据包的校验和相对简单,按如下步骤:
(1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段;
(2)检查计算出的校验和的结果是否为0;
(3)如果等于0,说明被整除,校验是和正确。否则,校验和就是错误的,协议栈要抛弃这个数据包。
虽然上面四种报文的校验和算法一样,但在作用范围存在不同:IP校验和只校验20字节的IP报头;而ICMP校验和覆盖整个报文(ICMP报头+ICMP数据);UDP和TCP校验和不仅覆盖整个报文,而且还有12字节的IP伪首部,包括源IP地址(4字节)、目的IP地址(4字节)、协议(2字节,第一字节补0)和TCP/UDP包长(2字节)。另外UDP、TCP数据报的长度可以为奇数字节,所以在计算校验和时需要在最后增加填充字节0(注意,填充字节只是为了计算校验和,可以不被传送)。
这里还要提一点,UDP的校验和是可选的,当校验和字段为0时,表明该UDP报文未使用校验和,接收方就不需要校验和检查了!那如果UDP校验和的计算结果是0时怎么办呢?书上有这么一句话:“如果校验和的计算结果为0,则存入的值为全1(65535),这在二进制反码计算中是等效的。”
讲了这么多,那这个校验和到底是怎么算的呢?


什么是二进制反码求和(1的补码)

对一个无符号的数,先求其反码,然后从低位到高位,按位相加,有溢出则向高位进1(跟一般的二进制加法规则一样),若最高位有进位,则向最低位进1。
首先这里的反码好像跟我们以前学的有符号数的反码不一样(即正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各位取反),这里不分正负数,直接每个位都取反!
上面加粗的那句是跟我们一般的加法规则不太一样的地方:最高位有进位,则向最低位进1。确实有些疑惑,为什么要这样做呢?仔细分析一下(为了方便说明,以 4bit二进制反码求和举例),上面的这种操作,使得在发生加法进位溢出时,溢出的值并不是10000,而是1111。也即是当相加结果满1111时溢出,这样也可以说明为什么0000和1111都表示0了(你同样可以发现,任何数与这两个数做二进制反码求和运算结果都是原数,这恰好符合数0的加法意义)。


下面再举例两种二进制反码求和的运算:
原码加法运算 反码加法运算
3(0011)+ 5(0101)= 8(1000) 3(1100)+ 5(1010)= 8(0111)
8(1000)+ 9(1001)= 1(0001) 8(0111)+ 9(0110)= 2(1101)
从上面两个例子可以看出,当加法未发生溢出时,原码与反码加法运算结果一样;当有溢出时,结果就不一样了,原码是满10000溢出,而反码是满1111溢出,所以相差正好是1。举例只是为了形象地观察二进制反码求和的运算规则,至于为什么要定义这样的规则以及该运算规则还存在其它什么特性,可能就需要涉及代数理论的东西的了。
另外关于二进制反码求和运算需要说明的一点是,先取反后相加与先相加后取反,得到的结果是一样的!(事实上我们的编程算法里,几乎都是先相加后取反。)

1的补码(相加和补取)
猜测是计算机相关语言.请参考这两段文字:
It is the 1’s complement of the 1’s complement sum of all the 16-bit words in the TCP header and data.
这是关于TCP头部校验和字段(checksum field)的说明.句中的complement意思为“补码”.对于学习计算机科学的人来说,补码不算什么新鲜,现在新鲜的是这篇英语文章出现的是“1’s complement” ,翻译出来应该是“1的补码”,对于这个笔者以前也没有碰到过,到网上查吧!网上查询的结果,“1’s complement”关键字出现的不少,但都是英文关键字,没有对应的中文翻译与解释,所以先看英语的,最后自己做解释吧.
补码:补码是计算机中二进制数表达负数的办法,这样可以在计算机中把两个数的减法变成加法.补码形式有1的补码和2的补码,其中1的补码用在IP、TCP的校验和中;平时学生在计算机科学中学习的补码是2的补码(即正数的补码和原码相同,负数补码按原码相应的正数按位取反再加1).
只是平时中文教材及中文翻译的书中,对此并不多加解释,一律翻译作补码.比如《Computer Network》(Andrew S.Tanenbaum )在中国的翻译版《计算机网络》(清华大学出版社)对于TCP头部的校验和是这样翻译的:
(原文)The checksum algorithm is simply to add up all the 16-bit words in one's complement and then to take the one's complement of the sum.
(译文)校验和的算法是简单地将所有16位字以补码形式相加,然后再对相加和取补.
仔细对比一下本文最上部笔者所碰到的句子,和刚才这个句子意思是一样的.这个没有注明是1的补码,翻译时只是以“补码”说明,也许译者并不想在这里多费口舌,因为说明1的补码实在是一个比较麻烦的事情,笔者在这里翻译时还是把“1的补码”给翻译出来了,以让大家注意这个1的补码并不是平常学的那个2的补码.
笔者只是在此讨论翻译,不是在讨论补码.1的补码较复杂,如果有兴趣,可以上网查找 RFC1071 ,这是TCP校验和权威的官方说明.

分享到:
评论

相关推荐

    UDP校验和算法

    UDP校验和算法是网络通信中确保数据包完整性和正确性的一种重要机制,尤其是在无连接的UDP(User Datagram Protocol)协议中,由于其不提供可靠传输的保障,校验和的作用就显得尤为关键。本文将深入解析UDP校验和...

    校验和算法(C#)校验和算法(C#)

    校验和算法在计算机科学中扮演着至关重要的角色,特别是在数据传输、存储和验证数据完整性时。在C#编程环境中,实现校验和算法能够帮助开发者确保数据在处理过程中的准确性,防止因传输错误或硬件故障导致的数据损坏...

    网际校验和算法VC源码

    校验和算法描述:为保证网络上传输的数据的可靠性,在许多协议中都设置了校验和项,例如:IPv4、ICMPv4、IGMPV4、ICMPv6、UDP和TCP 等等。计算这些校验和的算法称为网际校验和算法,简单来说就是:把被校验的数据16...

    网际校验和算法(ICMP、TCP、UDP)

    网际校验和算法在计算机网络中扮演着至关重要的角色,它是确保数据在网络传输过程中完整性和正确性的一种机制。在标题和描述中提到的ICMP(Internet Control Message Protocol)、TCP(Transmission Control ...

    网际校验和算法代码.rar

    用java实现的网际校验和算法,详情请查阅博主关于网际校验和算法的博客:https://blog.csdn.net/qq_41664447/article/details/103450083

    java校验和算法

    由于需要和蓝牙通讯,协议需要用到校验和,找了很久才找到,给大家共享。java校验和算法绝对可以用。

    labview实现校验和算法

    labview实现校验和算法

    CMOS校验和算法

    CMOS(Complementary Metal-Oxide-Semiconductor)校验和算法是一种用于保护计算机系统中存储的配置数据免受硬件故障或恶意篡改的技术。在个人计算机中,CMOS存储器通常用来保存BIOS(基本输入输出系统)设置,如...

    网际校验和算法的C#实现

    本文将详细探讨如何使用C#语言实现网际校验和算法。 首先,我们需要理解校验和的工作原理。校验和是通过对数据进行特定的算术运算(通常是异或操作)来生成的。接收端会重新计算接收到的数据的校验和,并将其与发送...

    行业资料ip首部校验和算法.doc

    本文档主要介绍了 IP 首部校验和算法的实验报告,涵盖了实验人员、实验内容和要求、实验步骤等方面的内容。该实验的目的是编写一个计算 IP 报文中首部校验和的程序,并且通过抓包随机选择一个数据报,提取出 IP 报文...

    checksum校验和计算工具

    常见的校验和算法有CRC(Cyclic Redundancy Check)和MD5(Message-Digest Algorithm 5)等。这些算法通过一系列数学运算对数据进行处理,生成的校验和可以用来检测数据的完整性,防止因传输错误或硬件故障导致的...

    使用md5校验和算法保护文件.rar

    总的来说,MD5校验和算法是数据完整性保护的一种重要手段,虽然其安全性已受到挑战,但仍然在很多场景下有着广泛的运用。通过理解MD5的工作原理和其局限性,用户可以在保证数据安全的同时,合理地利用这一工具。在...

    IP、ICMP、UDP、TCP 校验和算法分享

    校验和算法是计算机网络协议中用于验证数据完整性的基本技术之一。在IP、ICMP、UDP和TCP协议中,校验和算法被用于确保数据在传输过程中未出现错误或损坏。校验和算法具体实现方式如下: 1. IP报头校验和:IP报头...

    校验和计算

    校验和计算,输入需要校验的内容,点击生成,即可生成校验和。

    计算机网络课程设计计算校验和

    校验和的计算算法称为网际校验和算法,简单的说,就是把被校验的数据按16位进行累加,然后取反码。若数据字节长度为奇数,则在数据尾部补一个字节的0以凑成偶数。 在网络协议中,校验和是用来检测数据传输过程中的...

    IP/UDP/TCP/ICMP的校验和

    IP/UDP/TCP/ICMP的校验和算法详解 校验和是网络协议中用于检测数据错误的一种机制。IP、UDP、TCP和ICMP协议都使用校验和来确保数据的正确性。在本文中,我们将详细介绍IP、UDP、TCP和ICMP协议的校验和算法。 1.IP...

    IP校验与算法反码求和详解

    这种校验和算法虽然简单,但对大多数传输错误能提供有效的检测。然而,它并不完美,例如,它无法检测出偶数个位的错误,且在某些特定错误情况下可能产生错误校验和。随着技术的发展,TCP/IP协议栈中其他更复杂的校验...

    计算校验和 checksum

    效验和(checksum)  原理:把要发送的数据看成二进制整数序列,并计算他们的和。若数据字节长度为奇数,则在数据尾部补一个字节的0以凑成偶数。 为了计算效验和,发送计算机把每对字符当成16位整数处理并计算效验...

Global site tag (gtag.js) - Google Analytics