封装Ethernet帧
沈阳理工大学课程设计专用纸 Noi
目 录
1 课程设计目的....................................................................1 2 课程设计要求 .................................................................. 1 3 相关知识 .......................................................................... 1 4 课程设计分析 ......................................................... 1——5
5 程序代码 ................................................................. 5——7
6 运行结果与分析...................................................... 7——8
7 参考文献 .......................................................................... 8
沈阳理工大学
沈阳理工大学课程设计专用纸 No1 1 课程设计目的
帧是在数据链路层中进行数据传输的基本单位。熟悉帧结构对于理解网络协议的概念?网络层次 结构与协议执行过程具有重要意义。本课程设计的主要目的是通过封装Ethernet帧,了解Ethernet帧中各字段的含义及用途。
2 课程设计要求
根据后面介绍的IEEE802.3帧结构,编写程序将指定数据封装为Ethernet帧。
(1) 以命令形式运行:
Encapframe input_file output_file
其中,Encapframe为程序名,input_file为输入数据文件,output_file为输出数据文件。
(2) 输入内容:Ethernet帧的各字段内容。
3 相关知识
1 . 帧:在发送数据的前后分别特殊的字符使它们成为帧
帧有两种结构:EthernetV2.0
规范
编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载
和IEEE802.3
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
中的Ethernet帧。我们按802.3标准进行讨论。
a. 前导码与帧前序列:前导码由56位的10序列组成,帧前定界符可以视为前导码的延续。1B的帧前定界符为10101011。
b. 目的地址和源地址:分别表示帧接受结点地址与发送结点的硬件地址。分别为6B字段长度。目的地址第一位为0表示单播地址,为1表示多播地址,为全1表示为广播地址。
c. 长度字段:帧数据最小长度为46B,最大长度为1500B
d. 数据字段::帧数据字段最小长度为46B,若帧的LLC数据少于46B,则应将数据字段填充至46B。
e. 校验字段:帧校验字段采用32位CRC校验。校验范围包括目的地址字段,源地址字段,长度字段,LLC数字字段。
2 CRC校验:
a. CRC编码的代数原理:在代数编码理论中,将一个码组表示为一个多项式,码组中的各码元作为多项式的系数。
b. CRC的硬件电路实现。
c. CRC的基本实现:CRC在发送端编码和接收端校验时,都可以用事先约定的多项式来得到。
d. 循环冗余校验码的特点:检错能力很强。
4 课程设计分析
1填充帧头部字段
沈阳理工大学
沈阳理工大学课程设计专用纸 No2
要完成一次帧封装的过程,首先要完成的就是帧头部的装入,这个过程很简单,只要将前导码、定界符、目的地址、源地址、长度字段的相应数值按顺序写入就可以了。其中,长度字段的值即为要发送的数据的实际长度。我们可以通过以下两种方式获得长度字段的值。
a 方法一
While(! In.eof())
{ In.get(a);
buf[j]=a;
j++;
}
b 方法二
infile.open(argv[1],ios::binary);
Infile.seekg(0,ios::end);
short length=(short)infile.tellg();
file.put(char(length/256));
file.put(char(length%256)); 上面程序的最后二行是把读到的数据长度值按逆序填到长度字段。这就涉及到网络字节序的问题。
*计算机有两种字节序:
低位字节优先序:低位字节存储在起始地址。
高位字节优先序:高位字节存储在起始地址。
Internet上的数据以高位字节优先顺序在网上传播,所以对于在机器内部以低位字节优先方式存储数据来说,在Internet上传输数据时就需要转换,否则就会出现数据不一致。
*几个字节顺序转换函数:
Htonl():把32位值从主机字节序转换成网络字节序。
Htonl():把16位值从主机字节序转换成网络字节序。
ntohl():把32位值从网络字节序转换成主机字节序。
ntohl():把16位值从网络字节序转换成主机字节序。
2 填充数据字段
要注意数据字段长度。802.3标准规定帧数据字段最小长度46B,最大长度1500B,若数据不足46B,则用0来填充;若超过1500B,则将超过部分封装到下个帧进行发送。
沈阳理工大学
沈阳理工大学课程设计专用纸 No3
Ethernet帧最小长度64B,最大长度1518B。
填充代码如下:
if(len==1500)
{ ........
Len=0;
}
如果数据长度小于46
if( len<46)
{
for{i=len;i<46;i++)
Fr.data[i]=0x00;
}
data_len=len;
3 CRC校验
帧封装的最后一步就是对数据进行校验,并将校验结果记入帧校验字段,而CRC编码实际上是一个循环位移的模2运算。
a. CRC编码的代数原理:在代数编码理论中,将一个码组表示为一个多项式,码组中的各码元作为多项式的系数。
b. CRC的硬件电路实现。
c. CRC的基本实现:CRC在发送端编码和接收端校验时,都可以用事先约定的多项式来得到。
CRC编码实际上是一个循环的模二运算,假设有一个9位存储器,其流程描述如下:
while(数据未处理完)
begin
if(crc首位是1)
crc=crc XOR 10000011
一个8位寄存器,伪代码如下:
while(数据未处理完)
begin if(crc首位是1)
crc左移一位
crc=crc XOR 10000011
else
crc左移一位
if(从input中读入的数据为1)
将crc 0位置1
End
CRC的工作原理:CRC在发送端编码和接收端校验时,都可以利用事先约定的生成多项式G(x)来得到,K位要发送的信息可对应于一个(k-1)次多项式K(x),r位冗余位对应于一个(r-1)次多项式R(x),由r位冗余位组成的n=k+r位码字对应于一个(n-1)次多项式T(x)=Xr*K(x)+R(x).
循环冗余码校验特点:
CRC校验码得检错能力强,不仅能检验出离散错误,还能检验出突发错误。
沈阳理工大学
沈阳理工大学课程设计专用纸 No4
开始 4.程序流程图
以二进制、可读写方式添加文件
写入前导码和帧前定界
符
获取当前文件指针
写入当前目的地址和源地址
打开输入数据文件,获得文件长度length,并将其写入输
并将长度值写入输出文件
将输入数据文件的内容填入数据字段 入文件
数据长度大于等于
N 46B
填充(46-length)字节0
Y
关闭输入数据文件
添加1字节0,用于CRC计算
计算CRC值,填充校验字段
封装完成,关闭输入程序
结束
沈阳理工大学
沈阳理工大学课程设计专用纸 No5
*相关知识
除了以上的方法之外,还有其他一些算法可以完成CRC校验。例如:多项式除法可以用除法电路来实现。除法电路的主体由一组移位寄存器和模2加法器组成。以CRC-ITU为例,它由16级移位寄存器和3个加法寄存器组成。编码、解码前将个寄存器初始化为“1”,信息位按照时钟周期依次移入。当信息位全部输入后,从寄存器组输出CRC结果。
1. 比特型算法
上面的CRC-ITU除法可以用软件来模拟。定义一个寄存器组,初始化全为1。
2. 字节型算法
比特型算法逐位进行运算,效率比较低,不适用高速通信的场合。数字通信系统一般是对一帧数进行CRC校验,而字节是帧的基本单位。通常用的是一种按字节查表的快速算法。该算法基于这样一个事实:计算本字节后的CRC码,等于上一字节CRC右移8位和本字节之和再与上一字节余式CRC码的低8位左移8位相加后所求得CRC码。如果我们把8位二进制序列数的CRC全部计算出来,放在一个表里,那么编码时只要从表中查找对应的值进行处理即可。
CRC-ITU算法如下:
1. 寄存器组初始化全为1(0XFFFF)。
2. 寄存器组向右移动一个字节。
3. 刚移出的那个字节进行异或运算,得出一个指向值表的引索。
4. 将引索所指的值表与寄存器组做异或运算。
5. 数据指针加1,如果数据没有完全处理完,则重复步骤2。
6. 寄存器组取反,得到CRC,附加在数据之后。
而CRC-ITU的验证算法同算法的前5步,而第六步是判断寄存器组的值是否等于“Magic Value”
(0XF0B8),若相同则通过,否则失败。
5.运行代码
#include
#include
void main(int argc,char* argv[]) {
//检查输入命令格式
if(argc!=3)
{
cout<<"Please input command: Encapframe input_file output_file"<0;i>>=1)
{
//当前余数最高位为1,需要做除法运算
if(crc&0x80)
{
crc<<=1;
//将输入数据相应位的值递补到余数末位
if(temp&i)
crc^=0x01;
crc^=0x07;
}
else
{
crc<<=1;
if(temp&i)
crc^=0x01;
}
}
}
//写入crc码
file.seekp(pCrc,ios::beg);
file.put(crc);
//输出写入文件的内容
file.seekg(0,ios::beg);
cout<<"Content of ethernet frame:"<
本文档为【封装Ethernet帧】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。