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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章