CSAPP:网桥的自学习算法

网桥

网桥(Bridge)像一个聪明的中继器。中继器从一个网络电缆里接收信号, 放大它们,将其送入下一个电缆。相比较而言,网桥对从关卡上传下来的信息更敏锐一些。网桥是一种对帧进行转发的技术,根据MAC分区块,可隔离碰撞。网桥将网络的多个网段在数据链路层连接起来。
网桥也叫桥接器,是连接两个局域网的一种存储/转发设备,它能将一个大的LAN分割为多个网段,或将两个以上的LAN互联为一个逻辑LAN,使LAN上的所有用户都可访问服务器。
扩展局域网最常见的方法是使用网桥。最简单的网桥有两个端口,复杂些的网桥可以有更多的端口。网桥的每个端口与一个网段相连。

网桥的自学习算法

随着时间自动学习哪个主机可以通过那个端口可达,然后只在有必要时,有选择地将帧从一个端口拷贝到另一个端口。


桥接以太网

例如此图中在经过一段时间的学习后,如果主机A发送一个帧到同一个网段上的主机B,当该帧到达网桥X的输入端口时,X就将丢弃此帧,因而节省了其他网段上的带宽。但是如果主机A发送一个帧到另一个网段的主机C,那么网桥X就会把此帧拷贝到和网桥Y相连的端口上,网桥Y会把此帧拷贝到与主机C相连的端口。

自学习算法的原理

  • 自学习:当网桥收到一转发帧时,先查找自己的转发表中是否有源地址,若没有则添加此项。
  • 转发帧:查找自己转发表中是否有目的地址,若没有则将此帧从其他端口转发出去。
  • 若有,则将转发表中记录的目的地址端口和此帧进入网桥时通过的端口进行比较,若相等则丢弃此帧(因为目的主机已经收到此帧了),若不相等,则将此帧通过转发表记录的目的地址端口转发出去。

Code:

#include <bits/stdc++.h>

using namespace std;

const int MAXNUM = 100; //转发表数据项数量

struct Data{
    char Address;//地址
    int port;//端口
};

struct SentTable{
    Data data[MAXNUM];
    int write;
}senttable;

void init(){
    for(int i=0;i<MAXNUM;i++){
        senttable.data[i].Address='0';
        senttable.data[i].port=0;
    }
    senttable.write=0;
}

int index;

bool Find_data(Data data){
    for(int i=0;i<MAXNUM;i++){
        if(senttable.data[i].Address==data.Address){
            index=i;
            return true;
        }
    }
    return false;
}

void add_senttable(Data data){
    senttable.data[senttable.write].Address=data.Address;
    senttable.data[senttable.write].port=data.port;
    senttable.write=(senttable.write+1)%MAXNUM;
}

void print_senttable(){
    printf("------senttable---------\n");
    printf("Address   port\n");
    for(int i=0;i<senttable.write;i++){
        printf("  %c      %d\n",senttable.data[i].Address,senttable.data[i].port);
    }
}

int main()
{
    Data sourcedata,destinationdata;
    char source,destination;
    int port;
    init();
    while(1){
        printf("请输入源地址和端口号: ");
        cin>>source>>port;
        sourcedata.Address=source;
        sourcedata.port=port;
        printf("请输入发送地址: ");
        cin>>destination;
        destinationdata.Address=destination;
        destinationdata.port=0;
        if(!Find_data(sourcedata)){
            add_senttable(sourcedata);
        }
        if(!Find_data(destinationdata)){
            printf("从其他端口将此帧转发给别的网桥\n");
        }
        else{
            if(senttable.data[index].port==sourcedata.port)
                printf("目的地址和源地址在同一网段,目的主机已经收到\n");
            else
                printf("将此帧从查找到的端口发出: %d\n",senttable.data[index].port);
        }
        print_senttable();
    }
    return 0;
}

实验结果

请输入源地址和端口号: B 2
请输入发送地址: A
从其他端口将此帧转发给别的网桥
------senttable---------
Address   port
  B      2
请输入源地址和端口号: A 2
请输入发送地址: B
目的地址和源地址在同一网段,目的主机已经收到
------senttable---------
Address   port
  B      2
  A      2
请输入源地址和端口号: C 1
请输入发送地址: A
将此帧从查找到的端口发出: 2
------senttable---------
Address   port
  B      2
  A      2
  C      1
请输入源地址和端口号: A 2
请输入发送地址: C 1
将此帧从查找到的端口发出: 1
------senttable---------
Address   port
  B      2
  A      2
  C      1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章