TCP,UDP完整数据包校验和通用计算_第1页
TCP,UDP完整数据包校验和通用计算_第2页
TCP,UDP完整数据包校验和通用计算_第3页
TCP,UDP完整数据包校验和通用计算_第4页
TCP,UDP完整数据包校验和通用计算_第5页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、TCP,UDP 完整数据包校验和通用计算TCP,UDP完整数据包校验和通用计算ICMP,IP,UDP,TCP 报头部分都有 checksum(检验和)字段。ICMP 和 IP 报头校验和的计算都很简单,使用RFC1071 中给出的方法即可完成(如下)。/计算校验和USHORTchecksum(USHORT*buffer,intsize)(unsignedlongcksum=0;while(size1)(cksum+=*buffer+;size-=sizeof(USHORT);if(size)(cksum+=*(UCHAR*)buffer;/将 32 位数转换成 16while(cksum16)

2、cksum=(cksum16)+(cksum&0 xffff);return(USHORT)(cksum);UDP/TCP 报头中的校验和的计算比较复杂的,要用到 UDP/TCP 伪首部:先要填充伪首部各个字段,然后再将UDP/TCP 报头以后(包括报头)的数据附加到伪首部的后面,再对位首部使用上述校验和计算,所得到的值才是UDP/TCP 报头部分的校验和。位首部可以用如下的结构体表示:typedefstructULONGsourceip;/源 IP 地址ULONGdestip;/目的 IP 地址BYTEmbz;/置空(0)BYTEptcl;/协议类型USHORTplen;/TCP/U

3、DP 数据包的长度(即从 TCP/UDP 报头算起到数据包结束的长度单位:字节)Psd_Header;这个过程是一个很繁琐的过程,计算过几次后再也忍受不了做这样重复的工作,于是写了一个通用的计算函数。这个函数使用起来我感觉非常方便:先封装好你的数据包(完整的,包括以太头),然后将数据包的首地址作为参数,调用该函数即可。函数将帮你完成 IP 报头以及 UDP/TCP 报头部分校验和的计算。/PacketCheckSum/计算数据包的校验和/参数:packet-待处理数据(将封装好的数据包的指针)/voidPacketCheckSum(unsignedcharpacket 口)pdlc_heade

4、r=(Dlc_Header*)packet;/判断 ethertype,如果不是 IP 包则不予处理if(ntohs(pdlc_header-ethertype)!=0 x0800)return;pip_header=(Ip_Header*)(packet+14);/TCP 包if(0 x06=pip_header-proto)Tcp_Header*ptcp_header=NULL;/TCPTcp_Psd_Header*ptcp_psd_header=NULL;ptcp_header=(Tcp_Header*)(packet+14+(pip_header-ver_len)&15)*4)

5、;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-so

6、urceip=pip_header-sourceIP;Dlc_Header*pdlc_header=NULL;/Ip_Header*pip_header=NULL;unsignedshortattachsize=0;/以太头指针/IP 头指针传输层协议头以及附加数据的总长度头指针ptcp_psd_header-mbz=0;ptcp_psd_header-ptcl=0 x06;ptcp_psd_header-tcpl=htons(attachsize);/计算 TCP 校验和ptcp_header-chksum=0;memcpy(unsignedchar*)ptcp_psd_header+siz

7、eof(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(0 x11=pip_header-proto)Udp_Header*pudp_

8、header=NULL;/UDP 头指针Udp_Psd_Header*pudp_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;memse

9、t(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=0 x11;pudp_psd_header-udpl=htons(attachsize);/计算 UDP 校验和 pudp_header-chksum=0;memcpy(unsignedchar*)pudp_psd

10、_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#i

11、ncludepacket.h#pragmacomment(lib,ws2_32.lib)最后附上我使用的数据包的结构体(比较多)/数据包结构体#pragmapack(1)typedefstructBYTEdesmac6;BYTEsrcmac6;USHORTethertype;Dlc_Header;typedefstructUSHORThw_type;USHORTprot_type;BYTEhw_addr_len;BYTEprot_addr_len;/协议/目的 MAC 地址/源 MAC 地址/帧类型/硬件类型 Ethernet:0 x1/上层协议类型 IP:0 x0800/硬件地址长度:6地址

12、(IP 地址)的长度:4USHORTflag;/1 表示请求,2 表示应答BYTEsend_hw_addr6;/源 MAC 地址UINTsend_prot_addr;/源 IP 地址BYTEtarg_hw_addr6;/目的 MAC 地址UINTtarg_prot_addr;/目的 IP 地址BYTEpadding18;/填充数据Arp_Frame;typedefstructDlc_Headerdlcheader;/DLC 头Arp_Framearpframe;/ARP 帧ARP_Packet;typedefstructBYTEver_len;/IP 包头部长度,单位:4 字节BYTEtos;

13、/服务类型 TOSUSHORTtotal_len;/IP 包总长度USHORTident;/标识USHORTfrag_and_flags;/标志位BYTEttl;生存时间BYTEproto;/协议USHORTchecksum;/IP 首部校验和UINTsourceIP;/源 IP 地址(32 位)UINTdestIP;/目的 IP 地址(32 位)Ip_Header;typedefstructUSHORTsrcport;/源端口USHORTdstport;/目的端口UINTseqnum;/顺序号UINTacknum;/确认号BYTEdataoff;/TCP 头长BYTEflags;/标志(UR

14、G、ACK 等)USHORTwindow;/窗口大小USHORTchksum;/校验和USHORTurgptr;/紧急指针Tcp_Header;/TCP 伪首部用于进行 TCP 校验和的计算,保证 TCP 效验的有效性typedefstructULONGsourceip;/源 IP 地址ULONGdestip;/目的 IP 地址BYTEmbz;/置空(0)BYTEptcl;/协议类型(IPPROTO_TCP)USHORTtcpl;/TCP 包的总长度(单位:字节)Tcp_Psd_Header;typedefstructUSHORTsrcport;/源端口USHORTdstport;/目的端口/

15、包括 UDP 报头及 UDP 数据的长度(单位:字节)USHORTchksum;/校验和Udp_Header;typedefstructtsd_hdrULONGsourceip;/源 IP 地址ULONGdestip;/目的 IP 地址BYTEmbz;/置空(0)BYTEptcl;/协议类型(IPPROTO_UDP)USHORTudpl;/UDP 包总长度(单位:字节)Udp_Psd_Header;typedefstructBYTEi_type;类型类型是关键:0-回送应答(Ping 应答)8-回送请求(Ping 请求)BYTEi_code;/代码这个与类型有关当类型为 0 或 8 时这里都是 0USHORTi_cksum;/ICMP 包校验和USHORTi_id;/识别号(一般用进程 ID 作为标识号)USHORTi_seq;报文序列号(一般设置为 0)/UINTtimestamp;/时间戳BYTEpadding32;填充数据Icmp_Header;typedef

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论