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

作者: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的值。

        如果你是构造结构体,然后转化为数据包的话,在转化的时候,需要将编译器为你自动对齐的部分过滤掉。
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值