您的位置:首页 > 理论基础 > 计算机网络

网络技术之数据包校验码的计算方法

2016-04-05 22:34 399 查看
作者:i_dovelemon

日期:2016 / 04 / 05

来源:CSDN

主题:大小端,ICMP,校验码

引言

最近在研究TCP/IP协议相关的内容,试着使用Wireshark抓取一些数据包,然后分析。在研究ICMP协议的时候,我需要自己构造一个发送到目的地址的ICMP Echo Request数据包。在这个数据包中,需要计算出IP协议的校验码和ICMP数据包的校验码。通过一番了解之后,特在此记录一些内容。

校验码计算方式

数据包中的校验码的作用是为了保证在传输过程中,如果发生意外,导致数据破损的时候,我们有一种检测手段来检测数据是否损坏。不同的协议有不同的校验码计算方法。比如IP层,仅仅对IP首部的数据进行校验码的计算,而ICMP不仅需要对首部进行计算,还需要对ICMP中包含的用户数据进行计算。

计算的方法,我们实际的捕获一个数据包,然后以实例的形式来进行讲解。

下面是我通过Wireshark捕获到的ICMP Echo Request数据包:



图1
上面就是一个ICMP Echo Request的数据包。我们从头开始一一分析下结构。

数据帧:
目标MAC地址:1C-FA-68-72-66-9E
源MAC地址:20-68-9D-F7-7D-C1
网络层协议:0x0800 (IP协议)

IP首部:
版本号:4
首部长度:5 * 4bytes = 20 bytes
TOS:00
IP数据包总长度(不包括帧首部):00 3C = 60bytes
id:0x15 A2
标志和片位移:0x00 00
TTL:0x40 = 60
应用层协议类型:0x 01 (ICMP协议)
校验码:0x E6 47
源IP:C0 A8 01 64 == 192.168.1.100
目标IP:7B 7D 41 4E == 123.125.65.78

ICMP首部:
类型:0x 08 (Echo Request)
代码:0x 00
校验码: 0x 0A 4F
id:0x 00 01
序列号:0x 43 0C

ICMP数据:
数据:abcdefghijklmnopqrstuvwabcdefghi

上面从头至尾,将整个数据包的结构分析了一遍。

我们来详细的讲解下如何计算这里的ICMP中的校验码。

从前面我们知道,计算ICMP的校验码,是要包含首部和数据的。首先将校验码置0,然后将需要计算的数据按顺序分成16bit的数据,如果不足的时候,末尾补0。然后,计算这一整串16bit数据的和。如果发生溢出,就将溢出的头部右移16bit,然后将该头部右移后的数据加上原先的尾部数据,获取一个16bit的数据;紧接着对这个结果进行二进制反码计算,得到最终的校验和。

上面就是算法的全部,我们来实际计算下:

08 00 + 00 00 + 00 01 + 43 0C + 61 62 + 63 64 + 65 66 + 67 68 + 69 6A + 6B 6C + 6D 6E + 6F 70 + 71 72 + 73 74 + 75 76 + 77 61 + 62 63 + 64 65 + 66 67 + 68 69=6F5AA
(1)

6 + F5AA = F5B0 (2)

~(F5B0) = 0A 4F

然后,将上面的0A 4F填入即可。

在实际编程实现时的注意点

由于Windows的机器的字节序为Little-endian,而在网络上传播数据的字节序为Big-endian,所以在实际编程的时候需要考虑这一点来构造16bit的值。

如果你是构造结构体,然后转化为数据包的话,在转化的时候,需要将编译器为你自动对齐的部分过滤掉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: