Linux-C-网卡抓包程序的实现

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录

一、课程设计目的 (2)

二、开发环境、运行方式 (5)

1、开发环境 (5)

2、运行方式 (5)

3、测试结果截图 (6)

三、流程的说明 (8)

四、帧封装的过程 (10)

1、填充帧头部字段 (10)

2、填充数据字段 (10)

3、CRC校验 (10)

4、主程序设计 (12)

五、帧封装方法的相关扩展 (21)

1、比特型算法 (22)

2、字节型算法 (22)

六、课程设计心得与体会 (23)

七、参考文献 (23)

一、课程设计目的

帧是网络通信的基本传输单元,熟悉帧结构对于理解网络协议的概念、协议执行过程以及网络层次结构具有重要的意义。本次作业的目的是应用数据链路层与介质访问控制子层的知识,根据数据链路层的基本原理,通过封装和解析Ethernet 帧,了解Ethernet 帧结构中各个字段的含义,从而深入理解Internet 协议族中的最底层协议——数据链路层协议。

网络节点间发送数据都要将它放在帧的有效部分,分为一个或多个帧进行传送。节点之间可靠的帧传输不仅是通信的保障,而且还可以实现网络控制等各种功能。

1980年,Xerox、DEC与Intel等三家公司合作,第一次公布了Ethernet的物理层、数据链路层规范;1981年Ethernet V2.0规范公布;IEEE 802.3 标准是在Ethernet V2.0规范的基础上制定的,IEEE 802.3针对整个CSMA/CD网络,它的制定推动了Ethernet 技术的发展和广泛应用。Ethernet V2.0规范和IEEE802.3标准中的Ethernet帧结构有一些差别,这里我们按Ethernet V2.0的帧结构进行讨论。

图 1.1 IEEE802.3标准Ethernet帧结构

802.3标准中Ethernet帧结构由以下几个部分组成:

(1)前导码和帧前定界符

前导码由56位(7Byte)的10101010…1010比特序列组成,帧前定界符由一个8位的字节组成,其比特序列位10101011。前导码用于使接收端同步,不计入帧头长度。帧前

定界符

也不计入帧头长度。

(2)目的地址和源地址

目的地址与源地址均分别表示帧的接收结点与发送结点的硬件地址。硬件地址一般称作MAC 地址或物理地址。在Ethernet 帧中,目的地址和源地址字段长度可以是2B 或6B。早期的Ethernet 曾经使用过2B 长度的地址,但是目前所有的Ethernet 都使用6B(即48 位)长度的地址。为了方便起见,通常使用16 进制数书写(例如,

00-13-d3-a2-42-a8)。为了保证MAC地址的唯一性,世界上由一个专门的组织负责为网卡的生产厂家分配MAC地址。

Ethernet帧的目的地址可以分为以下3种。

●单播地址(unicast address):目的地址的第一位为0表示单播地址。目的地址是单播地址,则表示该帧只被与目的地址相同的结点所接收。

●多播地址(multicast address):目的地址的第一位为1表示多播地址。目的地址是多播地址,则表示该帧被一组结点所接接收。

●广播地址(broadcast address):目的地址为全1则表示广播地址。目的地址是广播地址,则表示该帧被所有结点接收。

(3)数据长度字段

802.3标准中的帧用2B定义LLC数据字段包含的字节数。描述了LLC数据的实际长度。

(4)数据字段

IEEE802.3 协议规定LLC 数据的长度在46B 与1500B 之间。如果数据的长度少于46B,需要加填充字节,补充到46B。填充字段是任意的,不计入长度字段值中。帧头部分长度为18B,包括6B 的目的地址字段、6B 的源地址字段、2B 的长度字段、4B 的帧校验和字段,而前导码与帧前界定符不计入帧头长度中,那么,Ethernet 帧的最小长度为64B,最大长度为1518B。设置最小帧长度的一个目的是使每个接收结点能够有足够的

时间检测到冲突。

(5) 帧校验字段

帧校验字段FCS 采用32位CRC 校验。校验的范围包括目的地址字段、源地址字段、长度字段、LLC 数据字段。在接收端进行校验,如果发现错误,帧将被丢弃。在本次作业中,为了简便起见,采用8位的CRC 校验。8位CRC 校验的生成多项式为:

1)(128+++=x x x x G

CRC 校验的工作原理是:

将要发送的数据比特序列当作一个多项式f(x)的系数,在发送端用收发双方预先约

定的生成多项式G(x)去除,求得一个余数多项式。将余数多项式附在数据多项式之后发送到接收端。在接收端用同样的生成多项是G(x)去除接受数据多项式f(x),得到计算余数多项式。如果计算余数多项式与接受余数多项式不相同,则表示传输有差错;否则数据认为正确而被接受。CRC 编码实际上是一个循环移位的模2运算,在加法中不进位,在减法中不借位,等价于操作数的按位异或(XOR )。

CRC 校验的实现:为了简便起见,我们在程序中采用8 位的CRC 校验。8 位CRC 校验的生成多项式如式1 :

G(x) = x8 + x2 + x1 +1 (1)

图1.2 CRC ‐8 的基本实现

就是一个用来计算CRC ‐8(x8 + x2 + x1 +1)的硬件电路实现方法,它由8 个移

位寄存器和3 个加法器(异或单元)组成。计算过程如下:

(1) 编码或解码前将所有寄存器清零;

2) 输入位作为最右边异或操作的输入之一,8 个寄存器上的移位操作同时进行,均为左移一位;

3) 最左边寄存器中位作为所有三个异或操作的输入之一;

4) 每次移位时,最右边的寄存器作为中间异或操作的输入之一,中间的寄存器作为最左边异或操作输入之一;

5) 各个异或操作的结果作为它左边那个寄存器的移入位;

6) 重复步骤 2 到6,每输入一个bit 就做一次移位操作,直到输入了所有要计算的数据为止。这时这个寄存器组中的数据就是CRC-8 的结果。

二.程序的执行环境、运行方式、测试结果截图

1、开发环境

平台:Windows

编程环境:VC 6.0

语言:C++

2、运行方式

1)开始→运行→输入cmd→进入DOS界面

2)改变当前目录到可执行程序所在的文件夹下

3)用户输入命令,程序包含帧封装和帧解析两个部分的功能。

帧封装格式:

[可执行文件名] –p [数据帧文件名]

其中 -p 表示帧封装,数据帧文件名由用户自己拟定。帧封装可以让用户输入任意一段信息,以两个回车作为结束,然后程序将这段信息作为帧的数据字段封装到数据帧文件中。

相关文档
最新文档