计算机网络课程设计模拟以太网帧封装.docx
- 文档编号:11896631
- 上传时间:2023-04-08
- 格式:DOCX
- 页数:7
- 大小:67.21KB
计算机网络课程设计模拟以太网帧封装.docx
《计算机网络课程设计模拟以太网帧封装.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计模拟以太网帧封装.docx(7页珍藏版)》请在冰豆网上搜索。
计算机网络课程设计模拟以太网帧封装
计算机网络期中考试试题
—模拟虚拟机中局域网的传输过程,完成简单图形界面。
学 生:
韩成周
学 号:
2014117138
完成时间:
2016年12月
目 录
1.设计任务和要求
1.1课程设计任务
1.2课程设计要求
2.设计原理
2.1802.3标准帧结构
2.2CRC的基本实现
3.设计思路
4.程序源码
5.运行结果
1.设计任务和要求
1.1课程设计任务
虚拟局域网(VLAN),是一种通过将局域网内的设备逻辑地而不是物理地划分成一个个网段从而实现虚拟工作组的新兴技术,在功能和操作上和传统的LAN基本相同。
虚拟局域网技术是目前网络界最热门的技术之一,也是交换网络中最重要的技术之一,它的出现是和局域网的交换技术的发展分不开的。
而我们的任务就是模拟虚拟局域网中帧的传输过程。
1.2设计要求
1.初始化交换机的转发表;
2.模拟虚拟局域网同一个局域网或者不同局域网之间帧的传输过程
2.设计原理
2.1802.3标准帧结构
虚拟局域网帧格式:
前序(P)
目的地址(SD)
源地址(SA)
长度
数据
FCS
8B
6B
6B
2B
46~1500B
4B
1.前序字段
前序字段由7个字节的交替出现的1和0组成,设置该字段的目的是指示帧的开始并便于网络中的所有接收器均能与到达帧同步。
2.帧起始定界符字段
它可以被看作前序字段的延续。
实际上,该字段的组成方式继续使用前序字段中的格式,这个一个字节的字段的前6个比特位置由交替出现的1和0构成。
该字段的最后两个比特位置是11,这两位中断了同步模式并提醒接收后面跟随的是帧数据。
3.目的地址字段
目的地址字段确定帧的接收者。
6个字节的源地址和目的地址字段是局域网中的所有工作站必须使用同样的地址结构。
4.源地址字段
源地址字段标识发送帧的工作站。
和目前地址字段类似,源地址字段的长度六个字节。
5.长度字段
用于IEEE802.3的两字节长度字段定义了数据字段包含的字节数。
从前序到FCS字段的帧长度最小必须是64字节。
基于最小帧长为64字节和使用六字节地址字段的要求,意味着每个数据字段的最小长度为46字节。
如果传输数据少于46个字节,应将数据字段填充至46字节。
不过,填充字符的个数不包括在长度字段值中,数据字段的最大长度为1500字节。
6.数据字段
数据字段的最小长度必须为46字节以保证帧长至少为64字节,这意味着传输一字节信息也必须使用46字节的数据字段:
如果填入该该字段的信息少于46字节,该字段的其余部分也必须进行填充零。
数据字段的最大长度为1500字节。
7.校验序列字段
将计算出的CRC填入32位的FCS校验字段。
帧校验序列字段提供了一种错误检测机制,包括了地址字段、长度字段和数据字段的循环冗余校验(CRC)码。
2.2CRC的基本实现
利用CRC进行检错的过程可简单描述如下:
在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督码(CRC码),附在原始信息的后边,构成一个新的二进制码序列(共k+r位),然后发送出去。
在接收端,根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。
这个规则在差错控制理论中称为“生成多项式”。
3.设计思路
4.程序源代码(主要代码)
#include"cmath" //
#include"afxwin.h //
#include
#include
CWinThread*thread1,*thread2; //定义2个线程对象,分别代表a,b
DWORDID1,ID2,Bus=0; //2线程ID,总线标志
UINTaThread(LPVOIDpParam); //线程a,代表主机a
UINTbThread(LPVOIDpParam); //线程b,代表主机b
usingnamespacestd;
ntmain(intargc,char*argv[],char*envp[])
{
intnRetCode=0;
thread1=:
:
AfxBeginThread(aThread,NULL); //启动线程a
ID1=thread1->m_nThreadID;
thread2=:
:
AfxBeginThread(bThread,NULL); //启动线程b
ID2=thread2->m_nThreadID;
getch(); //主线程等待,按任意键退出程序
returnnRetCode;
}
UINTaThread(LPVOIDpParam)
{
inti=0; //发送成功次数
intCollisionCounter=2; //冲突计数器初始值为16
doubleCollisionWindow=0.000001; //冲突窗口值取值0.005
intrandNum=rand()%3; //随机数
while
(1)
if(Bus==0) //总线空闲
{
Bus=Bus|ID1; //模拟发送包
Sleep(12);
if(Bus==ID1) //无冲突
{
printf("%dSendSuccess\n\n",ID1); //发送成功
Bus=0; //内存清零
CollisionCounter=2; //复原冲突计数器
Sleep(rand()%10); //随即延时
i++;
printf("主机a发送成功次数=%d\n\n",i);
if(i>=10)
break; //发送次数不够10次,开始下一次发送
}
else
{
printf("%dSendCollision\n\n",ID1); //发生冲突
CollisionCounter--; //冲突次数加1
Bus=0;//冲突加强停止发送数据等待下面延时
if(CollisionCounter>0)
{//随即延迟重发,延迟算法用截断的二进制指数退避算法
Sleep(randNum*(int)pow(2,(CollisionCounter>10)?
10:
CollisionCounter)*CollisionWindow);
continue; //下一次尝试发送
}
else
printf("%dSendFailure\n\n",ID1);
}
}
return0;
}
UINTbThread(LPVOIDpParam)
{
inti=0; //发送成功次数
intCollisionCounter=16; //冲突计数器初始值为16
doubleCollisionWindow=0.005; //冲突窗口值取值0.005
intrandNum=rand()%3; //随机数
while
(1)
if(Bus==0) //总线空闲
{
Bus=Bus|ID2; //模拟发送包
Sleep(12);
if(Bus==ID2) //无冲突
{Sleep(rand()%10);
printf("%dSendSuccess\n\n",ID2); //发送成功
Bus=0; //内存清零
CollisionCounter=16; //复原冲突计数器
Sleep(rand()%10); //随即延时
i++;
printf("主机b发送成功次数=%d\n\n",i);
if(i>=10)
break; //发送次数不够10次,开始下一次发送
}
else
{
printf("%dSendCollision\n\n",ID2); //发生冲突
CollisionCounter--; //冲突次数加1
Bus=0; //冲突加强停止发送数据等待下面延时
if(CollisionCounter>0)
{//随即延迟重发,延迟算法用截断的二进制指数退避算法
Sleep(randNum*(int)pow(2,(CollisionCounter>10)?
10:
CollisionCounter)*CollisionWindow);
continue; //下一次尝试发送
}
else
{ printf("%dSendFailure\n\n",ID2);}
}
}
return0;
}
5.运行结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 课程设计 模拟 以太网 封装