以MAC Table繪製拓樸圖

如果要繪製拓樸圖,需要什麼資訊?怎麽繪畫?

我們可以使用肉眼觀測、LLDP看Neighbor等,逐一繪製,都很花時間。LLDP可能會面臨到有開沒開的問題。

一個設備普遍擁有的MAC Table,更適合於各種場景。MAC Table主要由MAC、其來源介面組成,相較LLDP複雜(多)的資訊,MAC Table是非常容易過濾出資料的。

要繪製拓樸圖,我們會先知道所有設備的資訊,然後定義出圖中的節點(通常為Switch),接著在節點與節點間畫直線表示兩節點直連,這部份就要判斷兩設備是不是相鄰的。

以下為簡單的拓樸圖。

以上圖,表示整理過後的MAC Table。

設備來源介面MAC Address
A1C、G
A2B、E、F
B1A、C、G
B2E
B3F
C1A、B、E、F
C2G
E1A、B、C、F、G
F1A、B、C、E、G
G1A、B、C、E、F

如果從A的1介面來看,會看到C、G。從圖上來看,我們可以知道是C相鄰,G接到C上。

要怎麽知道設備是不是相鄰的?用一個判斷條件「空集合」。

A與G中間,因為有C,如果A的1介面與G的有A的介面的MAC Addresses,聯集會得到C。

A與C中間沒有設備,A的1介面與C的有A的介面的MAC Addresses,聯集會得到空集合。

藉此,我們可以判斷任意兩設備是否有相鄰。

這樣完成拓樸圖中節點與節點是否需要劃線的依據。

拓樸圖的節點是已知的,接下來就是要怎麽畫,才能把所有節點跟節點與節點間的線畫上。

方法如下:

  1. 先選擇一個節點出來,加入待畫Switch串列。
  2. 從待畫Switch串列,取一個Switch出來,將該Switch放入已畫Switch集合。
  3. 找到該Switch的鄰居,若鄰居Switch不在已畫Switch集合,則繪製節點與節點的線,並將鄰居Switch加入待畫串列。
  4. 回到2,直到待畫Switch串列清空。

如果以B為第一個節點,會依序這樣畫。

繪製Switch鄰居Switch待命Switch已畫Switch
BA、E、FA、E、FB
AB、CE、F、CB、A
EBF、CB、A、E
FBCB、A、E、F
CA、GGB、A、E、F、C
GCB、A、E、F、C、G

目前程式碼還在整理之中,後續整理會放上Github供參考用。