-
1.Vxlan的概念
VXLAN 全稱 Virtual eXtensible Local Area Network。(虛擬擴展本地局域網)
VXLAN 提供與 VLAN 相同的以太網二層服務,但是擁有更強的擴展性和靈活性。與 VLAN 相比,VXLAN 有下面幾個優勢:
支持更多的二層網段。
VLAN 使用 12-bit 標記 VLAN ID,最多支持 4094 個 VLAN,這對於大型雲部署會成為瓶頸。VXLAN 的 ID (VNI 或者 VNID)則用 24-bit 標記,支持 16777216 個二層網段。
能更好地利用已有的網絡路徑。
VLAN 使用 Spanning Tree Protocol 避免環路,這會導致有一半的網絡路徑被 block 掉。VXLAN 的數據包是封裝到 UDP 通過三層傳輸和轉發的,可以使用所有的路徑。
避免物理交換機 MAC 表耗盡。
由於采用隧道機制,TOR (Top on Rack) 交換機無需在 MAC 表中記錄虛擬機的信息
-
2.VXLAN 封裝和包格式
VXLAN 是將二層建立在三層上的網絡。
通過將二層數據封裝到 UDP 的方式來擴展數據中心的二層網段數量。
VXLAN 是一種在現有物理網絡設施中支持大規模多租戶網絡環境的解決方案。
VXLAN 的傳輸協議是 IP + UDP。
VXLAN 定義了一個 MAC-in-UDP 的封裝格式。
在原始的 Layer 2 網絡包前加上 VXLAN header,然后放到 UDP 和 IP 包中。
通過 MAC-in-UDP 封裝,VXLAN 能夠在 Layer 3 網絡上建立起了一條 Layer 2 的隧道。
-
3.VXLAN 包轉發流程
VXLAN 在 VTEP 間建立隧道,通過 Layer 3 網絡傳輸封裝后的 Layer 2 數據。
圖中 Host-A 和 Host-B 位於 VNI 10 的 VXLAN,通過 VTEP-1 和 VTEP-2 之間建立的 VXLAN 隧道通信。數據傳輸過程如下:
Host-A 向 Host-B 發送數據時,Host-B 的 MAC 和 IP 作為數據包的目標 MAC 和 IP,Host-A 的 MAC 作為數據包的源 MAC 和 IP,然后通過 VTEP-1 將數據發送出去。
VTEP-1 從自己維護的映射表中找到 MAC-B 對應的 VTEP-2,然后執行 VXLAN 封裝,加上 VXLAN 頭,UDP 頭,以及外層 IP 和 MAC 頭。此時的外層 IP 頭,目標地址為 VTEP-2 的 IP,源地址為 VTEP-1 的 IP。同時由於下一跳是 Router-1,所以外層 MAC 頭中目標地址為 Router-1 的 MAC。
數據包從 VTEP-1 發送出去后,外部網絡的路由器會依據外層 IP 頭進行包路由,最后到達與 VTEP-2 連接的路由器 Router-2。
Router-2 將數據包發送給 VTEP-2。VTEP-2 負責解封數據包,依次去掉外層 MAC 頭,外層 IP 頭,UDP 頭 和 VXLAN 頭。
VTEP-2 依據目標 MAC 地址將數據包發送給 Host-B。
上面的流程我們看到 VTEP 是 VXLAN 的最核心組件,負責數據的封裝和解封。
隧道也是建立在 VTEP 之間的,VTEP 負責數據的傳送。
-
4.Linux 對 VXLAN 的支持
VTEP 可以由專有硬件來實現,也可以使用純軟件實現。
目前比較成熟的 VTEP 軟件實現包括:
①帶 VXLAN 內核模塊的 Linux
②Open vSwitch

實現方式:
Linux vxlan 創建一個 UDP Socket,默認在 8472 端口監聽。
Linux vxlan 在 UDP socket 上接收到 vxlan 包后,解包,然后根據其中的 vxlan ID 將它轉給某個 vxlan interface,然后再通過它所連接的 linux bridge 轉給虛機。
Linux vxlan 在收到虛機發來的數據包后,將其封裝為多播 UDP 包,從網卡發出。
