1. 程式人生 > >CSAPP:網橋的自學習演算法

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