IP包流量分析项目报告Word下载.docx

上传人:b****5 文档编号:15840901 上传时间:2022-11-16 格式:DOCX 页数:15 大小:89.32KB
下载 相关 举报
IP包流量分析项目报告Word下载.docx_第1页
第1页 / 共15页
IP包流量分析项目报告Word下载.docx_第2页
第2页 / 共15页
IP包流量分析项目报告Word下载.docx_第3页
第3页 / 共15页
IP包流量分析项目报告Word下载.docx_第4页
第4页 / 共15页
IP包流量分析项目报告Word下载.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

IP包流量分析项目报告Word下载.docx

《IP包流量分析项目报告Word下载.docx》由会员分享,可在线阅读,更多相关《IP包流量分析项目报告Word下载.docx(15页珍藏版)》请在冰豆网上搜索。

IP包流量分析项目报告Word下载.docx

程序的具体要求如下:

 

 1)以命令行形式运行:

ipparselogfile,其中ipparse是程序名,而logfile则代表记录结果的日志文件。

2)在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。

 3)当程序接收到键盘输入Ctrl+C时退出

2概要设计

2.1原理概述

IP协议是一种不可靠,无连接的数据报传输服务协议,它提供的是一种“尽力而为”的服务。

互联网络层是TCP/IP协议参考模型中的关键部分.IP协议把传输层送来的消息组装成IP数据包,并把IP数据包传送给数据链层.IP协议在TCP/IP协议族中处于核心地位,IP协议制定了统一的IP数据包格式,以消除个通信子网中的差异,从而为信息发送方和接收方提供了透明的传输通道.编制本程序前,首先要对IP包的格式有一定了解,图1给出了IP协议的数据包格式.

IP数据包的第一个字段是版本字段,其度是4位,表示所使用的IP协议的版本.目前的版本是IPV4,版本字段的值是4,下一代版本是IPV6,版本字段值是6.本程序主要针对版本是IPV4的数据包的解析.

报头标长字段为4位,它定义了以4B为一个单位的IP包的报文长度.报头中除了选项字段和填充域字段外,其他各字段是定长的.因此,IP数据包的头长度在20—40B之间,是可变的.

04816192431

版本

报头标长

服务类型

总长度

标识

标志

片偏移

生存时间

协议

头校验和

源IP地址

目的IP地址

选项

填充域

数据部分

图1IP数据包的格式

比特08162431

源端口

目的端口

序号

确认号

数据偏移

保留

U

R

G

A

C

K

P

S

H

T

Y

N

F

I

窗口

校验和

紧急指针

TCP报文段固定首部格式

本程序使用套接字socket编程,将网卡设为能够接受流经网卡的所有类型的数据包。

首先,初始化套接字,然后监听数据包,解析数据包。

SOCKETsock=socket(AF_INET,SOCK_RAW,IPPROTO_IP)用来创建套接字,其参数为通信发生的区字段和套接字的类型。

WSAIoctl(sock,IO_RCVALL,&

dwBufferInLen,sizeof(dwBufferInLen)函数用来把网卡设置为混杂模式。

描述符,缓冲区的地址,缓冲区的大小。

recv(sock,buffer,65535,0)函数用来接收经过的IP包,其参数分别是套接字

typedefstructIP_HEAD

{

}}ip_head;

用来定义IP头部数据。

setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)函数用来获取本机IP地址

htons()函数将无符号短整型转换为网络字节顺序的数据

2.1行为模型

程序流程图

3详细设计

3.1网卡设置

为了获取网络中的IP数据包,必须对网卡进行编程,在这里使用套接字(socket)进行编程。

但是,在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的数据包或是以广播形式发出的数据包。

对于其他形式的数据包,如已到达网络接口,但却不是发送到此地址的数据包,网络接口在骓投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的数据包。

我们要想获取网络设备的所有数据包,就是需要将网卡设置为混杂模式。

3.2使用套接字

套接字分为三种,即流套接字(Streamsocket)、数据报套接字(DatagramSocket)

和原始套接字(RawSocket)。

要进行IP层数据包的接收和发送,应使用原始套接字。

创建原始套接字的代码如下:

Socketsock:

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头部。

其代码如下:

structIP_HEADER

unsignedshortip_version,/*IP的版本号*/

ip_hdr_len;

 

/*IP包头的长度*/

ip_tos;

/*IP包的服务类型*/

ip_total_len;

/*IP包的总长度*/

ip_id;

/*IP包的分段标识*/

ip_flags;

/*IP包的分段标志*/

ip_frag_offset;

/*IP包的分段偏移*/

ip_ttl;

/*IP包的生存时间*/

ip_proto;

/*IP包的高层协议*/

ip_hdr_chksum;

/*IP包的校验和*/

structIPADDRESSip_src_addr;

/*IP包的源IP地址*/

ip_dest_addr;

/*IP包的目的IP地址*/

}ipheader;

3.5IP包的解析

解析IP包的字段有两种策略。

针对长度为8位、16位和32位的字段(或子字段)时,可以利用IP-HEADER的成员直接获取。

要解析长度不是8位倍数的字段(或子字段)时,可以利用C语言中的移位以人、及与、或操作完成。

3.6协议的定义

(包含相应的头文件#include#include):

DWORDdwIoControlCode=SIO_RCVALL,/*接收所有的IP包*/

dwProtocol=IPPROTO_IP;

/*协议类型为IP*/

3.7捕获处理

1.加载Winsock;

2.创建一个接收原始IP包的socket连接;

3.绑定到一个接口;

4.进行WSAIoctl设置,接收所有的IP数据包。

代码如下:

if(WSAIoctl(s,dwIoControlCode,&

optval,sizeof(optval),

NULL,0,&

dwBytesRet,NULL,NULL)==SOCKET_ERROR)

5.接着设定一个线程进行捕获:

(1)创建一个接收IP包的链表头;

(2)设置一个标识,为真,则不断进行IP包的捕获;

(3)建立一个新的结点,将捕获的数据包加入到该结点;

(4)如果链表的长度达到指定的长度,创建一个线程对该链表的IP包进行解析;

再设置一个在IP数据包链表不足给定的长度,而又中止IP捕获时,对链表的处理;

(5)为下一个IP包链表创建一个链表头。

(6)建立一个进行IP包解析并显示的线程,进行解析IP数据包,然后显示IP数据包。

源程序如下:

#include<

iostream.h>

fstream.h>

winsock2.h>

ws2tcpip.h>

stdio.h>

stdlib.h>

math.h>

time.h>

#include"

IPNode.h"

NodeList.h"

#pragmacomment(lib,"

Ws2_32.lib"

//定义IP头部

typedefstructIPHeader

unsignedcharVersion_HeaderLength;

//版本(4位)+首部长度(4位)

unsignedcharTypeOfService;

//服务类型

unsignedshortTotalLength;

//总长度

unsignedshortIdentification;

//标识

unsignedshortFlags_FragmentOffset;

//标志(3位)+分片偏移(13位)

unsignedcharTimeToLive;

//生存时间

unsignedcharProtocal;

//协议

unsignedshortHeaderChecksum;

//首部校验和

unsignedlongSourceAddress;

//源IP地址

unsignedlongDestAddress;

//目的IP地址

}IPHEADER;

#if!

defined(AFX_IPNODE_H__1366A568_424A_4BDF_8E76_9AF5BA10D449__INCLUDED_)

#defineAFX_IPNODE_H__1366A568_424A_4BDF_8E76_9AF5BA10D449__INCLUDED_

#if_MSC_VER>

1000

#pragmaonce

#endif//_MSC_VER>

//结点类CIPNode

classCIPNode

private:

unsignedlongm_dwSourIPAddr;

//源IP地址

unsignedlongm

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 兵器核科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1