TCP-UDP完整数据包校验和通用计算
本作品内容为TCP-UDP完整数据包校验和通用计算,格式为 doc ,大小 48640 KB ,页数为 7页
('TCP,UDP完整数据包校验和通用计算TCP,UDP完整数据包校验和通用计算ICMP,IP,UDP,TCP报头部分都有checksum(检验和)字段。ICMP和IP报头校验和的计算都很简单,使用RFC1071中给出的方法即可完成(如下)。//计算校验和USHORTchecksum(USHORTbuffer,intsize){unsignedlongcksum=0;while(size>1){cksum+=buffer++;size-=sizeof(USHORT);}if(size){cksum+=(UCHAR)buffer;}//将32位数转换成16while(cksum>>16)cksum=(cksum>>16)+(cksum&0xffff);return(USHORT)(~cksum);}UDP/TCP报头中的校验和的计算比较复杂的,要用到UDP/TCP伪首部:先要填充伪首部各个字段,然后再将UDP/TCP报头以后(包括报头)的数据附加到伪首部的后面,再对位首部使用上述校验和计算,所得到的值才是UDP/TCP报头部分的校验和。位首部可以用如下的结构体表示:typedefstruct{ULONGsourceip;//源IP地址ULONGdestip;//目的IP地址BYTEmbz;//置空(0)BYTEptcl;//协议类型USHORTplen;//TCP/UDP数据包的长度(即从TCP/UDP报头算起到数据包结束的长度单位:字节)}Psd_Header;这个过程是一个很繁琐的过程,计算过几次后再也忍受不了做这样重复的工作,于是写了一个通用的计算函数。这个函数使用起来我感觉非常方便:先封装好你的数据包(完整的,包括以太头),然后将数据包的首地址作为参数,调用该函数即可。函数将帮你完成IP报头以及UDP/TCP报头部分校验和的计算。//-------------------------------------------------------------------------//PacketCheckSum//计算数据包的校验和//参数:packet-待处理数据(将封装好的数据包的指针)//-------------------------------------------------------------------------voidPacketCheckSum(unsignedcharpacket[]){Dlc_Headerpdlc_header=NULL;//以太头指针Ip_Headerpip_header=NULL;//IP头指针unsignedshortattachsize=0;//传输层协议头以及附加数据的总长度pdlc_header=(Dlc_Header)packet;//判断ethertype,如果不是IP包则不予处理if(ntohs(pdlc_header->ethertype)!=0x0800)return;pip_header=(Ip_Header)(packet+14);//TCP包if(0x06==pip_header->proto){Tcp_Headerptcp_header=NULL;//TCP头指针Tcp_Psd_Headerptcp_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=0x06;ptcp_psd_header->tcpl=htons(attachsize);//计算TCP校验和ptcp_header->chksum=0;memcpy((unsignedchar)ptcp_psd_header+sizeof(Tcp_Psd_Header),(unsignedchar)ptcp_header,attachsize);ptcp_header->chksum=checksum((unsignedshort)ptcp_psd_header,attachsize+sizeof(Tcp_Psd_Header));//计算ip头的校验和pip_header->checksum=0;pip_header->checksum=checksum((unsignedshort)pip_header,20);return;}//UDP包if(0x11==pip_header->proto){Udp_Headerpudp_header=NULL;//UDP头指针Udp_Psd_Headerpudp_psd_header=NULL;pudp_header=(Udp_Header)(packet+14+((pip_header->ver_len)&15)4);attachsize=ntohs(pip_header->total_len)-((pip_header->ver_len)&15)4;pudp_psd_header=(Udp_Psd_Header)malloc(attachsize+sizeof(Udp_Psd_Header));if(!pudp_psd_header)return;memset(pudp_psd_header,0,attachsize+sizeof(Udp_Psd_Header));//填充伪UDP头pudp_psd_header->destip=pip_header->destIP;pudp_psd_header->sourceip=pip_header->sourceIP;pudp_psd_header->mbz=0;pudp_psd_header->ptcl=0x11;pudp_psd_header->udpl=htons(attachsize);//计算UDP校验和pudp_header->chksum=0;memcpy((unsignedchar)pudp_psd_header+sizeof(Udp_Psd_Header),(unsignedchar)pudp_header,attachsize);pudp_header->chksum=checksum((unsignedshort)pudp_psd_header,attachsize+sizeof(Udp_Psd_Header));//计算ip头的校验和pip_header->checksum=0;pip_header->checksum=checksum((unsignedshort)pip_header,20);return;}return;}需要几个头文件,以及库:#include
提供TCP-UDP完整数据包校验和通用计算会员下载,编号:1700807007,格式为 docx,文件大小为7页,请使用软件:wps,office word 进行编辑,PPT模板中文字,图片,动画效果均可修改,PPT模板下载后图片无水印,更多精品PPT素材下载尽在某某PPT网。所有作品均是用户自行上传分享并拥有版权或使用权,仅供网友学习交流,未经上传用户书面授权,请勿作他用。若您的权利被侵害,请联系963098962@qq.com进行删除处理。