- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
封装Ethernet帧
目 录
1 课程设计目的....................................................................1
2 课程设计要求 1
3 相关知识 1
4 课程设计分析 1——5
5 程序代码 5——7
6 运行结果与分析 7——8
7 参考文献 8
1 课程设计目的
帧是在数据链路层中进行数据传输的基本单位。熟悉帧结构对于理解网络协议的概念·网络层次 结构与协议执行过程具有重要意义。本课程设计的主要目的是通过封装Ethernet帧,了解Ethernet帧中各字段的含义及用途。
2 课程设计要求
根据后面介绍的IEEE802.3帧结构,编写程序将指定数据封装为Ethernet帧。
(1) 以命令形式运行:
Encapframe input_file output_file
其中,Encapframe为程序名,input_file为输入数据文件,output_file为输出数据文件。
(2) 输入内容:Ethernet帧的各字段内容。
相关知识
1 . 帧:在发送数据的前后分别特殊的字符使它们成为帧
帧有两种结构:EthernetV2.0规范和IEEE802.3标准中的Ethernet帧。我们按802.3标准进行讨论。
a. 前导码与帧前序列:前导码由56位的10序列组成,帧前定界符可以视为前导码的延续。1B的帧前定界符
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填充帧头部字段
要完成一次帧封装的过程,首先要完成的就是帧头部的装入,这个过程很简单,只要将前导码、定界符、目的地址、源地址、长度字段的相应数值按顺序写入就可以了。其中,长度字段的值即为要发送的数据的实际长度。我们可以通过以下两种方式获得长度字段的值。
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,则将超过部分封装到下个帧进行发送。
Ethernet帧最小长度64B,最大长度1518B。
填充代码如下:
if(len==1500)
{ ........
Len=0;
}
如果数据长度小于46
if( len46)
{
for{i=len;i46;i++)
Fr.data[i]=0x00;
}
data_len=len;
文档评论(0)