网络专题训练Ipv4转发实验报告Word格式.docx
《网络专题训练Ipv4转发实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《网络专题训练Ipv4转发实验报告Word格式.docx(7页珍藏版)》请在冰豆网上搜索。
/掩码长度,用于实现最长匹配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);
查找不成功,丢弃该包elsefwd_DiscardPkt(pBuffer,STUD_FORWARD_TEST_NOROUTE);
五、收获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.mask=(1(ntohl(proute-masklen)-1);
newTableltem.destIP=ntohl(proute-dest)&
newTableltem.mask;
newTableltem.nexthop=ntohl(proute-nexthop);
m_table.push_back(newTableltem);
intstud_fwd_deal(char*pBuffer,intlength)intIHL=pBufferO&
0xf;
intheaderChecksum=ntohl(*(unsignedshort*)(pBuffer+10);
intdestIP=ntohl(*(unsignedint*)(pBuffer+16);
if(destIP=getlpv4Address()fwd_LocalRcv(pBuffer,length);
if(TTL=0)fwd_DiscardPkt(pBuffer,STUD_FORWARD_TEST_TTLERROR);
boolisMatch=false;
unsignedintlongestMatchLen=0;
intbestMatch=0;
for(inti=0;
/coutfindoneendl;
if(isMatch)char*buffer=newcharlength;
/TTL-1intsum=0;
unsignedshortintlocalCheckSum=0;
sum=sum+(buffer2v16)!
fwd_SendtoLower(buffer,length,m_tablebestMatch.nexthop);
elsefwd_DiscardPkt(pBuffer,STUD_FORWARD_TEST_NOROUTE);