由于腾讯云上提供了Windows系统,所以我们这次Winpcap编程选用腾讯云主机实验。
我的
腾讯云主机
预装了
Windows Server
,截图如下:
系统版本是WIndowsServer 2012 64位。
编程目标
首先说一下本次Winpcap编程的目标任务:
1、基本任务(达标任务)
完成两台主机之间的数据通信(数据链路层)
-
仿真ARP协议获得网段内主机的MAC表
-
使用帧完成两台主机的通信(Hello! I’m …)
2、高端任务(优秀任务)
完成两台主机通过中间主机的数据通信(网络层)
编程概述
一句话,我们需要利用winpcap这个库用C语言编程来实现以上的任务。
Winpcap讲解
那么winpcap是什么?
大多数网络应用程序通过被广泛使用的操作系统原件来访问网络,如socket。由于操作系统已经处理了底层的细节问题(如协议的处理、数据包的封装等),并提供了与读写文件类似的函数接口,因此使用该方法可以很容易的访问网络中的数据。
然而有些时候,这种简单的方式并不能满足任务要求,有些应用程序需要直接访问网络中的数据包,也就是说,需要访问哪些没有被操作系统处理过的数据包。
WinPcap就是为Windows平台的应用程序提供这种访问方式,提供下列功能:
捕获原始数据包。无论是发送到运行WinPcap的机器上的数据包,还是在其它主机(存在网络共享介质上的主机)上进行交换的数据包,都可以被捕获。
在数据包传递给应用程序之前,根据用户指定的规则过滤数据包。
将原始数据包发送到网络上收集网络流量与网络状态的统计信息,它提供给我们什么呢?
它包含一个内核空间数据包过滤器(Netgroup Packet Filter, NPF),一个底层动态链接库(Packet.dll)和一个高层独立于操作系统的动态链接库(wpcap.dll)。
各部分关系见下图:
NPF:为了能够访问网络上传输的原始数据,数据包捕获系统需要绕过操作系统的协议栈。这就需要有一部分程序运行在操作系统的内核中,只有这样才能与网络接口驱动直接交互。在WinPcap中,与操作系统密切相关的是一个名为NPF的设备驱动程序,同时对不同版本的操作系统提供了不同版本的驱动程序。这些驱动程序提供了数据包捕获与发送的基本功能,同时提供了一个可编程的数据包过滤系统、一个网络监视引擎等高级功能。
动态链接库:为了让应用程序能够使用内核驱动提供的功能,数据包捕获系统必须导出相关的接口。对此,WinPcap提供两个不同层次的动态链接库:Packet.dll和wpcap.dll。 Packet.dll提供底层的API,用来直接访问驱动程序的函数,用来提供独立于微软公司不同操作系统的编程接口。
wpcap.dll库导出了更强大、更高层的捕获函数接口,具有与UNIX捕获库libpcap的兼容性。这两个库可使数据包的捕获独立于底层的网络硬件与操作系统。
编程流程
了解了winpcap之后,我们要做的就是利用它提供的类库来实现网络传输,网络解析等一系列的功能。
需要我们做好的准备有:
-
C语言的相关基础
-
计算机网络的基础知识
-
对开发环境的相关了解
如果对于上述中任何一个不熟悉,请先去补习一下基础知识吧。
参考资料
-
吴功宜等,《计算机网络高级软件编程技术》(第2版),清华大学出版社
-
徐恪等, 《高级计算机网络》,清华大学出版社
-
A.S. Tannenbaum,《计算机网络》(第5版),清华大学出版社
-
吕雪峰等, 《网络分析技术揭秘(原理、实践与WinPcap深入解析》,机械工业出版社