计算机网络课程设计实验报告
-- CSMA/CD协议仿真
学院:计算机科学与通信工程
班级:通信0801
学号:
姓名:
指导老师:周莲英
年 月
一、CSMA/CD协议工作原理(查资料)及性能分析(指标与影响因素)
CSMA/CD是carrier sense multiple access/collision detected 的缩写,可译为“载波侦察听多路访问/冲突检测”,或“带有冲突检测的载波侦听多路访问”。所谓载波侦听(carrier sense),意思是网络上各个工作站在发送数据前都要总线上有没有数据传输。若干数据传输 (称总线为忙),则不发送数据;若无数据传输(称总线为空),立即发送准备好的数据。所谓多路访问(multiple access)意思是网络上所有工作站收发数据共同使用同一条总线,且发送数据是广播式的。所谓冲突(collision),意思是,若网上有两个或两个以上工作站同时发送数据,在总线上就会产生信号的混合,哪个工作站都同时发送数据,在总线上就会产生信号的混合,哪个工作站都辨别不出真正的数据是什么。这种情况称数据冲突又称碰撞。为了减少冲突发生后又的影响。工作站在发送数据过程中还要不停地检测自己发送的数据,有没有在传输过程中与其它工作站的数据发生冲突,这就是冲突检测(collision detected)。
CSMA/CD媒体访问控制方法的工作原理,可以概括如下:
先听后说,边听边说;
一旦冲突,立即停说;
等待时机,然后再说;
注:“听”,即监听、检测之意;“说”,即发送数据之意。
上面几句话意思是在发送数据前,先监听总线是否空闲。若总线忙,则不发送。若总线空闲,则把准备好的数据发送到总线上。在发送数据的过程中,工作站边发送检测总线,是否自己发送的数据有冲突。若无冲突则继续发送直到发完全部数据;若有冲突,则立即停止发送数据,但是要发送一个加强冲突的JAM信号,以便使网络上所有工作站都知道网上发生了冲突,然后,等待一个预定的随机时间,且在总线为空闲时,再重新发送未发完的数据。
CSMA/CD控制方式的优点是:原理比较简单,技术上易实现,网络中各工作站处于平等地位 ,不需集中控制,不提供优先级控制。但在网络负载增大时,发送时间增长,发送效率急剧下降。
性能指标:信道利用率、吞吐量、介质利用率
CSMACD的主要影响因素:传播时延、工作站数。
①CSMA/CD对站点个数不是很敏感,对实际的输入负载比较敏感。 ②CSMA/CD对传播时延a比较敏感。
③CSMA/CD冲突不可避免。
④CSMA/CD的介质利用率随a的上升下降较快。
⑤CSMA/CD适合通信量不大,交互频繁的场合
⑥对于CSMA/CD帧越长,吞吐量越太,要求帧具有最小长度,当有许多短消息时,带宽浪费严重。
⑦CSMA/CD在轻负载时提供最短延迟,但对重负载敏感。
主要参数: 时间片 512比特时间
帧问间隔 9.6微秒
尝试极限16
退避极限 10
人为干扰长 32比特
最大帧长 1518字节
最小帧长 512字节
地址字段长 48比特
二、CSMA/CD协议基本工作流程
1.以太帧的发送流程
1) 载波侦听过程。结点在发送一个帧前,必须侦听总线是否空闲。由于以
太的数据采用曼彻斯特编码方式,所以可以通过判断总线电平是否跳变来确定总线是否空闲。若总线空闲,就可启动发送,否则继续侦听。
2) 冲突检测。在数据发送过程中,可能会产生冲突。所以在发送数据的过
程中,也应该进行冲突检测,只要发现冲突就应该停止发送数据。
3) 随机延迟后重发。在检测到冲突、停止发送后,结点进行随机延迟后重
发。若重发16次后还没成功,则宣告发送失败,取消该帧的发送。随机延迟的计算方法一般采用截止二进制指数后退算法。该算法可表示为:T=2*R*a。其中T为结点重新发送需要的后退延迟时间,a为冲突窗口值,R为随机数,从0到2k-1中取值,k的取值为min(n,10),n为该帧已被发送的次数,下图为以太帧的发送流程。
1) 检查是否发生冲突,若发生冲突,则丢弃该帧,若没有冲突,进入下一
步。
2) 检查该帧的目的地址看是否可以接收该帧,若可以接收,则进入下一步。
3) 检查CRC校验和LLC数据长度。若都正确,接收该帧,否则丢弃。
三、分析、理解所给的仿真程序(对照流程图说明是如何仿真的、
每个sleep函数的作用)
#include "stdafx.h"
#include "csmacd.h"
#include <cstdio>
#include <iostream>
#include <cmath>
#include <windows.h>
#ifdef _DEBUG
#define new1 DEBUG_NEW
#undef THIS_FILE HIS_FILE[]=_FILE_;
#endif
//static char T
CWinThread *thread1,*thread2; //定义变量
DWORD ID1,ID2,Bus=0; //初始化共享
UINT aThread(LPVOID pParam); //线程a,代表主机a UINT bThread(LPVOID pParam); //线程b,代表主机b using namespace std;
int _tmain(int argc,TCHAR* argv[],TCHAR*envp[])
{
int nRetCode=0;
if(!AfxWinInit(::GetModuleHandle(NULL),NULL, ::GetCommandLine(),0)) {
cout<<_T("Fata1 Error:MFC initialization failed")<< endl;
nRetCode=1;
}
else
{
thread1=AfxBeginThread(aThread,NULL); //启动线程a
ID1=thread1->m_nThreadID; //获取线程ID号
thread2=AfxBeginThread(bThread,NULL); //启动线程b
ID2=thread2->m_nThreadID; //获取线程ID号
getchar();
}
return nRetCode;
}
UINT aThread(LPVOID pParam) //线程a(主机a) {
int i=0; //发送成功次数
int CollisionCounter=16; //冲突计数器初始值为16 double Collisionwindow=0.05; //冲突窗口值取0.05
int randNum=rand()%3; //随机数 可用Srand函数改变随机函数的种子,改善随机性
Loop:if (Bus==0) //总线空闲
{
Bus=Bus|ID1; //模拟发包
Sleep(12); // 单位是毫秒,
分析:本实验模拟模a发送时延为12ms试验时可以更改时延观察不同发送
时延对碰撞的影响。
if(Bus==ID1) //无冲突, {
printf("%d Send Success\n\n",ID1); //发送成功
Bus=0; //内存清零
CollisionCounter=16; //复原冲如计数器
Sleep(rand()%10);
分析: 本次试验选用随机的帧长度相当于重新配置,两个线程同时进行监听。
i++;
printf("主机a发送成功次数=%d\n\n",i);
if(i<10)
goto Loop; //发送次数不够10次,开始下一次发送
}
else
{
printf("%d Send Collision\n\n",ID1); //发生冲突
Bus=0;
CollisionCounter--; //冲突计数器减1
if(CollisionCounter>0)
{
Sleep(randNum*(int)pow(2.0,(CollisionCounter>10)?10:CollisionCounter)*Collisionwindow); 分析:使用截至二进制退避算法,在发生碰撞时,等待随机时间,进行监听和发送。
goto Loop; //下一次尝试发送
}
else
printf("%ld Send Failure\n\n",ID1);//重发次数超过16次,宣布发送失败
}
}
else //总线忙
goto Loop; //继续载波侦听
return 0;
}
UINT bThread(LPVOID pParam)//线程b
{
int j=0; //发送成功次数
int CollisionCounter=16;//冲突计数器初始值为16
double CollisionWindow=0.05;//为争用期(51.2us),以时间为单位的冲突窗口 int randNum=rand()%3;//随机数
Loop: if(Bus==0)//总线空闲
{
Sleep(2); // 可用随机函数模拟其他用户随机接入。
分析: b检测到总线空闲时,延时2ms进行发送。
Bus=Bus|ID2;//模拟发包
Sleep(3); 发送时延为3ms
如果将b发现空闲时延为0发送,而且发送时延相同,即a,b线程完全相同,会出现两线程交替发送,不会出现碰撞,结果见下面分析。
if(Bus==ID2)//无冲突
{
printf("%d Send Success\n\n",ID2); //发送成功
Bus=0; //总线清零
CollisionCounter=16; //复原冲突计数器
Sleep(rand()%10);
j++;
printf("主机b发送成功次数=%d\n\n",j);
if(j!=10) //不够10次开始下一次发送
goto Loop ;
}
else
{
printf("%d Send Collision\n\n",ID2);
Bus=0;
CollisionCounter--; //冲突计数器减1
if(CollisionCounter>0) //随机延迟重发,延迟算法用截止二进制指数后退算法
{
Sleep(randNum*(int)pow(2.0,(CollisionCounter>10)?10:CollisionCounter)*CollisionWindow);
等待随机时间截止二进制指数后退算法
goto Loop;
}
else
{
printf("%d Send Failure\n\n",ID2);
}
}
}
else //总线忙
goto Loop; //继续装载波侦听
return 0;
}
四、运行结果分析(改变sleep函数参数大小、抓图说明结果)
源程序运行结果:
由图可知,线程a和b发送数据时都有碰撞产生,经过二进制退避算法,随着时间的增加,碰撞的次数逐渐减少,后面没有冲突。
改变sleep()函数参量的值,理想情况下,传输时延为零时(即sleep(0)),结果如下图所示:
由图可知,没有传输时延情况下,还是有发送碰撞产生,主要原因是线程b程序中的第一个sleep()语句需要运行时间,后面数据全部发送成功还是因为运行了退避二进制算法,当去掉线程b的第一个sleep()时,即两个线程相等时,运行结果如下:
由上图可知,数据发送过程中没有冲突。
源程序的帧间隙是程序随即产生的(Sleep(rand()%10)),现将间隙时间改为0,观察运行结果如下图所示:
当两个线程相同时,帧间隙为0的情况下,主机a连续发送三次数据后,主机b抢到信道,连续发送十次数据,发送完毕,接着a发送剩余的七次数据。这样不能体现发送的公平性。所以应该设置帧间隙。
下面改变帧间隙,a和b帧间隙相同时(同时为5),运行结果如下:
由图可知,两个线程相同,且帧间隙相同的情况下,发送数据没有碰撞,且a,b交替发送数据,一直到发送结束。同样道理,当两个线程不同时(b的反应时间为2 ms),依然会发生碰撞。运行二进制退避算法后,a,b继续交替发送数据。
当两个线程相同,帧间隙不同时(a的帧间隙为2 ms ,b的帧间隙为20 ms 时),结果如图
通过反复更改a,b帧间隙的值,当b帧间隙为a的帧间隙10倍时,出现上图结果,没有出现轮流发送,也没有出现碰撞(两线程相同)。当两线程帧间隙相差较小时,上述结果体现不明显。
五、协议的改进(如增加用户数后采用某种监听和发送策略) 对二进制退避算法进行改进,改进后的算法如下:
1非坚持的CSMA:线路忙,等待一段时间,再侦听;不忙时,立即发送;减少○
冲突,信道利用率降低:
21坚持的CSMA:线路忙,继续侦听;不忙时,立即发送;提高信道利用率,增○
大冲突:
3p坚持的CSMA:线路忙,继续侦听;不忙时,根据p概率进行发送,另外的○
1-p概率为继续侦听(p是一个指定概率值);有效平衡,但复杂: 六:心得体会
每次做课程设计都是一个学习和总结的过程,在这次课程设计中发现对于书本上的知识掌握的还是不牢固,CSMA/CD协议老师在上课时讲的很详细,在课程设计中感觉自己只知道个大概。尽管老师已经该我们程序代码,把困难程度已经降到最低程度了,但是在做的过程中还是出现了很多问题,比如a,b在发送过程中改变sleep()的值发送是否是交替进行的,是否会发生碰撞以及操作平台的调试等等问题。最后在老师和同学的帮助下都得以解决,在此真心感谢老师和同学的无私帮助。
这次课程设计不仅重新检测了一下自己对课程的掌握理解程度,而且培养了自己如何利用身边的资源解决自己的问题的能力,提升了和别人在学术方面的交流和沟通能力。
课程设计是我们专业课程只是综合应用的实践训练,是我们迈向社会、从事职业工作前一个必不可少的过程。“千里之行,始于足下”,通过课程设计,我深深的体会到这句千古名言的真正含义。今天认真的进行课程设计,踏实地迈开这一步,就是为明天能够稳健的在社会大潮中奔跑打下基础。
由于本人目前能力有限,难免会出现这样那样的错误,还望老师批评指正。
海南大学信息科学技术学院
《计算机网络》课程设计报告
班 级:
组 员:姓名(学号)
指导老师: 黎才茂 (副教授)
完成日期: 20xx年 12月 30日
【摘要】本设计采用MFC6.0作为开发工具,???
【关键词】TCP, ???
1、引言
TCP (Transmission Control Protocol)是传输控制协议的缩写。??? ???..
FTP(File Transfer Protocol)是文件传输协议的缩写???.
???.
2、TCP聊天程序的设计
本设计实现了基于TCP协议的客户端和服务器端的聊天程序的设计。
2.1、TCP服务器端设计
主要用于对数据的转发,其过程包括:???
2.1.1、服务器端主窗体设计
???.接下来设计主窗体如图2.1所示。
图2.1 服务器端主窗体
2.1.2、服务器套接字类设计
设计ServerSocket类并扩展MFC中的CSocket类,??.。
OnAccept()函数原形如下:
???
2.1.3、客户机套接字类设计
设计ClientSocket类并扩展MFC中的CSocket类,??..
1
2.1.4、对话框类设计
首先,在OnInitDialog()函数中进行初始化,初始化的目的是实例化一个ServerSocket类的对象,并创建套接字,以及侦听。
??..
2.2、TCP客户机端设计
主要用于对服务器端进行连接,并发送数据,及接收服务器端发送过来的数据。
2.2.1、客户机端主窗体设计
新创建一个基于Windows Sockets的MFC AppWizard(exe)项目,接下来设计主窗体如图2.2所示。
图2.2 客户机端主窗体
2.2.2、套接字类设计
2.2.3、应用程序类初始化
2.2.4、对话框类设计
2.3、运行结果
“TCP客户机端” 设计自评成绩:
2
3发现网络中的活动主机
实现了基于ICMP协议的在线主机扫描程序的设计。
?????..
3.1 ICMP头的设计
代码如下:
3.2 Ping类的设计
3.3 对话框类的设计
主要是“开始”按钮的设计,代码如下:
3.4 运行结果
“发现网络中的活动主机”设计自评成绩:
3
4简单FTP功能模拟
本设计实现了FTP服务器端和客户端程序的设计,并完成了上传和下载文件的设计。
4.1、FTP服务器端设计
主要用于开启FTP服务,以及处理FTP有关的命令。
4.1.1、服务器端主窗体设计
新创建一个MFC AppWizard(exe)项目,接下来设计主窗体如图4.1所示。
图4.1 服务器端主窗体
4.1.2、对话框类的设计
主要是“开始服务”按钮的设计:
4.1.2、CServer类的设计
CServer类主要实现FTP服务器的各种功能。
程序代码如下:
4.2、FTP客户机端设计
主要用于对服务器端进行连接,并上传/下载文件。
4.2.1、客户机端主窗体设计
新创建一个基于Windows Sockets的MFC AppWizard(exe)项目,接下来设计主窗体如图4.2所示。
图4.2 客户机端主窗体
4.2.2、CFTPCommandProcessor类的设计
该类主要处理向服务器发送处理命令的信息以及上传和下载文件的处理。
4
主要函数列表:
程序代码如下:
4.2.3、对话框类的设计
“连接”按钮的设计:
4.3、运行结果
运行服务器,并设置相应参数:
“简单FTP功能模拟”设计自评成绩:
5
5总结
课程设计的过程是艰辛的,但是收获却是很大的。这次课程设计我们小组成员主要???????。
首先,?????. 当然,??????..
6参考文献
[1] 曹衍龙等.《VISUAL C++网络通信编程实用案例精选(第二版)》.人民邮电出版社.2006 [2] 5 [3] [4] [5]
-------------------------------------------------------------------------------
成绩评定老师: 年 月 日
6
计算机网络课程设计报告一.课程设计的题目、目的及要求.......................................…
长治学院课程设计报告课名称:计算机网络设计题目:一个简单企业网的设计与实现系别:计算机系专业:计算机科学与技术(1301班)组别:…
课程设计课程名称计算机网络课程设计题目名称文件传输协议的简单设计与实现学生学院专业班级学号学生姓名指导教师20xx年1月5日设计摘…
点对点数据交换P2P目录需求分析511课程设计目的512课程设计要求513选题与操作流程514开发环境与开发平台5总体设计521总…
淮海工学院计算机工程学院课程设计报告设计名称:计算机网络课程设计姓名:学号:专业班级:系(院):计算机工程学院设计时间:20XX.…
点对点数据交换P2P目录需求分析511课程设计目的512课程设计要求513选题与操作流程514开发环境与开发平台5总体设计521总…
xxxxxNormalUniversityofScienceampTechnology一课程设计的目的及要求211设计目标212设…
课程设计报告专业班级姓名学号一实践内容1掌握RJ45网线接头的制作方法1双绞线的性能指标分类2RJ45接头线序各线的位置作用3制作…
CENTRALSOUTHUNIVERSITY网络工程实验报告学生姓名指导教师学院信息科学与工程学院专业班级计科0904班学号090…
ZHOUUNIV实验报告课程名称计算机网络学生姓名学号专业班级学院系信息学院指导教师RSECHANGITY实验四某大学校园网规划与…
计算机网络实验报告学院专业班级学号一实验名称PacketTracer入门二实验目的1认识PacketTracer2二学习使用Pac…