TCP/IP checksum 简析
来源:互联网 发布:达州网络人才网 编辑:程序博客网 时间:2024/05/29 03:47
Checksum原理
Checksum广泛应用于TCP/IP协议族,用于校验IP、TCP、UDP数据,其原理比较简单,其计算校验和的步骤如下:
1)在数据发送端,首先将检验和字段本身清零,将被检验的相邻字节成对配成16bit的整数,将所有的配对相加,同时将进位加到校验和的低字节上,我们将得到的校验和定义为a,最后再将校验和取反记为-a,将-a放到校验和字段发送到网络中。
2)如果在数据传输过程中,没有比特位改变,则在目的地计算的校验和应该为等于a+(-a)即,二进制反码-0(全1),而它的二进制反码为0(全0)。所以在目的地,一个没有损坏分组计算出来的校验和总是0。
Checksum 特性
校验和计算原理虽然十分的简单,但其中包含了不少数学特性在里面,下面简单介绍一下:
- 校验和对于被校验的数据长度没有限制,即数据长度为奇数或偶数都不会影响校验的结果。
- 校验和的计算结果不依赖于硬件平台的大小端特性,即对于同一组数据大端平台和小端平台计算的结果一样。
举个例子,例如下面一组数据为待校验的分组:
内存地址 0x00 0x01 0x02 0x03 0x04
数据 0xF1 0xF2 0xF3 0xF4 0xF5
小端平台的校验和计算:
计算所有数据的和:
0xF2F1 + 0xF4F3 + 0x00F5 = 0x01E8D9
将进位加到低字节:
0xE8D9 + 0x01 = E8DA
取反:0x1725
校验和在内存中的位置:
内存地址 0x05 0x06
校验和 0x25 0x17
大端平台的校验和计算:
计算所有数据的和:
0xF1F2 + 0xF3F4 + 0xF500 =0x02DAE6
将进位加到低字节:
0xDAE6 + 0x02 = 0xDAE8
取反:0x2517
校验和在内存中的位置:
内存地址 0x05 0x06
校验和 0x25 0x17
可见不同平台下计算得到的校验和在内存中表示都是一样的,即结果都是一样的。
Checksum 实现
下面为C实现较为原始的checksum算法,代码中对于算法做了比较详细的注释:
- TCP/IP checksum 简析
- TCP/IP checksum 简析
- IP/TCP/UDP checksum
- TCP/IP Illustrated 笔记 UDP Checksum
- IP/TCP/UDP中Checksum的计算
- How to Calculate IP/TCP/UDP Checksum
- TCP checksum
- IP checksum
- 计算ICMP,IP,UDP,TCP报头部分中的checksum
- DPDK 使用网卡ip/tcp/udp checksum offload
- IP头TCP头的checksum校验和计算
- TCP checksum offload
- TCP checksum offload
- tcp checksum计算
- tcp checksum error
- IP 协议中的checksum
- Wireshark捕获的outgoing TCP包的IP header checksum error问题
- Wireshark捕获的outgoing TCP包的IP header checksum error问题
- 【HDU3555】 Bomb
- 【Unity3D】Unity脚本执行顺序
- GYM 101128 E.Wooden Signs【Dp】
- 网站图片延时加载2.0
- Ruby操作MongoDB(进阶九)-批量操作Bulk Operations
- TCP/IP checksum 简析
- Entity FrameWork乐观并发模式
- 阿里大于短信服务(短信验证码)
- 存储过程批量插入处理
- MySQL查询时间时间戳
- java线程总结
- Linux上安装MySQL
- 帆软自定义数据源实现一张复杂报表
- Ruby操作MongoDB(进阶十)--文本搜索text search