如果要繪製拓樸圖,需要什麼資訊?怎麽繪畫?
我們可以使用肉眼觀測、LLDP看Neighbor等,逐一繪製,都很花時間。LLDP可能會面臨到有開沒開的問題。
一個設備普遍擁有的MAC Table,更適合於各種場景。MAC Table主要由MAC、其來源介面組成,相較LLDP複雜(多)的資訊,MAC Table是非常容易過濾出資料的。
要繪製拓樸圖,我們會先知道所有設備的資訊,然後定義出圖中的節點(通常為Switch),接著在節點與節點間畫直線表示兩節點直連,這部份就要判斷兩設備是不是相鄰的。
以下為簡單的拓樸圖。

以上圖,表示整理過後的MAC Table。
設備 | 來源介面 | MAC Address |
A | 1 | C、G |
A | 2 | B、E、F |
B | 1 | A、C、G |
B | 2 | E |
B | 3 | F |
C | 1 | A、B、E、F |
C | 2 | G |
E | 1 | A、B、C、F、G |
F | 1 | A、B、C、E、G |
G | 1 | A、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,聯集會得到空集合。
藉此,我們可以判斷任意兩設備是否有相鄰。
這樣完成拓樸圖中節點與節點是否需要劃線的依據。
拓樸圖的節點是已知的,接下來就是要怎麽畫,才能把所有節點跟節點與節點間的線畫上。
方法如下:
- 先選擇一個節點出來,加入待畫Switch串列。
- 從待畫Switch串列,取一個Switch出來,將該Switch放入已畫Switch集合。
- 找到該Switch的鄰居,若鄰居Switch不在已畫Switch集合,則繪製節點與節點的線,並將鄰居Switch加入待畫串列。
- 回到2,直到待畫Switch串列清空。
如果以B為第一個節點,會依序這樣畫。
繪製Switch | 鄰居Switch | 待命Switch | 已畫Switch |
B | A、E、F | A、E、F | B |
A | B、C | E、F、C | B、A |
E | B | F、C | B、A、E |
F | B | C | B、A、E、F |
C | A、G | G | B、A、E、F、C |
G | C | B、A、E、F、C、G |
目前程式碼還在整理之中,後續整理會放上Github供參考用。