计算机网络课设模拟Ethernet帧的发送过程.docx
- 文档编号:8841771
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:14
- 大小:440.13KB
计算机网络课设模拟Ethernet帧的发送过程.docx
《计算机网络课设模拟Ethernet帧的发送过程.docx》由会员分享,可在线阅读,更多相关《计算机网络课设模拟Ethernet帧的发送过程.docx(14页珍藏版)》请在冰点文库上搜索。
计算机网络课设模拟Ethernet帧的发送过程
学号:
***
课程设计
课程名称
计算机网络
学院
计算机科学与技术学院
专业
软件工程专业
班级
***
姓名
***
指导教师
***
2014——2015学年第2学期
课程实践设计任务书
学生姓名:
***专业班级:
***
指导教师:
刘东飞工作单位:
计算机学院
题目二:
模拟Ethernet帧的发送过程
初始条件:
(1)学习相关知识
(2)C/C++/VC/VB/JAVA语言
(3)PC机一台
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
编写程序模拟Ethernet节点的数据发送流程。
具体要求:
1)用两个线程a和b来模拟Ethernet上的两台主机。
2)用一个双字类型变量Bus来模拟总线(将其初始化为“\0”,并且总线等于“\0”时表示总线空闲)。
3)两个子线程向总线发送自己的数据。
数据用该线程的线程号进行模拟,发送数据用线程号和Bus的“或”操作进行模拟(即Bus=Bus|ID,ID为该线程的线程号)。
4)每台主机需向总线上成功发送10次数据,如果其中某次数据发送失败,则该线程结束。
5)发送流程必须遵循CSMA/CD。
随即延迟算法中的冲突窗口取0.005。
在数据发送成功(即Bus==ID)后,报告“IDsendsuccess”,产生冲突(即Bus!
=ID)后报告“IDsendconllision”,发送失败(即冲突计数值为0)后报告“IDsendfailure”。
随着主机发送成功次数增加,报告其已发送成功的次数,如“主机A发送成功数=3”。
时间安排:
第一、二天:
查阅资料,学习算法
第三、四天:
编程调试
第五天:
书写报告
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
一、知识背景
1.网络协议
开放系统互连参考模型(OpenSystemInterconnect简称OSI)是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系统提供了一种功能结构的框架。
它从低到高分别是:
物理层、数据链路层、网络层、传输层、会话层、表示层和应用层
TCP/IP协议定义了一个在因特网上传输的包,称为IP数据报(IPDatagram)。
这是一个与硬件无关的虚拟包,由首部和数据两部分组成,其格式如图所示。
首部的前一部分是固定长度,共20字节,是所有IP数据报必须具有的。
在首部的固定部分的后面是一些可选字段,其长度是可变的。
首部中的源地址和目的地址都是IP协议地址。
2.以太网
以太网(Ethernet)指的是由Xerox公司创建并由Xerox、Intel和DEC公司联合开发的基带局域网规范,是当今现有局域网采用的最通用的通信协议标准。
以太网络使用CSMA/CD(载波监听多路访问及冲突检测)技术,并以10M/S的速率运行在多种类型的电缆上。
以太网与IEEE802.3系列标准相类似。
包括标准的以太网(10Mbit/s)、快速以太网(100Mbit/s)和10G(10Gbit/s)以太网。
它们都符合IEEE802.3
3.CSMA/CD协议
CSMA/CD(CarrierSenseMultipleAccesswithCollisionDetection)即带冲突检测的载波监听多路访问技术。
在传统的共享以太网中,所有的节点共享传输介质。
如何保证传输介质有序、高效地为许多节点提供传输服务,就是以太网的介质访问控制协议要解决的问题
CSMA/CD是一种争用型的介质访问控制协议。
它起源于美国夏威夷大学开发的ALOHA网所采用的争用型协议,并进行了改进,使之具有比ALOHA协议更高的介质利用率。
主要应用于现场总线Ethernet中。
另一个改进是,对于每一个站而言,一旦它检测到有冲突,它就放弃它当前的传送任务。
换句话说,如果两个站都检测到信道是空闲的,并且同时开始传送数据,则它们几乎立刻就会检测到有冲突发生。
它们不应该再继续传送它们的帧,因为这样只会产生垃圾而已;相反一旦检测到冲突之后,它们应该立即停止传送数据。
快速地终止被损坏的帧可以节省时间和带宽。
CSMA/CD控制方式的优点是:
原理比较简单,技术上易实现,网络中各工作站处于平等地位,不需集中控制,不提供优先级控制。
但在网络负载增大时,发送时间增长,发送效率急剧下降。
CSMA/CD应用在OSI的第二层数据链路层
它的工作原理是:
发送数据前先侦听信道是否空闲,若空闲,则立即发送数据。
若信道忙碌,则等待一段时间至信道中的信息传输结束后再发送数据;若在上一段信息发送结束后,同时有两个或两个以上的节点都提出发送请求,则判定为冲突。
若侦听到冲突,则立即停止发送数据,等待一段随机时间,再重新尝试。
其原理简单总结为:
先听后发,边发边听,冲突停发,随机延迟后重发
4.截断二进制指数退避算法
截断二指数指数退避算法并不复杂。
具体的退避算法如下:
1.确定基本退避时间,它就是争用期。
以太网把争用期定为51.2us。
对于10Mb/s以太网,在争用期内可发送512bit,即64字节。
也可以说争用期是512比特时间。
1比特时间就是发送1比特所需要的时间。
所以这种时间单位与数据率密切相关。
2.从离散的整数集合[0,1,…,]中随机取出一个数,记为r。
重传应推后的时间就是r倍的争用期。
上面的参数k按下面的公式计算:
k=Min[重传次数,10]
可见当重传次数不超过10时,参数k等于重传次数;但当重传次数超过10时,k就不在增大而一直等于10。
3.当重传达16次仍不能成功时(这表明同时打算发送的数据站太多,以致连续发生冲突),则丢弃该,并向高层报告。
例如,在第1次重传时,k=1,随机数r从整数{0,1}中选一个数。
因此重传推迟的时间是0或争用期,在这两个时间中随机选择一个。
若再发生碰撞,则重传时,k=2,随机数r就从整数{0,1,2,3}中选一个数。
因此重传推迟的时间是在0,2
4
和6
这4个时间中随机抽取一个。
同样,若在发生碰撞,则重传时k=3,随机数r就从整数{0,1,2,3,4,5,6,7}中选一个数。
以此类推。
若连续多次发生冲突,就表明可能有较多的站参与争用信道。
但使用退避算法可使重传需要推迟的平均时间随重传次数而增大(这也称为动态退避),因而减小发生碰撞的概率,有利于整个系统的稳定。
我们还注意到,适配器每发送一个新的帧,就要执行一次CMSA/CD算法。
适配器对过去发生过的碰撞并无记忆功能。
因此,当好几个适配器正在执行指数退避算法时,很可能有某一个适配器发送的新帧能够碰巧立即成功插入到信道中,得到了发送权。
我们可以看出,以太网在发送数据时,如果帧的前64字节之内没有发生冲突,那么后续的数据就不会发生冲突。
换句话说,如果发生冲突就立即中止发送,这时已经发送出去的数据一定小于64字节,因此以太网规定了最短有效的帧长为64字节,凡长度小于64字节的帧都是由于冲突而异常中止的无效帧。
收到了这种无效帧就应当立即丢弃。
二、程序设计分析
1.程序框架
2.环境介绍
操作系统Ubuntu14.04
G++4.4.3
3.数据结构
wchar_tBUS='\0';//双字类型变量Bus来模拟总线
constintconflictmax=16;
constintconflictwindow=0.005;
使用wchar_t来表示双字节。
而在C++中推荐使用const来代替define
4.子线程
std:
:
threadt1(call_thread,'A');
std:
:
threadt2(call_thread,'B');
t2.join();
t1.join();
C++11开始支持多线程编程,之前多线程编程都需要系统的支持,在不同的系统下创建线程需要不同的API如pthread_create(),Createthread(),beginthread()等,使用起来都比较复杂,C++11提供了新头文件
在主函数中使用thread的构造函数可以调用子线程并且传参数。
主线程调用thread对象t1、t2的join函数等待线程执行结束。
5.获得子线程ID
std:
:
stringstreamss;
ss< : this_thread: : get_id(); wchar_tPid=std: : stoull(ss.str()); 在C++11中的获取线程ID方式与pthread中的略微不同,我们使用的方法是在子线程中,使用std: : this_thread: : get_id()来获取子线程ID。 但此时获取到的ID是一个hashmap。 我们可以将其转化为字符串,再由字符串转化为ID值 6.发送数据 while(true) { if(BUS=='\0')//当总线为空的时候,可以发送数据 { BUS|=Pid; sleep (2); if(BUS==Pid) { printf("ID%ssendsuccess\n",ss.str().c_str()); printf("主机%c发送成功数%d\n",name,SuccessCounter); BUS=0; RepeatCounter=1; SuccessCounter++; if(SuccessCounter>10) return; } else { RepeatCounter++;//重发次数加一 if(RepeatCounter>=16) { printf("ID%ssendfailed\n",ss.str().c_str()); return; } else { //使用截断二进制退避算法 uniform_int_distribution default_random_enginee; printf("ID%ssendconllision\n",ss.str().c_str()); autosleeptime=randnum(e); sleep(sleeptime); continue; } } } } 在此函数中如果BuS=0的时候才能执行,否则一直循环。 使用位运算BUS|=Pid模拟线路上的电压变化。 使用uniform_int_distribution需要引入 而是用这种方式,出现的rand数是“真随机数”,而非C语言中的假随机数。 使用randnum(0,pow(2,min(RepeatCounter,10)-1))来实现截断二进制指数退避算法。 如果RepeatCounter>=16,则放弃发送此包。 注意,此处使用printf而非cout,因为cout不是线程安全的,易出现字符串打断现象。 而printf是线程安全的。 可以直接使用。 在编译这个程序的时候,需要使用 g++-std=c++0x–pthreadmain.cpp 其中std=c++0x是指使用的是C++11的标准。 –pthread是指需要引入pthread头文件。 然后在同文件夹下会生成a.out的程序。 使用./a.out即可运行程序。 三、实验截图 四、课设总结 这个课设的题目我非常喜欢,看似简单的题目实际包含了很多东西: 多线程、CSMA/CD协议、以及对截断二进制指数退避算法的理解。 在我做这个的时候,实际上之前很少使用多线程技术,尤其是C++11这种网上资料还比较少的多线程库。 在做这个的时候,我分别参考了《C++标准库-自学教程与参考手册》中对thread库的说明,以及《深入理解计算机系统》中并发编程部分对pthread的讲解。 感觉收获很大。 在做这个课设的时候,我专门把开发环境搬到了Linux上面去做。 之前一直很少使用Ubuntu,但这次却从搭建环境,编译程序各部分,对Linux有了一个初步的认识。 以后也会将开发环境越来越多的向Linux下迁移。 在学习理论知识的时候,虽然对这部分很熟悉。 但总感觉缺少了些什么,做了这个题目之后才有了更深的体会和理解。 明白了这些协议的重要性。 受益匪浅! 五、程序清单 #include #include #include #include #include #include #include usingnamespacestd; wchar_tBUS='\0';//双字类型变量Bus来模拟总线 constintconflictmax=16; constintconflictwindow=0.005; voidcall_thread(charname) { //autoPid=this_thread: : get_id(); intRepeatCounter=1;//记录目前是第几次发送 intSuccessCounter=1;//记录成功发送的个数,最大为1 //cout< std: : stringstreamss; ss< : this_thread: : get_id(); wchar_tPid=std: : stoull(ss.str()); while(true) { if(BUS=='\0')//当总线为空的时候,可以发送数据 { BUS|=Pid; sleep (2); if(BUS==Pid) { printf("ID%ssendsuccess\n",ss.str().c_str()); printf("主机%c发送成功数%d\n",name,SuccessCounter); BUS=0; RepeatCounter=1; SuccessCounter++; if(SuccessCounter>10) return; } else { RepeatCounter++;//重发次数加一 if(RepeatCounter>=16) { printf("ID%ssendfailed\n",ss.str().c_str()); return; } else { //使用截断二进制退避算法 uniform_int_distribution default_random_enginee; printf("ID%ssendconllision\n",ss.str().c_str()); autosleeptime=randnum(e); sleep(sleeptime); continue; } } } } } intmain() { std: : threadt1(call_thread,'A'); std: : threadt2(call_thread,'B'); t2.join(); t1.join(); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 模拟 Ethernet 发送 过程
![提示](https://static.bingdoc.com/images/bang_tan.gif)