RIP实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

RIP实验报告一、实验目的通过简单实现路由协议RIP,深入理解计算机网络中的核心技术——路由技术,并了解计算机网络的路由转发原理。二、实验要求1.RIP报文有效性检查2.处理Request报文3.处理Response报文4.路由表项超时删除5.路由表项定时发送三、实验接口1.RIP报文处理函数intstud_rip_packet_recv(char*pBuffer,intbufferSize,UINT8iNo,UINT32srcAdd)pBuffer:指向接收到的RIP报文内容的指针bufferSize:接收到的RIP报文的长度iNo:接收该报文的接口号srcAdd:接收到的报文的源IP地址2.RIP超时处理函数voidstud_rip_route_timeout(UINT32destAdd,UINT32mask,unsignedcharmsgType)destAdd:路由超时消息中路由的目标地址mask:路由超时消息中路由的掩码msgType:消息类型,包括以下两种定义:#defineRIP_MSG_SEND_ROUTE#defineRIP_MSG_DELE_ROUTE四、实验基本框架1.当系统收到RIP报文时当系统收到RIP报文时,会调用stud_rip_packet_recv函数,此函数应该实现如下功能:对RIP报文进行合法性检查,若报文存在错误,则调用ip_DiscardPkt函数,并在type参数中传入错误编号。对于Request报文,应该将根据本地的路由表信息组成Response报文,并通过rip_sendIpPkt函数发送出去。注意,由于实现水平分割,组Response报文时应该检查该Request报文的来源接口,Response报文中的路由信息不包括来自该来源接口的路由。对于Response报文,应该提取出该报文中携带的路由信息,对于本地路由表中已存在的项要判断该条路由信息的metric值,若为16,则应置本地路由表中对应路由为无效,否则若更新表项的metric值小于路由表中相应表项metric值时就替代原来的表项。注意要将metric值加1。对于本地路由表中不存在的项,则将metric值加1后将该路由项加入本地路由表,注意,若metric值加1后为16说明路由已经失效,则不用添加。2.RIP超时处理函数RIP协议每隔30秒,重新广播一次路由信息,系统调用该函数并置msgType为RIP_MSG_SEND_ROUTE来进行路由信息广播。该函数应该在每个接口上分别广播自己的RIP路由信息,即通过rip_sendIpPkt函数发送RIPResponse报文。由于实现水平分割,报文中的路由信息不包括来自该接口的路由信息。RIP协议每个路由表项都有相关的路由超时计时器,当路由超时计时器过期时,该路径就标记为失效的,但仍保存在路由表中,直到路由清空计时器过期才被清掉。当超时定时器被触发时,系统会调用该函数并置msgType为RIP_MSG_DELE_ROUTE,并通过destAdd和mask参数传入超时的路由项。该函数应该置本地路由的对应项为无效,即metric值置为16。五、源代码及注释#includesysinclude.hexternvoidrip_sendIpPkt(unsignedchar*pData,UINT16len,unsignedshortdstPort,UINT8iNo);externstructstud_rip_route_node*g_rip_route_table;//路由器表头voidsendTo(UINT8iNo){//向iNo发送本地路由表表intcnt=0;structstud_rip_route_node*local_table=g_rip_route_table;//取路由表头while(local_table!=NULL){if(local_table-if_no!=iNo)//水平分裂算法,不把路由项信息回传给发送者cnt++;local_table=local_table-next;}char*response_table=newchar[4+cnt*20];//路由表,包括所有不来自请求者的路由表项response_table[0]=2;//标识为一个responseresponse_table[1]=2;//版本号response_table[2]=0;//要求为0response_table[3]=0;//要求为0local_table=g_rip_route_table;for(inti=0;icnt;i++){while(local_table-if_no==iNo)//跳过来自请求方的路由项,不发送local_table=local_table-next;*(short*)(response_table+4+i*20)=htons(2);//地址类字段,长度为2byte,RIP规定为2*(short*)(response_table+6+i*20)=htons(0);//IP地址字段,长度为2byte,置为0*(unsignedint*)(response_table+8+i*20)=htonl(local_table-dest);//长度为4byte,复制并转成网络字节序*(unsignedint*)(response_table+12+i*20)=htonl(local_table-mask);//长度为4byte,同上*(unsignedint*)(response_table+16+i*20)=htonl(local_table-nexthop);//长度为4byte,同上*(unsignedint*)(response_table+20+i*20)=htonl(local_table-metric);//长度为4byte,同上local_table=local_table-next;}rip_sendIpPkt((unsignedchar*)response_table,4+cnt*20,520,iNo);//发送分组}intstud_rip_packet_recv(char*pBuffer,intbufferSize,UINT8iNo,UINT32srcAdd){if(*pBuffer==1){////查看命令字段是request,处理请求sendTo(iNo);return0;}if(*pBuffer==2){//查看命令字段,是response,更新本地路由信息pBuffer=pBuffer+4;//跳过RIP头for(inti=0;i(bufferSize-4)/20;++i){//发来的RIP分组的数量,依次检查每一个RIP分组boolflag=false;//查找成功标志,若查找成功,置为truestructstud_rip_route_node*local_table=g_rip_route_table;while(local_table){//遍历本地路由表,查找是否有当前位置一致的表项if(local_table-dest==ntohl(*(unsignedint*)(pBuffer+4))&&local_table-mask==ntohl(*(unsignedint*)(pBuffer+8))){//符合(即原路由表中已有),则修改本地路由表信息flag=true;//查找成功if(local_table-nexthop==srcAdd){//已存在local_table-metric=ntohl(*(unsignedint*)(pBuffer+16))+1;//跳数加1if(local_table-metric16)//大于16,则置成16(RIP最多只能支持16跳)local_table-metric=16;local_table-if_no=iNo;}else{//未存在if(ntohl(*(unsignedint*)(pBuffer+16))local_table-metric){//需要更新local_table-nexthop=srcAdd;local_table-metric=ntohl(*(unsignedint*)(pBuffer+16))+1;//跳数加1if(local_table-metric16)local_table-metric=16;local_table-if_no=iNo;}}}local_table=local_table-next;}if(!flag){//查找不成功,local_table到达本地路由表的尾端,增加新的表项structstud_rip_route_node*new_item=newstructstud_rip_route_node();local_table=g_rip_route_table;while(local_table-next)local_table=local_table-next;new_item-dest=ntohl(*(unsignedint*)(pBuffer+4));new_item-mask=ntohl(*(unsignedint*)(pBuffer+8));new_item-nexthop=srcAdd;new_item-metric=ntohl(*(unsignedint*)(pBuffer+16))+1;new_item-next=NULL;new_item-if_no=iNo;if(new_item-metric16)//查看此表项是否有效,有效则添加local_table-next=new_item;}pBuffer=pBuffer+20;//移向下一位置}return0;}}voidstud_rip_route_timeout(UINT32destAdd,UINT32mask,unsignedcharmsgType){if(msgType==RIP_MSG_SEND_ROUTE){//定时发送for(inti=1;i=2;i++)sendTo(i);}elseif(msgType==RIP_MSG_DELE_ROUTE){//删除本地路由表中的超时路由项stud_rip_route_node*local_table=g_rip_route_table;while(local_table){//遍历路由表if(local_table-dest==destAdd&&local_table-mask==mask)local_table-metric=16;//置为16,表示无效local_table=local_table-next;}}}

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功