网络专题训练Ipv4转发实验报告.docx

上传人:b****6 文档编号:7091796 上传时间:2023-01-17 格式:DOCX 页数:7 大小:16.18KB
下载 相关 举报
网络专题训练Ipv4转发实验报告.docx_第1页
第1页 / 共7页
网络专题训练Ipv4转发实验报告.docx_第2页
第2页 / 共7页
网络专题训练Ipv4转发实验报告.docx_第3页
第3页 / 共7页
网络专题训练Ipv4转发实验报告.docx_第4页
第4页 / 共7页
网络专题训练Ipv4转发实验报告.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

网络专题训练Ipv4转发实验报告.docx

《网络专题训练Ipv4转发实验报告.docx》由会员分享,可在线阅读,更多相关《网络专题训练Ipv4转发实验报告.docx(7页珍藏版)》请在冰豆网上搜索。

网络专题训练Ipv4转发实验报告.docx

网络专题训练网络专题训练Ipv4转发实验报告转发实验报告网络专题训练网络专题训练Ipv4转发实验报告转发实验报告一、实验目的1.了解路由器是如何为分组选择路由,并逐跳地将分组发送到目的主机。

2.初步接触路由表这一数据结构,认识路由器是如何根据路由表确定分组转发的下一跳。

二、实验要求1.设计路由表的数据结构。

2.完成对Ipv4分组的接受和发送。

3.完成对Ipv4分租的转发。

三、实验基本框架1.路由初始化函数voidstud_Routenit()2.路由添加函数voidstud_route_add(stud_route_msg*proute)3.路由信息结构体头部包含路由表项目的地址,掩码长度和下一跳的信息4.转发处理函数intstud_fwd_deal(char*pBuffer,intlength)5.本地处理函数voidfwd_LocalRcv(char*pBuffer,intlength)6.下层发送函数voidfwd_SendtoLower(char*pBuffer,intlength,unsignedintnexthop)7.丢弃分组函数voidfwd_DiscardPkt(char*pBuffer,inttype)8.获取本机地址函数UINT32getlpv4Address()四、设计思路首先设计路由表项结构structrouteTableltemunsignedintdestIP;/目的地址IPunsignedintmask;/掩码,用于取出对应的网络地址unsignedintmasklen;/掩码长度,用于实现最长匹配unsignedintnexthop;/下一跳地址;vectorm_table/存储路由表然后,在路由表项添加函数中,处理路由表项的添加voidstud_route_add(stud_route_msg*proute)routeTableltemnewTableltem;newTableltem.masklen=ntohl(proute-masklen);记录掩码长度newTableltem.mask=(1v(ntohl(proute-masklen)-1);获得掩码newTableltem.destIP=ntohl(proute-dest)&newTableltem.mask;/获取网路地址段newTableltem.nexthop=ntohl(proute-nexthop);获取下一条m_table.push_back(newTableltem);加入路由表return;每当收到一个新的包时首先读取包头信息/获取包头信息intIHL=pBufferO&Oxf;/获取包头长度(bits/32)/coutIHL:

IHLendl;intTTL=(int)pBuffer8;/timetolive,存活时间intheaderchecksum=ntohl(*(unsignedshort*)(pBuffer+10);头部校验和intdestIP=ntohl(*(unsignedint*)(pBuffer+16);目的地址然后判断此包是否是发给本机的if(destlP=getlpv4Address()fwd_LocalRcv(pBuffer,length);return0;判断是否应该丢弃此包if(TTL=0)fwd_DiscardPkt(pBuffer,STUD_FORWARD_TEST_TTLERROR);return1;查找最长匹配for(inti=0;ilongestMatchLen&m_tablei.destlP=(destIP&m_tablei.mask)bestMatch=i;isMatch=true;longestMatchLen=m_tablei.masklen;查找成功,重新计算校验和并发送if(isMatch)char*buffer=newcharlength;memcpy(buffer,pBuffer,length);buffer8卜-;TTL-1intsum=0;/重新计算校验和unsignedshortintlocalCheckSum=0;for(intj=0;j2*IHL;j+)if(j=5)continue;sum=sum+(bufferj*216)!

=0)sum=unsigned(sum)16+sum&Oxffff;localCheckSum=htons(0xffff-(unsignedshortint)sum);memcpy(buffer+10,&localCheckSum,sizeof(unsignedshort);/发送fwd_SendtoLower(buffer,length,m_tablebestMatch.nexthop);return0;查找不成功,丢弃该包elsefwd_DiscardPkt(pBuffer,STUD_FORWARD_TEST_NOROUTE);return1;五、收获1.对Ipv4的转发机制有了实际的认识和体会2.实践了最长匹配算法六、源代码/*THISFILEISFORIPFORWARDTEST*/#includesyslnclude.h#includeusingstd:

vector;#includeusingstd:

cout;/systemsupportexternvoidfwd_LocalRcv(char*pBuffer,intlength);externvoidfwd_SendtoLower(char*pBuffer,intlength,unsignedintnexthop);externvoidfwd_DiscardPkt(char*pBuffer,inttype);externunsignedintgetlpv4Address();/implementedbystudentsstructrouteTableltemunsignedintdestIP;unsignedintmask;unsignedintmasklen;unsignedintnexthop;;vectorm_table;voidstud_Routenit()m_table.clear();return;voidstud_route_add(stud_route_msg*proute)routeTableItemnewTableItem;newTableltem.masklen=ntohl(proute-masklen);newTableltem.mask=(1(ntohl(proute-masklen)-1);newTableltem.destIP=ntohl(proute-dest)&newTableltem.mask;newTableltem.nexthop=ntohl(proute-nexthop);m_table.push_back(newTableltem);return;intstud_fwd_deal(char*pBuffer,intlength)intIHL=pBufferO&0xf;intTTL=(int)pBuffer8;intheaderChecksum=ntohl(*(unsignedshort*)(pBuffer+10);intdestIP=ntohl(*(unsignedint*)(pBuffer+16);if(destIP=getlpv4Address()fwd_LocalRcv(pBuffer,length);return0;if(TTL=0)fwd_DiscardPkt(pBuffer,STUD_FORWARD_TEST_TTLERROR);return1;boolisMatch=false;unsignedintlongestMatchLen=0;intbestMatch=0;for(inti=0;ilongestMatchLen&m_tablei.destlP=(destIP&m_tablei.mask)bestMatch=i;isMatch=true;longestMatchLen=m_tablei.masklen;/coutfindoneendl;if(isMatch)char*buffer=newcharlength;memcpy(buffer,pBuffer,length);buffer8卜-;/TTL-1intsum=0;unsignedshortintlocalCheckSum=0;for(intj=0;j2*IHL;j+)if(j=5)continue;sum=sum+(buffer2v16)!

=0)sum=unsigned(sum)16+sum&Oxffff;localCheckSum=htons(0xffff-(unsignedshortint)sum);memcpy(buffer+10,&localCheckSum,sizeof(unsignedshort);fwd_SendtoLower(buffer,length,m_tablebestMatch.nexthop);return0;elsefwd_DiscardPkt(pBuffer,STUD_FORWARD_TEST_NOROUTE);return1;return1;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1