Login
升级VIP 登录 注册 安全退出
当前位置: 首页 > word文档 > 述职汇报 > TCP-UDP完整数据包校验和通用计算

TCP-UDP完整数据包校验和通用计算

收藏

本作品内容为TCP-UDP完整数据包校验和通用计算,格式为 doc ,大小 48640 KB ,页数为 7页

TCP-UDP完整数据包校验和通用计算


('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#include#include"packet.h"#pragmacomment(lib,"ws2_32.lib")最后附上我使用的数据包的结构体(比较多)://数据包结构体#pragmapack(1)typedefstruct{BYTEdesmac[6];//目的MAC地址BYTEsrcmac[6];//源MAC地址USHORTethertype;//帧类型}Dlc_Header;typedefstruct{USHORThw_type;//硬件类型Ethernet:0x1USHORTprot_type;//上层协议类型IP:0x0800BYTEhw_addr_len;//硬件地址长度:6BYTEprot_addr_len;//协议地址(IP地址)的长度:4USHORTflag;//1表示请求,2表示应答BYTEsend_hw_addr[6];//源MAC地址UINTsend_prot_addr;//源IP地址BYTEtarg_hw_addr[6];//目的MAC地址UINTtarg_prot_addr;//目的IP地址BYTEpadding[18];//填充数据}Arp_Frame;typedefstruct{Dlc_Headerdlcheader;//DLC头Arp_Framearpframe;//ARP帧}ARP_Packet;typedefstruct{BYTEver_len;//IP包头部长度,单位:4字节BYTEtos;//服务类型TOSUSHORTtotal_len;//IP包总长度USHORTident;//标识USHORTfrag_and_flags;//标志位BYTEttl;//生存时间BYTEproto;//协议USHORTchecksum;//IP首部校验和UINTsourceIP;//源IP地址(32位)UINTdestIP;//目的IP地址(32位)}Ip_Header;typedefstruct{USHORTsrcport;//源端口USHORTdstport;//目的端口UINTseqnum;//顺序号UINTacknum;//确认号BYTEdataoff;//TCP头长BYTEflags;//标志(URG、ACK等)USHORTwindow;//窗口大小USHORTchksum;//校验和USHORTurgptr;//紧急指针}Tcp_Header;//TCP伪首部用于进行TCP校验和的计算,保证TCP效验的有效性typedefstruct{ULONGsourceip;//源IP地址ULONGdestip;//目的IP地址BYTEmbz;//置空(0)BYTEptcl;//协议类型(IPPROTO_TCP)USHORTtcpl;//TCP包的总长度(单位:字节)}Tcp_Psd_Header;typedefstruct{USHORTsrcport;//源端口USHORTdstport;//目的端口USHORTtotal_len;//包括UDP报头及UDP数据的长度(单位:字节)USHORTchksum;//校验和}Udp_Header;typedefstructtsd_hdr{ULONGsourceip;//源IP地址ULONGdestip;//目的IP地址BYTEmbz;//置空(0)BYTEptcl;//协议类型(IPPROTO_UDP)USHORTudpl;//UDP包总长度(单位:字节)}Udp_Psd_Header;typedefstruct{BYTEi_type;//类型类型是关键:0->回送应答(Ping应答)8->回送请求(Ping请求)BYTEi_code;//代码这个与类型有关当类型为0或8时这里都是0USHORTi_cksum;//ICMP包校验和USHORTi_id;//识别号(一般用进程ID作为标识号)USHORTi_seq;//报文序列号(一般设置为0)//UINTtimestamp;//时间戳BYTEpadding[32];//填充数据}Icmp_Header;typedefstruct{Dlc_Headerdlc_header;//以太帧Ip_Headerip_header;//IP头Icmp_Headericmp_header;//ICMP帧}Icmp_Packet;typedefstruct{unsignedcharflag;//攻击数据包类型1-arp,2-tcp,3-udpunsignedintsrcip;//攻击者IPunsignedcharcode[33];//攻击特征码}Attack_Infor;#pragmapack()',)


  • 编号:1700807007
  • 分类:述职汇报
  • 软件: wps,office word
  • 大小:7页
  • 格式:docx
  • 风格:商务
  • PPT页数:48640 KB
  • 标签:

广告位推荐

相关述职汇报更多>