




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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-2030中国橡胶、塑料和化学品领域的机器人技术行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国椰子衍生脂肪酸行业市场现状供需分析及投资评估规划分析研究报告
- 建筑工程结构设计测试卷
- 2025年大学统计学期末考试题库:统计软件自编码器应用试题试卷
- 语文教育改革中的教材分析与心得体会
- 2025年宠物美容师职业技能考核试卷:宠物护理与美容工具使用技巧试题
- 2025年无人机驾驶员职业技能考核试卷(无人机飞行器动力系统与能源)
- 企业年度客户答谢活动方案
- 2024年河南轻工职业学院高职单招语文历年参考题库含答案解析
- 即时通讯系统建设方案
- 动车乘务实务知到智慧树章节测试课后答案2024年秋陕西交通职业技术学院
- 胎盘植入课件讲义版
- 山东铁投集团招聘笔试冲刺题2025
- 2025年江苏盐城东方集团招聘笔试参考题库含答案解析
- 2021版中医疾病医保对应中医疾病医保2
- 政府绩效评估 课件 蔡立辉 第1-5章 导论 -政府绩效评估程序
- 食堂负责人岗位职责
- 车间排产计划培训
- 无菌医疗器械培训课件
评论
0/150
提交评论