透明网桥的自学习和转发帧算法

2011年的最后一晚,写篇博文纪念下。

算法描述如下:

自学习:当网桥收到一转发帧时,先查找自己的转发表中是否有源地址,若没有则添加此项

转发帧:查找自己转发表中是否有目的地址,若没有则将此帧从其他端口转发出去

若有,则将转发表中记录的目的地址端口和此帧进入网桥时通过的端口进行比较,若相等则丢弃此帧(因为目的主机已经收到此帧了),若不相等,则将此帧通过转发表记录的目的地址端口转发出去

源码如下:(此代码在突出算法思想的情况下设计的尽量简单,有的情况没有考虑,或者简单处理了。)

#include<iostream> using namespace std; #define Max_Data 100//转发表数据项数量 struct Data//数据项结构 { char Add;//地址 int port;//端口 }; struct SendTable//转发表结构 { Data data[Max_Data]; int write;//写指针,指向下一个要写的位置 }sendTable; void initSendTable() { for(int i=0;i<Max_Data;i++) { sendTable.data[i].Add='0'; sendTable.data[i].port=0; } sendTable.write=0; } int index;//记录匹配项 bool Find(Data data)//查找转发表,若找到返回ture,找不到返回false { for(int i=0;i<Max_Data;i++) { if(sendTable.data[i].Add==data.Add) { index=i; return true; } } return false; } void AddSendTable(Data data)//向转发表当前指针处添加数据项,若转发表满则循环覆盖 { sendTable.data[sendTable.write].Add=data.Add; sendTable.data[sendTable.write].port=data.port; sendTable.write=(sendTable.write+1)%Max_Data; } void OutSendTable() { cout<<"********SendTable********"<<"\n"; for(int i=0;i<sendTable.write;i++)//注意:要是写满在轮转回来的话这种方法就不行了。 { cout<<sendTable.data[i].Add<<" "<<sendTable.data[i].port<<"\n"; } cout<<"*************************"<<"\n"; } void main() { Data sourceData,destinationData; char source,destination; int port; initSendTable();//初始化转发表 while(true) { cout<<"Input Source Address and Prot:\n"; cin>>source>>port; sourceData.Add=source; sourceData.port=port; cout<<"Input destination Address:\n"; cin>>destination; destinationData.Add=destination; destinationData.port=0;//由于目的地址不需要输入端口号,此处将其置0 if(!Find(sourceData))//查找转发表,若找不到则将源地址添加如转发表 AddSendTable(sourceData); if(!Find(destinationData))//查找转发表,若找不到则将此帧从所有其他端口发送给别的网桥 cout<<"Send this Data to other bridge through other port\n"; else { if(sendTable.data[index].port==sourceData.port)//若收到此帧的端口和目的地址再转发表存储的端口相同,说明源地址和目的地址处在同一网段内,目的主机已经收到此帧,须将其丢弃 cout<<"This Data already received,so give it up.\n"; else//若端口不同,则通过查找到的端口将此帧发出 cout<<"Send this Data through port "<<sendTable.data[index].port<<"\n"; } OutSendTable();//打印转发表 } }

运行结果:


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
透明网桥的自学习算法是用来建立和使用转发表的过程。当透明网桥刚刚接入到以太网时,转发表是空的。当网桥收到一时,它会按照自学习算法来处理这个,并根据需要更新转发表。 首先,当网桥收到一后,它会先进行自学习。它会查找转发表中是否有与这个的源地址相匹配的项目。如果没有找到匹配的项目,网桥会在转发表中增加一个新的项目,包括源地址、进入的接口和时间。这样逐步建立起转发表。如果已经存在与的源地址匹配的项目,网桥会更新原有的项目。 接下来,当网桥需要转发时,它会根据转发表来进行转发。它会查找转发表中是否有与这个的目的地址相匹配的项目。如果找不到匹配的项目,则网桥会将这个通过除了进入网桥的接口之外的所有其他接口进行转发。如果找到了匹配的项目,网桥会根据转发表中给出的接口来进行转发。但需要注意的是,如果转发表中给出的接口就是这个进入网桥的接口,那么网桥会丢弃这个透明网桥的自学习算法通过不断收集和更新源地址和接口的对应关系,从而建立和使用转发表,实现了转发功能。 透明网桥的特点是它能够在局域网上实现即插即用,无需人工配置转发表,提供了简化和优化网络传输的能力。对于局域网上的站点来说,透明网桥就像是透明的,看不见的,因为站点不知道它们发送的将经过哪几个网桥。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [透明网桥(transparent bridge)](https://blog.csdn.net/cainv89/article/details/50651657)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [透明网桥(计算机网络)](https://blog.csdn.net/qq_50942093/article/details/127161271)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值