checksum计算方法.docVIP

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
checksum计算方法

ICMP,IP,UDP,TCP报头部分都有checksum(检验和)字段。ICMP和IP报头校验和的计算都很简单,使用RFC1071中给出的方法即可完成(如下)。 //计算校验和 USHORT checksum(USHORT *buffer,int size) { unsigned long cksum=0; while(size1) { cksum+=*buffer++; size-=sizeof(USHORT); } if(size) { cksum+=*(UCHAR *)buffer; } //将32位数转换成16 while (cksum16) cksum=(cksum16)+(cksum 0xffff); return (USHORT) (~cksum); } UDP/TCP报头中的校验和的计算比较复杂的,要用到 UDP/TCP伪首部:先要填充伪首部各个字段,然后再将UDP/TCP报头以后(包括报头)的数据附加到伪首部的后面,再对位首部使用上述校验和计算,所得到的值才是UDP/TCP报头部分的校验和。 位首部可以用如下的结构体表示: typedef struct{ ULONG sourceip; //源IP地址 ULONG destip; //目的IP地址 BYTE mbz; //置空(0) BYTE ptcl; //协议类型 USHORT plen; //TCP/UDP数据包的长度(即从TCP/UDP报头算起到数据包结束的长度 单位:字节) }Psd_Header; 这个过程是一个很繁琐的过程,计算过几次后再也忍受不了做这样重复的工作,于是写了一个通用的计算函数。这个函数使用起来我感觉非常方便:先封装好你的数据包(完整的,包括以太头),然后将数据包的首地址作为参数,调用该函数即可。函数将帮你完成IP报头以及UDP/TCP报头部分校验和的计算。 //————————————————————————- // PacketCheckSum // 计算数据包的校验和 // 参数:packet-待处理数据(将封装好的数据包的指针) //————————————————————————- void PacketCheckSum(unsigned char packet[]) { Dlc_Header *pdlc_header=NULL; //以太头指针 Ip_Header *pip_header=NULL; //IP头指针 unsigned short attachsize=0; //传输层协议头以及附加数据的总长度 pdlc_header=(Dlc_Header *)packet; //判断ethertype,如果不是IP包则不予处理 if(ntohs(pdlc_header-ethertype)!=0×0800) return; pip_header=(Ip_Header *)(packet+14); //TCP包 if(0×06==pip_header-proto) { ?Tcp_Header *ptcp_header=NULL; //TCP头指针 Tcp_Psd_Header *ptcp_psd_header=NULL; ptcp_header=(Tcp_Header *)(packet+14+((pip_header-ver_len)15)*4); attachsize=ntohs(pip_header-total_len)-((pip_header-ver_len)15)*4; ptcp_psd_header=(Tcp_Psd_Header *)malloc(attachsize+sizeof(Tcp_Psd_Header)); if(!ptcp_psd_header) return; memset(ptcp_psd_header,0,attachsize+sizeof(Tcp_Psd_Header)); //填充伪TCP头 ptcp_psd_header-destip=pip_header-destIP; ptcp_psd_header-sourceip=pip_header-sourceIP; ptcp_psd_header-mbz=0; ptcp_psd_header-ptcl=0×06; ptcp_psd_header-tcpl=htons(attachsize); //计算TCP校验和 ptcp_header-chksum=0; memcpy((unsigned char *)ptcp_psd_header+sizeof(Tcp_Psd_Header), (unsigned char *)ptcp_header,attachsize); ptcp_header-chksum=checksum((unsi

文档评论(0)

aicencen + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档