




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 合作开发项目权益分配及风险承担协议书
- 自考专业(计算机网络)经典例题加答案详解
- 环保产业园2025年循环经济产业园区碳排放控制报告
- 医院电子病历系统2025年优化:构建高效医疗信息管理平台报告
- 2025年影视工业化制作流程与质量控制产业技术创新趋势报告
- 湿法PU合成革生产线项目可行性研究报告
- 自考专业(计算机网络)经典例题及完整答案详解【网校专用】
- 高速公路智能交通系统在提高道路养护效率中的应用报告
- 中级银行从业资格之中级银行业法律法规与综合能力试卷及答案详解1套
- 重难点解析青岛版8年级数学下册期末测试卷附答案详解【典型题】
- 2025-2030石灰石行业市场发展分析及发展趋势前景预测报告
- 中小学教师岗位安全工作指南培训
- DB14T 1596-2024玉米间作花生机械化栽培技术规程
- 2025-2030坚果炒货市场发展分析及行业投资战略研究报告
- 厨房安全知识培训
- 刑事撤案申请书
- 小学数学作业与核心素养的培养
- 2023年山东临沂中考英语试题及答案
- 2024年考研英语一阅读理解80篇试题及答案
- 金属非金属地下矿山紧急避险系统建设规范培训
- 企业环境与可持续发展制度
评论
0/150
提交评论