原文地址:https://blog.csdn.net/zjli321/article/details/74908451

前言:
在网络中传输数据包,为了保证传输数据的正确性,使用了
checksum来校验数据是否正确,ip头有自己的checksum,tcp、
udp也有自己的checksum,分别校验不同部分的数据,ip头的
checksum用于校验ip头的数据是否正确,tcp的checksum用于校
验tcp头、tcp数据部分是否正确,udp的checksum用于校验udp
头、udp数据是否正确。
一、 checksum的计算方法

1、 先将需要计算checksum数据中的checksum设为0;
2、 计算checksum的数据按2byte划分开来,每2byte组成一个16bit的值,如果最后有单个byte的数据,补一个byte的0组成2byte;
3、 将所有的16bit值累加到一个32bit的值中;
4、 将32bit值的高16bit与低16bit相加到一个新的32bit值中,若新的32bit值大于0Xffff,
再将新值的高16bit与低16bit相加;
5、 将上一步计算所得的16bit值按位取反,即得到checksum值,存入数据的checksum字段即可

计算例子:
如计算下面一段数据的checksum,数据为16进制;
45 00 00 3c 00 00 00 00 40 11 6d 36 c0 a8 2b c3 08 08 08 08 11
红色的6d 36为checksum字段,先把checksum设0,数据分组,补0,整理完后数据如下,中间checksum设置为0,最后补1byte 0;
4500 003c 0000 0000 4011 0000 c0a8 2bc3 0808 0808 1100
计算:4500+003c+0000+0000+4011+0000+c0a8+2bc3+0808+0808+1100 = 192C8
高低16bit相加: 1 + 92C8 = 92C9
取反: ~92C9 = 6D36
最后所得数据为:45 00 00 3c 00 00 00 00 40 11 6d 36 c0 a8 2b c3 08 08 08 08 11

如下为计算checksum的代码段:

static u16_t chksum(void *dataptr, u16_t len)
{
  u32_t acc;
  u16_t src;
  u8_t *octetptr;

acc = 0;
  octetptr = (u8_t*)dataptr;
  while (len > 1) {
    src = (*octetptr) << 8;
    octetptr++;
    src |= (*octetptr);
    octetptr++;
    acc += src;
    len -= 2;
  }
  if (len > 0) {
    src = (*octetptr) << 8;
    acc += src;
  }

acc = (acc >> 16) + (acc & 0x0000ffffUL);
  if ((acc & 0xffff0000UL) != 0) {
    acc = (acc >> 16) + (acc & 0x0000ffffUL);
  }

src = (u16_t)acc;
  return ~src;
}

二、 IP TCP UDP计算checksum包含的数据

1、 IP头的checksum
只使用ip头数据进行计算
2、 TCP/udp的checksum
Tcp/udp的Checksum计算的数据,除了包含tcp/udp头及tcp数据外,还需要增加一个伪tcp/udp头,伪tcp/udp头结构如下:

struct
{
    unsigned long saddr; //源地址
    unsigned long daddr; //目的地址
    char mbz;//置空
    char ptcl; //协议类型
    unsigned short tcpl; //TCP长度
}psd_header;

这样,tcp/udp的checksum计算数据如下:
Tcp:伪头部+tcp头部+tcp数据
Udp:伪头部+udp头部+udp数据
---------------------
作者:简单的过客
来源:CSDN
原文:https://blog.csdn.net/zjli321/article/details/74908451
版权声明:本文为博主原创文章,转载请附上博文链接!

校验和checksum算法相关推荐

  1. 校验和(Checksum)算法-概述

    校验和(Checksum)算法-概述 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 1.什么是校验和(Checksum) Check ...

  2. checksum算法详细的计算方法、实现思路与python校验验证

    1.checksum是什么? Checksum:[电脑]总和检验码,校验和.在数据处理和数据通信领域中,用于校验目的的一组数据项的和.这些数据项可以是数字或在计算检验总和过程中看作数字的其它字符串. ...

  3. checksum 算法

    说明 checksum:总和检验码,校验和,可以理解为check(校验),sum(和). 在数据处理和通信领域,通过一定算法对传输的数据进行求和以校验数据的完整性和准确性. 使用 算法 求和的算法大致 ...

  4. Java 实现校验和(Checksum)

    Java 实现校验和(Checksum) 本文简要解释什么是校验和以及如何在java中计算校验和. 1. 校验和及实现算法 校验和是指传输位数的累加,当传输结束时,接收者可以根据这个数值判断是否接到了 ...

  5. IP协议 Header Checksum算法

    引用:http://www.cnblogs.com/vamei/archive/2012/12/02/2796988.html 协议森林05 我尽力 (IP协议详解) 作者:Vamei 出处:http ...

  6. 校验和checksum (SCL算法)

      1.关于校验和,checksum可以看通讯协议部分,对其的解释,大部分是串口仪表的,自由口通讯校验算法,这里不做过多描述,直接上代码,博图里可能还有其它写法,但是可能都不是很方便,主要是ACSCI ...

  7. 数据校验之Checksum算法

    校验和(Checksum)是网络协议使用的数据错误检测方法,并且被认为比LRC(纵向冗余校验,Longitudinal Redundancy Check,LRC),VRC和CRC(循环冗余校验(Cyc ...

  8. Checksum算法

    前言: 在网络中传输数据包,为了保证传输数据的正确性,使用了 checksum来校验数据是否正确,ip头有自己的checksum,tcp. udp也有自己的checksum,分别校验不同部分的数据,i ...

  9. 转 常见hash算法的原理

    散列表,它是基于快速存取的角度设计的,也是一种典型的"空间换时间"的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Has ...

最新文章

  1. C++类的案例(二)
  2. 《网络攻防实践》第二周作业
  3. 浏览器阻挡cookies_解决WordPress登录提示”Cookies被阻止或者您的浏览器不支持”...
  4. 如何将一棵LSM-Tree塞进NVM
  5. java Clob转CLOB_Java获取Oracle中CLOB字段转换成String
  6. 联想杨元庆:没必要做操作系统和芯片;华为Mate 20 Pro被迫退出安卓 Q Beta;GitHub推赚钱新利器 | 极客头条...
  7. 符合W3C标准的target=_blank形式
  8. WinMerge 操作界面汉语版(截图),以及简单功能介绍
  9. 关于flashdevelop测试flex项目时trace不出的解决方法
  10. 对于J2EE体系架构的理解
  11. 华为马海旭:+智能,IoT行业云服务使能产业物联网
  12. 数据结构和算法-查找算法之黄金分割查找法
  13. 用C语言实现:输入某年某月某日,判断这一天是这一年的第几天
  14. Insert 语法全介绍
  15. Python-15 函数:我的地盘听我的
  16. 2022最新搭建第三方素材解析网站源码参考开发,附带小例子。
  17. 常用putty命令汇总
  18. 【面试宝典】2023前端面试题
  19. 五个不错的样机素材网站推荐
  20. mina java c_Mina简介

热门文章

  1. Oracle19c数据库如何冷备份,Oracle EBS系统整体备份(冷备份)
  2. [转]研究生能力自我培养手册
  3. hosts文件为空白或删除情况修复
  4. 侬用洲移动通信复习资料
  5. 搜索,让人欢喜让人忧!
  6. freedns mysql_freedns.afraid.org免费多子域名支持dns解析
  7. echarts 中国地图自动播放
  8. ssh连接linux_使用内网穿透访问内网ssh图文教程
  9. python停车场_python 多线程同步锁之实现停车场业务 (1)
  10. 基于bootstrap的漂亮网站后台管理界面框架汇总