网络专题训练实验报告Word文档格式.docx
- 文档编号:21274594
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:8
- 大小:16.24KB
网络专题训练实验报告Word文档格式.docx
《网络专题训练实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《网络专题训练实验报告Word文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
voidfwd_SendtoLower(char*pBuffer,intlength,unsignedintnexthop)
7.丢弃分组函数
voidfwd_DiscardPkt(char*pBuffer,inttype)
8.获取本机地址函数
UINT32getIpv4Address()
四、设计思路
首先设计路由表项结构
structrouteTableItem
{
unsignedintdestIP;
//目的地址IP
unsignedintmask;
//掩码,用于取出对应的网络地址
unsignedintmasklen;
//掩码长度,用于实现最长匹配
unsignedintnexthop;
//下一跳地址
};
vector<
routeTableItem>
m_table//存储路由表
然后,在路由表项添加函数中,处理路由表项的添加
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:
"
<
IHL<
endl;
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<
m_table.size();
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)!
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<
vector>
usingstd:
:
vector;
iostream>
cout;
//systemsupport
externvoidfwd_LocalRcv(char*pBuffer,intlength);
externvoidfwd_SendtoLower(char*pBuffer,intlength,unsignedintnexthop);
externvoidfwd_DiscardPkt(char*pBuffer,inttype);
externunsignedintgetIpv4Address();
//implementedbystudents
unsignedintdestIP;
unsignedintmask;
unsignedintmasklen;
unsignedintnexthop;
m_table;
m_table.clear();
routeTableItemnewTableItem;
newTableItem.masklen=ntohl(proute->
newTableItem.mask=(1<
intstud_fwd_deal(char*pBuffer,intlength)
intIHL=pBuffer[0]&
intTTL=(int)pBuffer[8];
intheaderChecksum=ntohl(*(unsignedshort*)(pBuffer+10));
intdestIP=ntohl(*(unsignedint*)(pBuffer+16));
if(destIP==getIpv4Address())
fwd_LocalRcv(pBuffer,length);
return0;
if(TTL<
fwd_DiscardPkt(pBuffer,STUD_FORWARD_TEST_TTLERROR);
return1;
}
boolisMatch=false;
unsignedintlongestMatchLen=0;
intbestMatch=0;
for(inti=0;
if(m_table[i].masklen>
bestMatch=i;
isMatch=true;
longestMatchLen=m_table[i].masklen;
//cout<
findone"
if(isMatch)
char*buffer=newchar[length];
memcpy(buffer,pBuffer,length);
buffer[8]--;
intsum=0;
unsignedshortintlocalCheckSum=0;
for(intj=0;
if(j==5)
continue;
sum=sum+(buffer[j*2]<
while((unsigned(sum)>
sum=unsigned(sum)>
memcpy(buffer+10,&
fwd_SendtoLower(buffer,length,m_table[bestMatch].nexthop);
else
fwd_DiscardPkt(pBuffer,STUD_FORWARD_TEST_NOROUTE);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 专题 训练 实验 报告