东北大学秦皇岛分校计算机网络课程设计.docx

上传人:b****5 文档编号:2863289 上传时间:2022-11-16 格式:DOCX 页数:12 大小:496.67KB
下载 相关 举报
东北大学秦皇岛分校计算机网络课程设计.docx_第1页
第1页 / 共12页
东北大学秦皇岛分校计算机网络课程设计.docx_第2页
第2页 / 共12页
东北大学秦皇岛分校计算机网络课程设计.docx_第3页
第3页 / 共12页
东北大学秦皇岛分校计算机网络课程设计.docx_第4页
第4页 / 共12页
东北大学秦皇岛分校计算机网络课程设计.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

东北大学秦皇岛分校计算机网络课程设计.docx

《东北大学秦皇岛分校计算机网络课程设计.docx》由会员分享,可在线阅读,更多相关《东北大学秦皇岛分校计算机网络课程设计.docx(12页珍藏版)》请在冰豆网上搜索。

东北大学秦皇岛分校计算机网络课程设计.docx

东北大学秦皇岛分校计算机网络课程设计

 

计算机网络课程设计

利用WinPcap编程实现监视某个特定TCP连接的程序

 

系别

计算机与通信工程学院

专业

计算机科学与技术

学号

姓名

指导教师

2013年7月5日

1.1需求分析

学会安装WinPcap,熟悉WinPcap编程机制,学会在VC的IDE中添加相应的库文件,掌握Windows下应用程序的消息机制,利用WinPcap的过滤功能编写一个仅捕获已经分片的IP数据报的应用程序,深入地理解网络协议,了解如何分析网络的安全性和可靠性。

1.2实验要求

在VC++6.0开发环境下,利用WinPcap编程实现监视某个特定TCP连接的程序并显示出来。

1.3实验原理以及相关内容

1TCP协议数据传输的解析

图1:

TCP协议报头

•◆应用程序分割为TCP认为最合适发送的数据块。

由TCP传递给IP的信息单位叫做报文段。

•◆当TCP发出一个报文段后,它启动一个定时器,等待目的端确认收到这个报文段。

如果不能记时收到一个确认,它就重发这个报文段。

•◆当TCP收到发自TCP连接另一端的数据,它将发送一个确认。

这个确认不是立即发送,通常延迟几分之一秒。

•◆TCP将保持它首部和数据的检验和。

这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化如果收到报文段的检验和有差错,TCP将丢弃这个报文段和不确认收到这个报文段。

•◆既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能失序,因此TCP报文段的到达也可能失序。

如果必要,TCP将对收到的数据进行排序,将收到的数据以正确的顺序交给应用层。

•◆既然IP数据报会发生重复,TCP连接端必须丢弃重复的数据。

•◆TCP还能提供流量控制,TCP连接的每一方都有固定大小的缓冲空间。

TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。

这将防止较快主机致使较慢主机的缓冲区溢出。

②WinPcap简明介绍

WinPcap是一个开源的、运行于Win32平台的体系结构,是用于网络封包抓取的一套工具,包括一个内核级别的packetfilter,一个底层的DLL(packet.dll)和一个高级的独立于系统的DLL(Wpcap.dll),packet.dll提供一个底层的API,可以直接访问网络设备驱动,Wpcap.dll是一个强大的捕获程序库。

它为win32应用程序提供访问网络底层的能力,Winpcap不能阻塞、过滤或控制其他应用程序数据报的发收,它仅仅只是监听共享网络上传送的数据包。

本实验利用WinPcap提供的函数来设置网卡模式并捕获响应的数据包,进行解析。

1.4实验内容

①安装Winpcap驱动和DLL程序。

在VC++中配置WinPcap,Tools->options->Directories,添加WinPcap的Include和Lib文件。

如下:

Winpcap功能强大,效率高,使用方便,但是,使用前的准备工作要费一番功夫,步骤如下:

步骤1:

安装驱动程序。

下载WinPcapDriver和DLL并安装,安装后重启机器。

步骤2:

下载wpdpack(Developer’spack)。

解压后会看到其中包含了docs、Include、lib、Examples等文件夹。

图2:

Winpcap包含文件

步骤3:

在VC中设定Include目录及Library目录。

具体做法:

打开VC后,Tools->Option->Directories,在includefiles中添加……\wpdpack\Include目录(步骤2中得到的);在Libraryfiles中添加……\wpdpack\Lib目录。

图3:

添加WinPcap库

②winpcap捕获数据包流程:

计算机是通过网卡和网络中其他的主机进行通信的,网卡相当于数据包进出的大门,我们平时讲的数据包的捕获相当于大门的门卫在检查进出的行人一样。

在网络基础我们学习过,数据包的发送是一个封装的过程,而数据包的接收则是解封装的过程,但是封装和解封装都是在OS内核来完成的,一般的应用程序没办法获取数据包原始的内容,而Winpcap却能提供这样的功能,在数据链路层捕获数据包,提供最原始的信息。

其中Winpcap捕获数据的原理在第一章已经介绍过了,大家可以回顾下。

另外,数据捕获只能捕获通过本主机网卡的数据,没法捕获其他主机上网卡的数据。

下面先看看Winpcap捕获数据时的工作流程。

图4:

Winpcap工作流程

1.5实验结果与分析

经过上述步骤的设计后,执行VC++程序,得到如下的实验结构,可以清楚的看到程序捕获监视TCP连接传输过程的报文段信息。

图5:

程序初始界面

图6:

显示各网卡信息并提示选择

图7:

选择网卡后TCP首部字段

图8:

显示TCP数据包首部控制字段信息

1.6实验总结

在经过相应的课程如《计算机网络》《计算机网络编程》《操作系统》等课程的系统学习之后,可以说对计算机网络已经是耳目能熟了,所有的有关计算机网络的基础知识、基本理论、基本方法和结构体系,我都基本掌握了,但这些似乎只是纸上谈兵,倘若将这些理论性极强的东西搬上实际上应用,那我想我肯定会是无从下手,一窍不通。

自认为已经掌握了一定的计算机网络理论知识在这里只能成为空谈。

于是在坚信“实践是检验真理的唯一标准”下,认为只有把从书本上学到的理论应用于实际的网络设计操作中去,才能真正掌握这门知识。

学习和掌握网络数据包的捕获与分析技术不但有利于理解网络协议,而且对分析网络安全性和可靠性大有益处。

通过上述编程,我们对Winpcap抓包的函数以及获取网络设配的函数有了初步的认识与了解。

可以对实验作进一步的改进,利用Winpcap提供的包捕获功能编制一个监视某个特定TCP连接的程序,要求对TCP首部的控制字段进行详细的解析和显示,加深对网络协议的理解。

1.7附源代码

#include

#include

#include

#include

#pragmacomment(lib,"ws2_32")

#pragmacomment(lib,"wpcap")

//以太帧结构体

typedefstructether_header{

unsignedcharether_dhost[6];

unsignedcharether_shost[6];

unsignedshortehter_type;

}ETH_HEADER;

//IPv4报头结构体

//IP头部

typedefstruct

{

unsignedcharhdr_len:

4;//lengthoftheheader

unsignedcharversion:

4;//versionofIP

unsignedchartos;//typeofservice

unsignedshorttotal_len;//totallengthofthepacket

unsignedshortidentifier;//uniqueidentifier

unsignedshortfrag_and_flags;//flags

unsignedcharttl;//timetolive

unsignedcharprotocol;//protocol(TCP,UDPetc)

unsignedshortchecksum;//IPchecksum

unsignedlongsource_ip;//sourceIPaddress

unsignedlongdest_ip;//destinationIPaddress

}IP_HEADER;

//TCP报头结构体

typedefstructtcp_header{

u_shortSourPort;//源端口号

u_shortDestPort;//目的端口号

u_longSeqNo;//序列号

u_longAckNo;//确认序列号

u_shortHLen;//首部长度

u_shortFlag;//标识

u_shortWindow;//窗口大小

u_shortChkSum;//校验和

u_shortUrgPtr;//紧急指针

}TCP_HEADER;

voidInitAdapter();

//初始化网络适配器

voiddispacher_handler(u_char*user,conststructpcap_pkthdr*header,constu_char*p);

//解析TCP数据包格式

voidCloseAdapter();

//关闭网络适配器

pcap_if_t*pAdaptersList,*pAdapter;

charerrbuf[PCAP_ERRBUF_SIZE];

pcap_t*adhandle;

intmain(){

intcount=0,number;

printf("请输入最大获取包数:

");

scanf("%d",&number);

InitAdapter();

printf("源端口目的端口序列号确认序列号首部长度标识窗口大小校验和紧急指针");

while(count<=number){

pcap_loop(adhandle,1,dispacher_handler,NULL);

//捕获数据包

count++;

}

CloseAdapter();

return0;

}

voidInitAdapter(){

intiAdapterCount=0,iAdapterSelected;

if(pcap_findalldevs(&pAdaptersList,errbuf)==-1){

printf("网络设备查找错误!

");

return;

}

printf("网卡信息:

\n");

for(pAdapter=pAdaptersList;pAdapter!

=NULL;pAdapter=pAdapter->next)

{

iAdapterCount++;

if(pAdapter->description)//如果有描述则输出详细信息

printf("%d:

%s\n",iAdapterCount,pAdapter->description);

else//否则输出网卡名

printf("%s\n",pAdapter->name);

}

//保存用户选择的网卡序列号

printf("请选择一个网卡:

");

scanf("%d",&iAdapterSelected);

//跳到指定网卡

pAdapter=pAdaptersList;

for(inti=1;i

pAdapter=pAdapter->next;

if((adhandle=pcap_open_live(pAdapter->name,65535,1,300,errbuf))==NULL){

//打开选取的网络适配器

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

当前位置:首页 > 职业教育 > 其它

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

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