版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、学 号: 课 程 设 计题 目帧封装学 院计算机科学与技术学院专 业软件工程专业班 级软件0902班姓 名指导教师2012年6月20日课程设计任务书学生姓名: 专业班级: 软件0902班 指导教师: 工作单位: 计算机学院 题目一: 帧封装 初始条件:(1)学习相关知识(2)C/C+/VC/VB/JAVA语言(3)PC机一台要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)编写程序,根据给出的原始数据,组装一个IEEE802.3格式的帧(题目默认的输入文件为二进制原始数据(文件名为input1和input2)。1)要求程序为命令行程序。比如,可执行文件名为fra
2、mer.exe,则命令行形式如下:framer inputfile outputfile其中,inputfile为原始数据文件,outputfile为输出结果。使用操作系统、语言、编程环境不限,但在报告中必须注明。2)输出:对应input1和input2的结果分别为output1和output2。时间安排:第一、二天:查阅资料,学习算法第三、四天:编程调试第五天:书写报告指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日目录1.引言42.以太网帧格式的发展43.IEEE802.3帧结构54.错检测65.实现步骤75.1前导符75.2目的地址及源地址75.3长度及数据字段85.4帧
3、检验序列86.源代码107.运行结果示例178.心得体会189.参考文献19帧封装1. 引言以太网这个术语通常是指由DEC、Intel和Xerox公司在1982年联合公布的一个标准,它是当今TCP/IP采用的主要的局域网技术,它采用一种称作CSMA/CD的媒体接入方法。在TCP/IP世界中,以太网IP数据报文的封装在RFC 894中定义。以太网采用广播机制,所有与网络连接的工作站都可以看到网络上传递的数据。通过查看包含在帧中的目标地址,确定是否进行接收或放弃。如果证明数据确实是发给自己的,工作站将会接收数据并传递给高层协议进行处理。以太网采用CSMA/CD(Carrier Sense Mult
4、iple Access/Collision Detection)媒体访问机制,任何工作站都可以在任何时间访问网络。在以太网中,所有的节点共享传输介质。如何保证传输介质有序、高效地为许多节点提供传输服务,就是以太网的介质访问控制协议要解决的问题。帧是在数据链路层数据进行传输与交换的基本单位。构造帧对于理解网络协议的概念、协议执行过程以及网络问题处理的一般方法具有重要的意义。本次课程设计的目的是应用数据链路层与介质访问控制层的知识,根据数据链路层的基本原理,通过构造一个具体的Ethernet帧,从而深入理解网络协议的基本概念与网络问题处理的一般方法。2. 以太网帧格式的发展1980,DEC、Int
5、el、Xerox制订了Ethernet I的标准;1982,DEC、Intel、Xerox又制订了Ehternet II的标准;1982,IEEE开始研究Ethernet的国际标准802.3;1983,迫不及待的Novell基于IEEE的802.3的原始版开发了专用的Ethernet帧格式;1985,IEEE推出IEEE 802.3规范,后来为解决EthernetII与802.3帧格式的兼容问题,推出折衷的Ethernet SNAP格式。3. IEEE802.3帧结构数据在网络上是以很小的称为帧(Frame)的单位传输的,帧由几部分组成,不同的部分执行不同的功能。帧通过特定的称为网络驱动程序的
6、软件进行成型,然后通过网卡发送到网线上,通过网线到达它们的目的机器,在目的机器的一端执行相反的过程。接收端机器的以太网卡捕获到这些帧,并告诉操作系统帧已到达,然后对其进行存储。“帧”数据大致由两部分组成:帧头和帧数据。帧头包括接收方主机物理地址的定位以及其它网络信息。帧数据区含有一个数据体。为确保计算机能够解释数据帧中的数据,这两台计算机使用一种公用的通讯协议。互联网使用的通讯协议简称IP,即互联网协议。IP数据体由两部分组成:数据体头部和数据体的数据区。数据体头部包括IP源地址和IP目标地址,以及其它信息。数据体的数据区包括用户数据协议(UDP),传输控制协议(TCP),还有数据包的其他信息
7、。这些数据包都含有附加的进程信息以及实际数据。866246 15004前导符目的地址源地址长度数据FCS图3.1 IEEE802.3帧结构常用的以太网MAC帧格式用两种标准,一种是DIX Ethernet V2标准(即以太网V2标准),另一种是IEEE的802.3标准。这里只介绍符合IEEE802.3标准的帧,其格式如图3.1所示。它的组成比较简单,由6个字段组成。接下来对这6个部分详细介绍一下。(1)前导符:由7字节的前同步码和1字节的帧起始定界符构成。前同步码:这个字段有7个字节(56位)交替出现的1和0,它的作用就是提醒接收系统有帧的到来,以及使到来的帧与计时器进行同步。前同步码其实是在
8、物理层添加上去的,并不是(正式的)帧的一部分。前同步码的目标是允许物理层在接收到实际的帧起始符之前检测载波,并且与接收到的帧时序达到稳定同步。帧起始定界符:这个字段用1字节(10101011)作为帧开始的信号,表示一帧的开始。最后两位是11,表示下面的字段是目的地址。(2)目的地址(DA) 48位,表示帧准备发往目的站的地址,共6个字节,可以是单址(代表单个站)、多址(代表一组站)或全地址(代表局域网上的所有站)。当目的地址出现多址时,表示该帧被一组站同时接收,称为“组播”(Multicast)。目的地址出现全地址时,表示该帧被局域网上所有站同时接收,称为“广播”(Broadcast),通常以
9、DA的最高位来判断地址的类型,若第一字节最低位为“0”则表示单址,第一字节最低位为“1”则表示组播。(3)源地址(SA)48位,表明该帧的数据是哪个网卡发的,即发送端的网卡地址。(4)该字段是“长度/类型”。当这个字段的值大于0X0600时(相当于十进制的1536),就表示“类型”。这样的帧和以太网V2 MAC帧完全一样。只有当这个字段的值小于0X0600时才表示“长度”,即MAC帧的数据部分长度。(5)数据字段的最小长度必须为46字节以保证帧长至少为64字节,这意味着传输一字节信息也必须使用46字节的数据字段:如果填入该字段的信息少于46字节,该字段的其余部分也必须进行填充。数据字段的默认最
10、大长度为1500字节。(6)帧检验序列(FCS)是32位冗余检验码(CRC),检验除前导、SFD和FCS以外的内容。当发送站发出帧时,一边发送,一边逐位进行CRC检验。最后形成一个32位CRC检验和填在帧尾FCS位置中一起在媒体上传输。接收站接收后,从DA开始同样边接收边逐位进行CRC检验。最后接收站形成的检验和若与帧的检验和相同,则表示媒体上传输帧未被破坏。反之,接收站认为帧被破坏,则会通过一定的机制要求发送站重发该帧。4. 错检测在校验字段中,使用的是CRC校验。校验的范围包括目的地址字段、源地址字段、长度字段、LLC数据字段。循环冗余编码(CRC)是一种重要的线性分组码、编码和解码方法,
11、具有简单、检错和纠错能力强等特点,在通信领域广泛地用于实现差错控制。CRC校验码的检错能力很强,不仅能检查出离散错误,还能检查出突发错误。利用CRC进行检错的过程可简单描述如下:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督码(CRC码),附在原始信息的后边,构成一个新的二进制码序列(共k+r位),然后发送出去。在接收端,根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。这个规则在差错控制理论中称为“生成多项式”。循环冗余校验码的特点:(1)CRC校验码可检测出所有单个错误。(2)CRC校验码可检测出所有奇数位错误。(3)CRC校验码可检测出所有双
12、位的错误。(4)CRC校验码可检测出所有小于、等于校验位长度的突发错误。(5)CRC校验码可以 的概率检测出长度为(K+1)位的突发错误。5. 实现步骤123455.1 前导符前导符包括7字节的前发送码和1字节的帧起始定界符。由于这些都是固定写法,因此添加起来非常简单。对应方法如下。public static boolean appendPrefix() / 前导符中前7个字节是交替出现的1和0for (int i = 0; i 7; +i) tmp.add(0XAA);/ 前导符的第8个字节是约定好的0XABtmp.add(0XAB);return true;5.2 目的地址及源地址我们知道
13、,目的机器的硬件地址是通过ARP协议得到的,这需要发送ARP请求包才能得到,为了简化程序的设计,突出本次设计的要点,因此将目的地址固定写成“FF:FF:FF:FF:FF:FF”。类似地,获得本机地址也需要通过一系列的函数调用,在程序中就直接写成已知的硬件地址“74:E5:0B:7D:CE:3A”。对应方法如下。public static boolean appendAddress() / 由于未显式要求目的地址,因此程序中将目的地址固定为FF:FF:FF:FF:FF:FFfor (int i = 0; i 6; +i) tmp.add(0XFF);/ 本机地址为74:E5:0B:7D:CE:3
14、Atmp.add(0X74);tmp.add(0XE5);tmp.add(0X0B);tmp.add(0X7D);tmp.add(0XCE);tmp.add(0X3A);return true;5.3 长度及数据字段对于发送端来说,必须先获得数据的长度,将长度字段添加到帧中之后才能再添加数据字段,这就限定了必须访问输入文件两次,第一次用于获得文件长度,第二次用于封装帧。当然在进行CRC计算的时候有一些地方可以优化。本程序的文件是通过FileInputStream进行读入,通过FileOutputStream进行输出。5.4 帧检验序列计算FCS是本程序最困难的部分。算法描述如下:(1)输入需要
15、检验的序列M,以及发送方与接收方约定好的除数P,并初始化余数R为0,若P有n位,则R有n 1位;(2)对序列M中的每一位(记为b)进行步骤(3)。结束后R即为FCS。(3)将R左移1位,并将b添加到R的最低位,判断R的最高位,如果是0,则继续(3),如果是1,则将R和P进行按位与操作,结果保存到R中。图5.4.1 CRC流程图相应的流程图如图5.4.1所示,其实现如下,其中curByte为一个字节,currentR为从开始到现在已经循环计算所得的余数。public static int nextR(int currentR, int curByte) int mask = 0X80;int c
16、urBit = 0;for (int i = 0; i = 1) / 计算当前位,0或者1curBit = (curByte & mask) = 0 ? 0X0 : 0X1;/ 首先将余数左移1位,并把当前位添加到余数的最低位currentR = 1;currentR += curBit;/ 判断余数最高位是否为0/ 若为1,则将除数和余数进行异或操作,将结果保存为余数if (currentR & MASK_HIGH) != 0) currentR = currentR P;return currentR;6. 源代码import java.io.File;import java.io.Fil
17、eInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.LinkedList;import java.util.List;public class framer public static void main(String args) throws IOException if (args.length 2) System.out.println(参数错误!);re
18、turn;FileInputStream fin = null;FileOutputStream fout = null;try fin = new FileInputStream(new File(args0);fout = new FileOutputStream(args1); catch (IOException e) System.out.println(文件错误!);return;/ 添加前导符appendPrefix();/ 添加目的地址和源地址appendAddress();/ 添加数据,包括数据长度、数据内容以及帧检验序列appendData(fin, fout);fin.c
19、lose();fout.close();/* * 添加8个字节的前导符 * * return 添加成功时返回true,否则false */public static boolean appendPrefix() / 前导符中前7个字节是交替出现的1和0for (int i = 0; i 7; +i) tmp.add(0XAA);/ 前导符的第8个字节是约定好的0XABtmp.add(0XAB);return true;/* * 添加6个字节的目的地址,和添加6个字节的源地址 * * return 添加成功时返回true,否则false */public static boolean appen
20、dAddress() / 由于未显式要求目的地址,因此程序中将目的地址固定为FF:FF:FF:FF:FF:FFfor (int i = 0; i 6; +i) tmp.add(0XFF);/ 本机地址为74:E5:0B:7D:CE:3Atmp.add(0X74);tmp.add(0XE5);tmp.add(0X0B);tmp.add(0X7D);tmp.add(0XCE);tmp.add(0X3A);return true;/* * 添加2个字节的数据长度,接着添加数据字段,最后添加帧检验序列FCS * * param in * 输入文件 * param out * 输出流 * return
21、添加成功时返回true,否则false */public static boolean appendData(InputStream in, OutputStream out) int data = new intMAX_SIZE;/ 文件长度int size = 0;/ 当前字节int curByte = 0;try while (size 8);tmp.add(size);/ 然后添加数据字段for (int i = 0; datai != -1 & i size; +i) tmp.add(datai);/ 若数据长度不足,则补充填充字节if (size MIN_SIZE) for (in
22、t i = 0; i 24);out.write(R 16);out.write(R 8);out.write(R); catch (IOException e) e.printStackTrace();return false;return true;public static int nextR(int currentR, int curByte) int mask = 0X80;int curBit = 0;for (int i = 0; i = 1) / 计算当前位,0或者1curBit = (curByte & mask) = 0 ? 0X0 : 0X1;/ 首先将余数左移1位,并把
23、当前位添加到余数的最低位currentR = 1;currentR += curBit;/ 判断余数最高位是否为0/ 若为1,则将除数和余数进行异或操作,将结果保存为余数if (currentR & MASK_HIGH) != 0) currentR = currentR P;return currentR;/ 数据字段的最大长度public static final int MAX_SIZE = 1500;/ 数据字段的最小长度public static final int MIN_SIZE = 46;/ 填充字节public static final int FILL_BYTE = 0X0
24、0;/ 发送方与接收方约定好的除数Ppublic static final int P = 0XACEF1357;/ 用于判断余数最高位是否为1的掩码public static final int MASK_HIGH = 0X8000;private static List tmp = new LinkedList();7. 运行结果示例为了演示需要,首先新建一个文本文件,内容为“ChenJiaHui”(不含引号),如图7.1所示。用文本文件的一个好处是可以方便的检测输出文件(即帧的格式)是否正确。图7.1 输入文件接下来将源程序进行编译和运行。命令“javac”表示将源代码编译成类文件。命令
25、“java”表示执行一个类文件,其后跟着的“input1 input2”分别表示输入文件和输出文件,其中输入文件是所要包装的数据,即上文提到的文本文件,输出文件表示将帧封装好之后保存到哪个文件中,文件不存在时自动创建,存在时会覆盖。如图7.2所示。图7.2 编译运行由于实验只需要将数据封装成帧,并不要求检验,但如果不检验的话,又不知道是否封装正确,因此我另外写了一段程序,用以检验帧是否封装正确。在图7.3中可以看到,这个类的名字为“check”,它接收一个参数,用以指明所要检验的帧,这里是“input2”,即由framer程序产生的帧文件。由于input2是一个二进制文件,因此无法通过一般的编
26、辑器将其打开以查看其中的内容。图7.3 检测输出文件第一行有64位,前56位是前同步码,后8位是帧起始定界符。第二行是目的地址。因为没有显示指定目的地址,所以程序中将目的地址设为“FF:FF:FF:FF:FF:FF”。第三行是源地址。源地址为本机的MAC地址。第四行是长度,表示原输入文件的大小。由于输入文件input1只含有“ChenJiahui”10个字符,因此该文件的大小的确是10.接下来十行是源文件中的10个字节,为了避免输出过于冗余,所以只输出前10个字节,可以看到,每个字节均对应正确的字符,比如“1000011”表示字符“C”。最后四行是4个字节的FCS。以上输出中,有些字节不足8位,是因为均忽略了前导0。8. 心得体会帧是数据链路层最重要的概念。数据链路层属于计算机网络的低层。我们知道,两个主机之间的数据传输,总是在一段一段的链路上传送的,也就是说,在两个相邻结点之间(主机和路由器或两个路由器之间)传送数据是直接传送的(点对点)。这时就需要专门的链路层的协议。在两个相邻结点之间传送数据时,数据链路层将网络层交下来的IP数据报组装成帧(framing),在两个相邻结点间的链路上“透明”地传送帧(frame)中
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医学26年:呼吸疾病居家康复要点 查房课件
- 社区护理中的护理营养支持
- 安徽省宣城市2026届高三最后一模语文试题含解析
- 26年银发激越行为预防课件
- 四川省遂宁市射洪中学2025-2026学年高二下学期期中考试地理试卷
- 26年银发运动护理方案制定步骤课件
- 26年银发医保情况采集步骤课件
- 【2026】年技术经理(某世界500强集团)面试题试题集详解
- 26年老年应急事件案例汇编课件
- 26年老年头孢过敏案例分析课件
- 防疫道德讲堂课件
- 2025年全国设备监理师设备工程质量管理与检验真题及答案
- 不合格品处置制度
- 施工现场建筑垃圾处置方案(完整版)
- 【小升初真题】2025年河北省廊坊市三河市小升初数学试卷(含答案)
- 数控钣金加工生产线设计方案
- 甲状腺危象护理查房要点
- 镇静药物的使用及注意事项
- 排污许可审核方案投标文件(技术方案)
- 急救常识科普
- 用户运营考试题及答案
评论
0/150
提交评论