课程设计
课程名称计算机网络
题目名称 Ethernet 帧发送过程模拟程序
学生学院计算机学院
专业班级
学
号
学生姓名
指导教师柳毅
2011 年 12 月 25 日
目
录
一、课程设计目的与意义 ····································································· 4
二、课程设计要求 ·············································································· 4
三、帧结构分析 ················································································· 4
1.帧的介绍 ················································································4
2.CRC 校验分析 ·········································································6
四、帧封装的过程 ·············································································· 9
1、填充帧头部字段 ·······································································9
2、填充数据字段 ········································································ 10
3、CRC 校验 ··············································································11
五、帧封装流程图 ·············································································13
六、帧封装方法的相关扩展 ·································································14
1、比特型算法 ··········································································· 14
2、字节型算法 ··········································································· 14
七、程序调试分析与结果 ····································································15
八、课程设计心得与体会 ····································································16
附录一:参考文献 ·············································································17
附录二:帧封装源程序 ·······································································18
一、课程设计目的与意义
帧是在数据链路层数据进行传输与交换的基本单位。构造帧对于理解网络协
议的概念、协议执行过程以及网络问题处理的一般方法具有重要的意义。本次课
程设计的目的是应用数据链路层与介质访问控制层的知识,根据数据链路层的基
本原理,通过构造一个具体的 Ethernet 帧,从而深入理解网络协议的基本概念
与网络问题处理的一般方法。
二、课程设计要求
编写程序,根据给出的原始数据,组装一个 IEEE802.3 格式的帧,(默认的
输入文件为二进制原始数据)。
1) 要求程序为命令行程序。比如,可执行文件各为 framer.exe,则命令行
形式如下:
framer inputfile
outpurfile
其中,inputfile 为原始数据文件,outpurfile 为输出结果。
2) 输出:对应 input1 和 input2 的结果分别为 output1 和 output2。
3) 开发环境:
硬件环境:PC 微机
软件环境:Windows xp
Microsoft Visual C++ 6.0
三、帧结构分析
1.帧的介绍
术语“帧”来源于串行线路上的通信。其中,发送者在发送数据的前后各添
加特殊的字符,使它们成为一个帧。Ethernet 从某种程序上可以被看作是机器
这间的数据链路层连接。
首先我们来认识一下 Ethernet 帧结构,Ethernet V2.0 规范和 IEEE802.3
标准中的 Ethernet 帧结构有一些差别,这里我们按 802.3 标准的帧结构进行讨
论,图一给出了 Ethernet 帧结构图。
前导码 帧前定界符 目的地址 源地址
长度字段 数据字段
校验字段
(7B)
(1B)
(2/6B)
(2/6B)
(2B)
(长度可变)
(4B)
图一 Ethernet 帧结构
如图一所示,802.3 标准的 Ethernet 帧结构由 6 部分组成。
(1)前导码与帧前定界符字段
前导码由 56 位(7B)的 1010101…101010 位序列组成。帧前定界符可以
视为前导码的延续。1B 的帧前定界符结构为 10101011。
如果将前导码与帧定界符一起看,那么在 62 位 101010…1010 位序列之后出
现 11。在 11 之后是 Ethernet 帧的目的地址字段。前导码与帧前定界符主要是
保证接收同步,这 8B 接收后不需要保留,也不记入帧头长度中。
(2)目的地址和源地址
目的地址(DA)与法制地址(SA)分别表示帧的接收结点地址与发送结点的硬
件地址。
在 Ethernet 帧中,目的地址和法制地址字段长度可以是 2B 或 6B。目前
的 Ethernet 都使用 6B(即 48 位)长度的地址。
Ethernet 帧的目的地址可以是单播地址(unicast address)、多播地址
(multicast address)与广播地址(broadcast address),目的地址的第一位
为 0 表示单播地址,为 1 表示多播地址,目的地址为全 1 表示广播地址。
(3)长度字段
802.3 标准中的帧用 2B 定义数据字段包含的字节数。协议规定,帧数据的
最小长度为 46B,最大长度为 1500B。设置最小帧长度的目的是使每个接收结点
能够有足够的时间检测到冲突。
(4)数据字段
帧数据字段的最小长度为 46B。如果帧的 LLC 数据少于 46B,则应将数据字
段填充至 46B。填充字符是任意的,不计入长度字段值中。
(5)检验字段
帧校验字段(FCS)采用 32 位的 CRC 校验。校验的范围包括目的地址字段、
源地址字段、长度字段、LLC 数据字段。
此处,为了简便起见,采用 8 位的 CRC 校验。CRC 校验的生成多项式为:
G(x)= x8+ x2+x+1
某些帧结构中还会包括帧类型字段,用来识别些帖所承载的数据的类型。当
一个帧到达指定的计算机时,操作系统根据帧类型决定用哪个协议软件模块对它
进行处理。自识别帧的主要优点是,可以在同一物理网络中使用多个协议而互不
干扰。
2.CRC 校验分析
我们已经知道了差错控制在通信中的重要意义,以及简单的差错校验码计算
过程。在这里我们进一步来了解循环冗余编码(CRC)的编码方式。它是一种重要
的线性分组码、编码和解码方法,具有简单、检错和纠错能力强等特点,在通信
领域广泛的用于实现差错控制。实际上,除数据通信外,CRC 在很多领域也是大
有用武之地的。
利用 CRC 进行检错的过程可简单描述如下:在发送端根据要传送的 k 位二进
制码序列,以一定的规则产生一个校验用的 r 位监督码(CRC 码),附在原始信息
的后边,构成一个新的二进制码序列(共 k+r 位),然后发送出去。在接收端,根
据信息码和 CRC 码之间所遵循的规则进行检验,以确定传送中是否出错。这个规
则在差错控制理论中称为“生成多项式” 。
(1)CRC 编码的代数学原理
在代数编码理论中,将一个码组表示为一个多项式,码组中的各码元作为多
项式的系数。
例如,1100101 表示为 1·x6+1·x5+0·x4+0·x3+1·x2+0·x+1,
即 x6+x5+x2+1。
设编码前的原始信息多项式为 P(x), P(x)的最高幂次加1等于 k;生成多项
式为 G(x),G(x)的最高幂次等于 r;CRC 多项式为 R(x);编码后的带 CRC 的信息
多项式为 T(x)。
发送编码的方法是:将 P(x)乘以 x^r(即对应的二进制码序列左移 r 位),再
除以 G(x),得余式即为 R(x)。
用公式可以表示为 T(x)=xrP(x)+R(x)
接收方解码的方法是:将 T(x)除以 G(x),如果余数为 0,则说明传输中无错
误发生,否则说明传输有误。
举例来说,设信息码为 1100,生成多项式为 1011,即 P(x)=x³+x²,G(x)=x³
+x+1,则可以用以下方法计算 CRC 。
xrP(x)
x3(x3+x2)
x6+x5
x
-------- = ---------- = -------- = (x3+x2+x) + --------
G(x)
x3+x+1
x3+x+1
x3+x+1
即 R(x)=x。注意到 G(x)最高幂次 r=3,得出 CRC 为 010。如果用竖式除法,计算
过程为:
1110
1011/1100000
(1100 左移 3 位)
1011
1110
1011
1010
1011
0010
0000
010
因此,T(x)=(x6+x5)+(x)=x6+x5+x,即 1100000+010=1100010。
如果传输无误,则
T(x)
G(x)
x6+x5+x
x³+x+1
x³+²+x
无余式。看一下上面的竖式除法,如果被除数是 1100010,显然在商第 3 个 1 时,
就能除尽。
上述推算过程有助于我们理解 CRC 的概念。但如果直接编程来实现上面的算
法,不仅繁琐,而且效率也不高。实际上在工程中不会直接这样去计算和验证
CRC。
表一 标准的 CRC
名称
生成多项式
简记式
*
应用举例
ITU G.704
x4+x+1
x12+x11+x3+x+1
x16+x12+x2+1
CRC-4
CRC-12
CRC-16
CRC-ITU**
1005
IBM SDLC
x16+x12+x5+1
1021
ISO HDLC, ITU
X.25,
V.34/V.41/V.42,
CRC-32
x32+x26+x23+...+x2+x+1
04C11DB7
CRC-32c
x32+x28+x27+...+x8+x6+1
1EDC6F41
PPP-FCS
ZIP, RAR, IEEE
802 LAN/FDDI,
IEEE 1394,
PPP-FCS
SCTP
该表中列出了一些标准 CRC 资料。
① 生成多项式的最高幂次项系数是固定的 1,故在简记式中,将最高的 1 统
一去掉了,如 04C11DB7 实际上是 104C11DB7 。
② 前称 CRC-CCITT。ITU 的前身是 CCITT。
(2)CRC 的硬件电路实现
图 2 给出了 CRC 运算通用电路的方框图。
g1
g2
gn-2
+
+
gn
+
+
+
+
LSB
b0
数据输入
+
+
+
MSB
bn-1
b1
b2
bn-2
图二
CRC 运算通用电路方框图
CRC 计算生成多项式 G(x)通常用 n 次多项式定义:G(x)=Xn+gn-1Xn-1+…giXi+…
+g2X2+g1X+1,其中 gi 为 0 或 1,i=1,2,…,n-1。通常 CRC 计算可以用有 n 个存
储器级的移位寄存器实现,如图二所示。如果多项式的相应项的系数为 1,那么
相应的存储器级输入端的模 2 加法器是有分支的。根据应用的不同,在系统开始
工作前将所有的移位寄存器全部置“0”或“1” 。
在图二中输入端送入的是原始数据序列,移位寄存器各级的输出 b0、b1、…、
bn-2、bn-1 便是 CRC 码字。其中 b0 和 bn-1 分别代表最低有效位(LSB)和最高有效位
(MSB)。
(3)CRC 的基本实现