我是靠谱客的博主 务实身影,最近开发中收集的这篇文章主要介绍网络技术之数据包校验码的计算方法引言校验码计算方式在实际编程实现时的注意点,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

        如果你是构造结构体,然后转化为数据包的话,在转化的时候,需要将编译器为你自动对齐的部分过滤掉。

最后

以上就是务实身影为你收集整理的网络技术之数据包校验码的计算方法引言校验码计算方式在实际编程实现时的注意点的全部内容,希望文章能够帮你解决网络技术之数据包校验码的计算方法引言校验码计算方式在实际编程实现时的注意点所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部