您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 交换机MAC地址表的形成过程动态演示
交换机MAC地址表的形成过程动态演示今天不经意间从电脑里发现了自己大学时的一课程设计,还是自己在学校时那会比较勤奋,敢于想象,敢天动脑筋还是贴到这里留念一下一、课程设计的目的《路由与交换技术》这门课程的内容包含了计算机网络的关键技术,要学好这门课程,与实践是不能分开的。路由器和交换机已广泛应用于计算机局域网及互联网中,掌握路由器和交换机的使用方法和配置知识及相关内容,对于学好《路由与交换技术》这门课程有很大的帮助。希望同学们能够在一周的时间里,切实按照课程设计的要求,结合所学的理论知识和平时积累的实践能力,积极查找相关资料,完成好这次课程设计,熟悉所选项目的内容,提高网络应用能力,丰富自己的网络实践经历,为将来的实际工作积累一些经验。二、设计内容1、设计题目:交换机MAC地址表的形成过程动态演示2、原理知识:如果网络中的计算机是通过集线器连接的,那么这种网络就被称为共享式以太网。使用集线器互连的网络环境很容易发生数据的碰撞,因为不管发送数据还是接收数据都使用同一个数据通道,所以,主机在发送数据的同时必须使用接收线对检测是否发生了碰撞,这种机制使得主机只能以半双工的模式工作。另一方面,集线器是物理层设备,通过对信号的中继放大,延长了网线的通达距离,扩展了网络规模。网络规模的扩大意味着碰撞域的扩大,进一步地降低了网络的性能。共享式局域网的特性严重制约着网络性能的提高,逐渐地被使用交换机构成的交换式局域网所取代:(1)交换机取代集线器解决了碰撞问题。交换机是工作在数据链路层的设备(所以也称第2层交换机),它可以识别数据帧中封装的MAC地址,并根据地址信息把数据交换到特定的端口,而不是像集线器工作时那样,把从一个端口接收到的数据复制到所有其他端口。这样的工作方式使交换机的不同端口之间不会产生碰撞,也就是说交换机可以分割碰撞域。如果一个端口只连接一台主机的话,就等于消除了碰撞。(2)交换机解决了集线器与和它相连的主机不能全双工通信的问题。交换机使用独立的收、发通道为每个接口相连的主机转发数据,这样主机可以全双工地工作。(3)交换机可以为任意两个交换数据的端口建立一条独立的数据通道进行交换数据,大大提高了数据交换的效率。交换机具有这些特性是由它的工作原理决定的。交换机根据数据帧中封装的目的地MAC地址做出转发数据的决定。交换机在转发数据前必须知道它的每一个端口所连接的主机的MAC地址,构建出一个MAC地址表,以便作出正确的转发决定。当交换机从某个端口收到数据帧后,读取数据帧中封装的目的地MAC地址信息,然后查阅事先构建的MAC地址表,找出和目的地址相对应的端口,从该接口把数据转发出去,其他接口不受影响。交换机在地址表中找不到目的地址和端口的相对应记录时,则会把数据向除了数据来源端口外的其他所有端口转发,所以广播数据会被交换机转发到其所有端口,使得和交换机相连的设备处于同一个广播域内。下面举例说明交换机建立地址表的过程。当交换机启动时,初始的MAC地址表是空的。此时,主机A向主机C发送一个数据帧(每一个数据帧中都包含有源MAC地址和目的MAC地址),当该数据帧从E0端口进入交换机后,交换机通过检查数据帧中的源MAC地址字段,将该字段的值(主机A的MAC地址)放入MAC地址表中,并把它与E0端口对应起来,表示E0端口所连接的主机是A。在MAC地址表中没有关于目的地MAC地址(主机C的MAC地址)的条目,因此交换机将此帧向除了E0端口以外的所有端口转发。从而保证工作站C能收到该帧。其它接口的传送过程相同。三、设计方法1.拓扑图2.设计思想Computer发Message{frommac,data,tomac},Switcher从Computer所在的port(1~5)接收Message,对Message拆封获得Message的来源mac和目标mac,重新计算机MACTable(驻留在内存),并存入文件Table.txt,而又MACTable.txt是记录MAC表每次变化的情况,相当于Table的日志文件。(Table.txt和MACTable.txt在MAC目录下)然后从类存中的MACTable中查找与目标mac对应的port,如果找到便直接向该port转发Message,否则向每一个port广播Message,系统中的每台Computer一直在接收系统消息,如果是系统中的消息是发给自己的,就收下并存入自己的文件com(A~D).txt,否则丢弃。每一台Computer有自己的存储收到消息的文件:comA.txtcomb.txtcomC.txtcomD.txtcome.txt全在COMPUTER目录下一定要先计算MACTable再转发,这样计算机要是给自己发消息的话即frommac==tomac,交换机便可以直接向消息来的port转发,就不需要广播了.其实实际情况是如果frommac==tomac,消息在经过计算机网卡时,便立刻返回给了自己,根本没有向网络上发布.这也是本系统做的一个不符合实际情况的地方,实际情况是计算机给自己发消息,自己收到消息,而交换机的MACTable没有记录源主机的MAC地址.因为时间伧促没有及时修改,十分遗憾。其它的工作情况基本符合事实,而且运行正常的很。哪怕在系统工作的时候将Computer换接了Switcher端口,仍然按照修改后的系统正常工作。3.开发工具MicrosoftVisualC++6.04.具体设计系统工作的步骤:co[from].SendData(sw);sw.RecvData(co[from].port,co[from].mess);sw.ComputeMACTable();sw.SendData();sw.SaveMAC();//将MAC的变化输出到文件以供查看for(inti=0;iCOMPUTER_NUM;i++)co[i].RecvData(message1);程序文件结构Class.h:声明结构和类Class.cpp:定义类的成员函数数数Main.cpp:主程序structMessage//消息结构{charFromMAC[18];charData[1024];charToMAC[18];};structRecordset//MAC表的记录结构{intp_num;charMAC[18];};classComputer//计算机类{public:charrecvfile[20];voidPrintInfo();charname[20];intport;charMAC[18];Messagemess;Computer();Computer(char*c_name,ints_port,char*c_MAC);voidRecvData(Messages_mess);voidSendData(Switchersw);voidBindPort(ints_port);voidSetMACAddr(charc_MAC[]);voidSetName(charc_name[]);voidSetData(char*data,char*ToMAC);voidSetRecvFile(char*filename);virtual~Computer();friendSwitcher;};classSwitcher//交换机类{public:voidSetName(charsname[]);charname[20];Switcher();voidComputeMACTable();voidSendData();voidRecvData(intp_num,Messagestr_me);voidPrintTable();voidSaveMAC();Switcher(ints_pnum,char*s_name);friendComputer;virtual~Switcher();private:intmess_FromPort;charmess_FromMAC[18];intPORTNUM;intmess_ToPort;charmess_ToMAC[18];Messagebuffer;RecordsetTemp;vectorRecordsetMACTable;//使用创建一个Recordset类型的序列容器MACTAble};主程序(详细的见程序源代码,有注解)constCOMPUTER_NUM=5;voidGraph();//打印拓扑图voidMenu();//打印可选菜单charSelectNum();//等待输入选项voidMakeMessage();//构造消息voidInit();//系统初始化char*InputMAC();//专门用于输入MAC地址并返回其指针voidSetComputer();//用于设置计算机voidSetSwitcher();//用于设置交换机voidStart();//演示系统运行voidWorking();//环境系统工作//构造演示系统的环境和设备Switchersw(5,switcher);//实例一个五口的交换机名:switcherComputerco[COMPUTER_NUM];//定义五台电脑Messagemessage1;//定义一个消息intport;//消息从交换机的port端口进入intfrom,to;//记录消息的始,终计算机的下标charMAC[18];//全局MACInput()对其改变并返回指向它的指针//主函数程序入口intmain(intargc,char*[]){Init();Start();return0;}主程序中的部分函数charSelectNum(){charerror='e';charch[2];ch[0]=getche();ch[1]=getch();if(ch[1]=='\r'||ch[1]=='\n')//一定要保证第二个从键盘输入的为回车returnch[0];elsereturnerror;//否则返回一个error}voidMakeMessage(){inti=1;charcomputer_name[20];while(i)//确保系统中有源主机,直到输入正确的为至{cout选择源主机:;cincomputer_name;for(i=0;iCOMPUTER_NUM;i++){if(!strcmp(co[i].name,computer_name))//找到这台计算机{from=i;//记录源主机在数组中的下标port=co[i].port;//源主机所接入的switcher的端口号break;}}if(i==5)cout输入错误!\n;elsei=0;}i=1;//同样确保系统中有宿主机,直到输入正确的为至while(i){cout选择宿主机:;cincomputer_name;for(i=0;iCOMPUTER_NUM;i++){if(!strcmp(co[i].name,computer_name)){to=i;break;}}if(i==5)cout输入错误!\n;elsei=0;}strcpy(co[from].mess.FromMAC,co[from].MAC);//构造源主机所发消息的源MAC目标MACstrcpy(co[from].mess.ToMAC,co[to].MAC);port=co[from].port;strcpy(message1.FromMAC,co[from].MAC);//构造系统消息的源MAC目标MACstrcpy(message1.ToMAC,co[to].MAC);cout输入要发送的内容(以@结束):;cin.getline(message1.Data,1024,'@');//ASSERT(message1.Data[0]=='\r');//用宏调试出message1.Data[0]为'\r'//所以要过滤第一个字符'\r'for(i=0;i1024&&message1.Data[i]!='\0';i++)message1.Data[i
本文标题:交换机MAC地址表的形成过程动态演示
链接地址:https://www.777doc.com/doc-3130055 .html