网络技术之数据包校验码的计算方法
2016-04-05 22:34
399 查看
作者:i_dovelemon
日期:2016 / 04 / 05
来源:CSDN
主题:大小端,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填入即可。
如果你是构造结构体,然后转化为数据包的话,在转化的时候,需要将编译器为你自动对齐的部分过滤掉。
日期: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的值。如果你是构造结构体,然后转化为数据包的话,在转化的时候,需要将编译器为你自动对齐的部分过滤掉。
相关文章推荐
- Java网络编程
- 关于iOS网络音频播放的一些详解(使用AVPlayer播放网络音频)
- HTTP 状态码
- Python网络数据采集学习笔记1
- 文章标题 java网络详解
- HTTP消息中header头部信息的讲解
- NSMutableURLRequest 设置cookie 及 NSHTTPCookieStorage机制
- 网络编程总结(一)
- linux修改TCP连接数(centos实测)
- Android 6.0 使用 HttpClient
- Java基础学习第二十六天——网络编程总结
- Python Twisted网络编程框架与异步编程入门教程
- 详解Https是如何确保安全的?
- TCP之种种连接异常
- 1098 均分纸牌 ——http://codevs.cn/problem/1098/
- 网络编程数据处理_学习笔记_第七周
- Volley的常用方法总结
- HTTP协议详解
- java学习之路之网络知识总结
- 安卓监听APP网络状态变化