- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验四 IP包的解析
IP包的解析
一.实验目的:
本次课程设计的目的是设计一个解析IP数据包的程序,并根据分析结果说明IP数据包的结构及IP协议的相关问题,对IP层的工作原理有更好的理解和认识。
二、实验要求:
1.整个课程设计的各个环节都要自己动手。
2.编写程序,获取网络中的IP数据包内容,将结果显示在标准输出上,并同时写入日志文件。具体要求如下:
(1)程序编译后生成的exe文件以“学号+IP”为名,输出结果至屏幕的同时,将结果写入“学号+IP”的日志文件中;
(2)程序的输出内容应包括IP包的版本、头长度、服务类型、数据包长度等IP数据包格式中的相应字段;
(3)键盘输入CTRL+C时退出。
3.对课程设计进行总结,撰写课程设计报告。
三、实验分析:
3.1网卡设置:
为了获取网络中的IP数据包,必须对网卡进行编程,在这里使用套接字(socket)进行编程。但是,在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的数据包或是以广播形式发出的数据包。对于其他形式的数据包,如已到达网络接口,但却不是发送到此地址的数据包,网络接口在投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的数据包。我们要想获取网络设备的所有数据包,就是需要将网卡设置为混杂模式。
3.2使用套接字:
套接字分为三种,即流套接字(Stream socket)、数据报套接字(Datagram Socket)
和原始套接字(Raw Socket)。要进行IP层数据包的接收和发送,应使用原始套接字。创建原始套接字的代码如下:
Socket sock:
Sock=wsasocket(af_inet,sock_raw,ipproto-ip,null,0,wsa-flag-overlapped):
本设计不用考虑超时情况。
创建套接后,IP头就会包含在接收数据包中。然后,我可以设置IP头操作选项,调用setsockopt函数。其中flag设置为true,并设定IP-HDRINCL选项,表明用户可以亲自对IP头进行处理。最后使用bind()函数将socket绑定到本地网卡上。绑定网卡后,需用WSAIoctl()函数把网卡设置为混杂模式,使网卡能够接收所有的网络数据。如果接收的数据包中的协议类型和定义的原始套接字匹配,那么接收的数据就拷贝到套接字中,因此,网卡就可以接收所有经过的IP包。
3.3接收数据包:
在程序中可使用recv()函数接收经过的IP包。该函数有四个参数,第一个参数接收操作所用的套接字描述符;第二个参数接收缓冲区的地址;第三个参数接收缓冲区的大小,也就是所要接收的字节数;第四个参数是一个附加标志,如果对所发送的数据没特殊要求,直接设为0。因为IP数据包的最大长度是65535B,因此缓冲区的大小不能小于65535B。设置缓冲区后,可利用循环来反复监听接收IP包,用recv()函数实现接收功能。
3.4定义IP头部的数据结构:
程序需要定义一个数据结构表示IP头部。其代码如下:
typedef struct _IP_HEADER //定义IP头
{
union
{
BYTE Version; //版本(前4位)
BYTE HdrLen; //IHL(后4位),报头标长
};
BYTE ServiceType; //服务类型
WORD TotalLen; //总长
WORD ID; //标识
union
{
WORD Flags; //标志(前3位)
WORD FragOff; //分段偏移(后13位)
};
BYTE TimeToLive; //生命期
BYTE Protocol; //协议
WORD HdrChksum; //头校验和
DWORD SrcAddr; //源地址
DWORD DstAddr; //目的地址
BYTE Options; //选项
}IP_HEADER;
3.5 IP包的解析:
解析IP包的字段有两种策略。针对长度为8位、16位和32位的字段(或子字段)时,可以利用IP-HEADER的成员直接获取。要解析长度不是8位倍数的字段(或子字段)时,可以利用C语言中的移位以人、及与、或操作完成。
3.6捕获处理:
1.加载 Winsock;
2.创建一个接收原始IP包的socket连接;
3.绑定到一个接口;
4.进行WSAIoctl设置,接收所有的IP数据包。
代码如下:
//设置SOCK
您可能关注的文档
最近下载
- 鼓膜穿孔的修复手术及术后护理PPT.pptx VIP
- 非透明幕墙建筑外墙保温构造详图---L15J188.docx
- MacroSAN_MS系列存储设备_命令行用户手册_V3.0.17T10.pdf
- 智能网联汽车底盘线控系统装调与测试 课件全套 项目1--5 智能网联汽车底盘线控系统认知 ---智能网联汽车线控悬架系统认知.pptx
- 幼儿园大班语文练习题.pdf VIP
- 内蒙古地区马铃薯种植业发展现状及前景.pdf VIP
- (高清版)DB4228∕T 75-2022 《堇叶碎米荠生产技术规程》.pdf VIP
- 2025年度兵团连队职工招录考试练习试题附答案.doc
- 2025年继续教育公需课考试题.docx VIP
- 平顶山市焦庄垃圾填埋场封场工程施工组织设计书.doc VIP
文档评论(0)