计算机网络课程设计报告
题
目:
监控 IP 包流量
学生姓名:
学
号:
专业班级:
同组姓名:
指导教师:
设计时间:
指导老师意见:
评定成绩:
签名:
日期:
年 月 日
目 录
一、 课程设计的目的和意义................................................................2
二、 课程设计的内容和要求................................................................2
三、 课程设计的相关技术....................................................................2
四、 课程设计过程............................................................................... 4
五、 课程设计小结............................................................................... 6
六、 参考文献....................................................................................... 8
七、 附录...............................................................................................8
1
一、 课程设计的目的和意义
随着 Internet 技术的发展,基于 IP 协议的应用成为网络技术研究与软件开发
的一个重要基础,因此学习网络层以基本概念,了解 IP 协议的基本内容,对于
掌握 TCP/IP 协议的主要内容和学习网络课程是十分重要的,通过本次课程设计,
有助于熟悉 IP 包格式和加深对 IP 协议的理解。
随着网络技术的飞速发展,链路容量和设备处理能力不断升级,Internet 的
规模呈爆炸性增长,社会对 Internet 的依赖性越来越高,随之而来,网络传输的
业务类型已从简单的低带宽要求的文件传送、电子邮件等变为数据、语音、视频
等大流量业务,并且,业务对可靠性,实时性,安全性传输的要求越来越高监控
本地网络。捕获一段时间内以本机为源或目的地址的 IP 数据包,统计 IP 数据包
的信息,列出本机到相同目的地址或同一源地址到本机且数据包协议类型相同的
数据包的数量。
二、 课程设计的内容和要求
编制程序,监控网络,捕获一段时间内网络上的 IP 数据包,按 IP 数据包的
源地址统计出该源地址在该时间段内发出的 IP 包的个数,将其写入日志文件中。
程序的具体要求如下:
用命令行运行:IPStatistic time logfile
其中,IPStatistic 是程序名;time 是设定的统计时间间隔(单位为分钟,比
如,2 表示 2 分钟);logfile 表示统计结果写入的日志文件名(若用图形表示统计
结果则可以不选这个参数)。
相关知识:
IP 是 ICP/IP 协议体系中的网络层协议,TCP、UDP、ICMP 和 IGMP 等其他
协议都是以 IP 协议为基础的。IP 的特点如下:
(1)IP 协议是一种不可靠、无连接的数据报传送协议。
(2)IP 协议是点对点的网络层通信协议。
(3)IP 协议向通信层隐藏了物理网络的差异。
三、 课程设计的相关技术
1、程序中会用到 Winpcap, Winpcap 是 Windows packet capture 的缩写,这是 UNIX
下的 lipbcap 移植到 Windows 下的产物,是 Win32 环境下数据包捕获的开放代码
函数库。Winpcap 由内核级的数据包过滤器,底层动态链接库(packet.dll)和一
个高层的独立于系统的库(wpcap.dll)组成。
Winpcap 提供以下功能:
1)捕获原始数据报,包括共享网络上各主机发送/接收的数据报以及各主机之
间交换的数据报。
2
2)在数据报发往应用程序之前,按照自定义的规则过滤某些特殊的数据报。
3)将用户构造的数据报发送到网络中。
4)统计网络的流量。
Winpcap 的主要功能在于独立于主机协议(如 TCP/IP)发送和接收原始数据报。
也就是说,Winpcap 不能阻塞、过滤或控制其他应用程序数据报的收发,它只是
监听共享网络上传送的数据报。因此,它不能用于 QoS 调度程序或个人防火墙。
基于 Winpcap 的应用程序一般按照下面几个步骤编写:
1)获取网络设备列表。
2)选择网卡并打开。
3)当捕获数据包时,可能需要设置过滤器。
4)捕获数据包或者发送数据包。
Packet.dll 相关数据结构
typedef struct_ADAPTER
typedef struct_PACKET PACKET 具 //描述一组网络数据报的结构
typedef struct NetType NetType
typedef struct npf_if_addr npf_if_addr //描述一个网络适配器的 IP 地址
struct bpf_hdr
struct bpf_stat
(2)列出网卡列表,让用户选择可用的网卡。
(3)注意过滤器的使用,只需捕获 IP 所,别的包都需过滤掉。
ADAPTER //描述一个网络适配器
//描述网络类型的数据结构
//数据报头部
//当前捕获数据报
2、熟悉 IP 首部格式
3、参考算法
(1)取得当前网络设备列表(在标准输出上显示,以让用户进行选择)。
(2)将用户选择的 Ethernet 卡以混杂模式打开,以接收到所有的数据包。
(3)设置过滤器,此处的过滤器“IP”。
(4)捕获 IP 包并按包的源地址进行统计(用链表结构进行实现)。
3
四、 课程设计过程
1、设计流程图
开始
获取网卡列表
选取使用的网卡
打开网卡(混杂模式)
编译设置过滤器
捕获 IP 包
将 IP 包源地址加入链表
超时否?
输出链表内容
结束
图 1-1 程序流程图
4
2、获取本机网卡信息
本课程设计要实现对数据包的捕获,首先就要获取并列出本机上的所有网卡
信息,这个功能是通过 Winpcap 提供的 pcap_findalldevs 来实现的。该函数原型
如下:
int pcap_findalldevs(pcap_if_t** alldevs, char* errbuf)
pcap_if_t 是一个用于描述网卡信息的结构体。里面包含了网卡的名字,描述
等信息。通过这个函数可以得到一个网卡信息组成的链表。函数错误则返回-1。
3、打开用户选定的网卡
得到网卡信息之后,可以通过列表框等形式显示出来,在用户选择后,通过
pcap_open_live 打开指定网卡:
pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *
ebuf)
函数功能:获得用于捕获网络数据包的数据包捕获描述字。
参数说明:device 参数为指定打开的网络设备名。snaplen 参数定义捕获数
据的最大字节数。promisc 指定是否将网络接口置于混杂模式。to_ms 参数指*定
超时时间(毫秒)。ebuf 参数则仅在 pcap_open_live()函数出错返回 NULL 时用于
传递错误消息。
这些参数中最重要的就是 promisc 参数,通过它可以将网卡监听设置为混杂
模式,混杂模式是指不管网卡接收到的数据包是不是发给自己的,都向应用程序
上传。这样可以捕获一些广播信息。本程序将监听模式设为混杂模式。
4、编译并设置过滤器
在打开网卡并得到网卡描述符后,可以编译并设置过滤器。
编译过滤器:
int pcap_compile(pcap_t* p,struct bpf_program*
char* str,int optimize, bpf_u_int32 netmask)
fp,
编译一个数据包过滤器,将一个能被核心态(kernel-level)过滤器引擎解释
的程序中的高层过滤表达式(filtering expression)进行转化。pcap_compile()被用
来将字符串 str 编译进过滤器程序(fp),程序(fp)是一个指向 bpf_program 结
构 体 并 被 pcap_compile() 赋 值 的 指 针 。 optimize 控 制 是 否 对 目 标 代 码
(resulting code)的性能进行优化。Netmask 表明 IPv4 掩码,它仅在检查过滤器
程序中的 IPv4 广播地址的时候被使用。返回-1 表示发生了错误,此时,
pcap_geterr()将被用来显示错误信息。
设置过滤器:
int pcap_setfilter(pcap_t* p,struct bpf_program* fp)
把一个过滤器同一次抓包关联起来。pcap_setfilter 被用来指定一个过滤器程
序。fp 是一个指向 bpf_program 结构体的指针,通常是 pcap_compile()执行的结
果。当失败时返回-1,此时,pcap_geterr()被用来显示错误信息;返回 0 表示成
功。
5
5、抓包:
pcap_loop 两种
接下来就是最后一步抓包,Winpcap 提供的抓包接口主要有 pcap_next_ex 和
pcap_loop 直接由数据包捕获驱动所调用,它在底层抓取到包时,直接调用
用户传入的处理函数
本程序使用另一个函数 pcap_next_ex:
pcap_next_ex(pcap_t* p,struct pcap_pkthdr** pkt_header,const u_char** pkt_data)
功能: 从 interface 或离线记录文件获取一个报文
参数: p: 已打开的捕捉实例的描述符
pkt_header: 报文头
pkt_data: 报文内容
返回值: 1: 成功 0: 获取报文超时
-1: 发生错误 -2: 获取到离线记录文件的最后一个报文
五、 课程设计小结
1、运行结果:
在 VC++中导入 WpdPack 的 Include 和 Lib 文件夹后,程序编译调试通过。
运行界面如下:
图 1-2 程序运行界面
DOS 环境下定位到程序所在文件夹,运行 IPstatistic.exe,加入 1 log.txt 参数。
此时程序会检测机器的网卡,选择要监控的网卡,输入对应的数字,开始监控。
等待一分钟即可看到监控结果。
图 1-3 系统网卡参数截图
6
等待一分钟后监控结果如下图:
图 1-4 监控 1 分钟的截图
2、总结:
通过完成本次课程设计,使我从中学到了很多语言的用法,对 C,C++加深了
理解,使得自身能力有所增强了解决和处理问题的逻辑性的思维,在学习过程中,
受益匪浅,感触很多,很多学习的理论知识终于有所实现,解决问题思路也变得
更加清晰了,在实现程序的而过程中,也注意到了很多的困难,仅凭个人的掌握
是不够的,还要更多的借助于学习,不断的求索,才可达到理想的目标,要想将
程序设计的更加完善,还得真下上一番功夫. 总之,通过这次的努力,编写出此
程序,对已有知识有了更进一步的理解和认识,让我有了更好的实践,使我对计
7