网络专题训练实验报告.docx
- 文档编号:8138342
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:8
- 大小:16.24KB
网络专题训练实验报告.docx
《网络专题训练实验报告.docx》由会员分享,可在线阅读,更多相关《网络专题训练实验报告.docx(8页珍藏版)》请在冰豆网上搜索。
网络专题训练实验报告
网络专题训练Ipv4转发实验报告
一、实验目的
1.了解路由器是如何为分组选择路由,并逐跳地将分组发送到目的主机。
2.初步接触路由表这一数据结构,认识路由器是如何根据路由表确定分组转发的下一跳。
二、实验要求
1.设计路由表的数据结构。
2.完成对Ipv4分组的接受和发送。
3.完成对Ipv4分租的转发。
三、实验基本框架
1.路由初始化函数
voidstud_Route_Init()
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.获取本机地址函数
UINT32getIpv4Address()
四、设计思路
首先设计路由表项结构
structrouteTableItem
{
unsignedintdestIP;//目的地址IP
unsignedintmask;//掩码,用于取出对应的网络地址
unsignedintmasklen;//掩码长度,用于实现最长匹配
unsignedintnexthop;//下一跳地址
};
vector
然后,在路由表项添加函数中,处理路由表项的添加
voidstud_route_add(stud_route_msg*proute)
{
routeTableItemnewTableItem;
newTableItem.masklen=ntohl(proute->masklen);//记录掩码长度
newTableItem.mask=(1<<31)>>(ntohl(proute->masklen)-1);//获得掩码
newTableItem.destIP=ntohl(proute->dest)&newTableItem.mask;//获取网路地址段
newTableItem.nexthop=ntohl(proute->nexthop);//获取下一条
m_table.push_back(newTableItem);//加入路由表
return;
}
每当收到一个新的包时
首先读取包头信息
//获取包头信息
intIHL=pBuffer[0]&0xf;//获取包头长度(bits/32)
//cout<<"IHL:
"< intTTL=(int)pBuffer[8];//timetolive,存活时间 intheaderChecksum=ntohl(*(unsignedshort*)(pBuffer+10));//头部校验和 intdestIP=ntohl(*(unsignedint*)(pBuffer+16));//目的地址 然后判断此包是否是发给本机的 if(destIP==getIpv4Address()) { fwd_LocalRcv(pBuffer,length); return0; } 判断是否应该丢弃此包 if(TTL<=0) { fwd_DiscardPkt(pBuffer,STUD_FORWARD_TEST_TTLERROR); return1; } 查找最长匹配 for(inti=0;i { if(m_table[i].masklen>longestMatchLen&&m_table[i].destIP==(destIP&m_table[i].mask)) { bestMatch=i; isMatch=true; longestMatchLen=m_table[i].masklen; } } 查找成功,重新计算校验和并发送 if(isMatch) { char*buffer=newchar[length]; memcpy(buffer,pBuffer,length); buffer[8]--;//TTL-1 intsum=0;//重新计算校验和 unsignedshortintlocalCheckSum=0; for(intj=0;j<2*IHL;j++) { if(j==5) continue; sum=sum+(buffer[j*2]<<8)+(buffer[j*2+1]); } while((unsigned(sum)>>16)! =0) sum=unsigned(sum)>>16+sum&0xffff; localCheckSum=htons(0xffff-(unsignedshortint)sum); memcpy(buffer+10,&localCheckSum,sizeof(unsignedshort)); //发送 fwd_SendtoLower(buffer,length,m_table[bestMatch].nexthop); return0; } 查找不成功,丢弃该包 else { fwd_DiscardPkt(pBuffer,STUD_FORWARD_TEST_NOROUTE); return1; } 五、收获 1.对Ipv4的转发机制有了实际的认识和体会 2.实践了最长匹配算法 六、源代码 /* *THISFILEISFORIPFORWARDTEST */ #include"sysInclude.h" #include usingstd: : vector; #include usingstd: : cout; //systemsupport externvoidfwd_LocalRcv(char*pBuffer,intlength); externvoidfwd_SendtoLower(char*pBuffer,intlength,unsignedintnexthop); externvoidfwd_DiscardPkt(char*pBuffer,inttype); externunsignedintgetIpv4Address(); //implementedbystudents structrouteTableItem { unsignedintdestIP; unsignedintmask; unsignedintmasklen; unsignedintnexthop; }; vector voidstud_Route_Init() { m_table.clear(); return; } voidstud_route_add(stud_route_msg*proute) { routeTableItemnewTableItem; newTableItem.masklen=ntohl(proute->masklen); newTableItem.mask=(1<<31)>>(ntohl(proute->masklen)-1); newTableItem.destIP=ntohl(proute->dest)&newTableItem.mask; newTableItem.nexthop=ntohl(proute->nexthop); m_table.push_back(newTableItem); return; } intstud_fwd_deal(char*pBuffer,intlength) { intIHL=pBuffer[0]&0xf; intTTL=(int)pBuffer[8]; intheaderChecksum=ntohl(*(unsignedshort*)(pBuffer+10)); intdestIP=ntohl(*(unsignedint*)(pBuffer+16)); if(destIP==getIpv4Address()) { 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;i { if(m_table[i].masklen>longestMatchLen&&m_table[i].destIP==(destIP&m_table[i].mask)) { bestMatch=i; isMatch=true; longestMatchLen=m_table[i].masklen; //cout<<"findone"< } } if(isMatch) { char*buffer=newchar[length]; memcpy(buffer,pBuffer,length); buffer[8]--;//TTL-1 intsum=0; unsignedshortintlocalCheckSum=0; for(intj=0;j<2*IHL;j++) { if(j==5) continue; sum=sum+(buffer[j*2]<<8)+(buffer[j*2+1]); } while((unsigned(sum)>>16)! =0) sum=unsigned(sum)>>16+sum&0xffff; localCheckSum=htons(0xffff-(unsignedshortint)sum); memcpy(buffer+10,&localCheckSum,sizeof(unsignedshort)); fwd_SendtoLower(buffer,length,m_table[bestMatch].nexthop); return0; } else { fwd_DiscardPkt(pBuffer,STUD_FORWARD_TEST_NOROUTE); return1; } return1; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 专题 训练 实验 报告