本文首發於我的公眾號 Linux雲端計算網路(id: cloud_dev),專注於乾貨分享,號內有 10T 書籍和視訊資源,後臺回覆「1024」即可領取,歡迎大家關注,二維碼文末可以掃。
VLAN 和 VxLAN 是不是還傻傻分不清楚,這篇文章就來告訴你。
01 什麼是 VxLAN?
VxLAN 全稱是 Visual eXtensible Local Area Network(虛擬擴充套件本地區域網),從名字上就知道,這是一個 VLAN 的擴充套件協議。
VxLAN 本質上是一種隧道封裝技術。它使用 TCP/IP 協議棧的慣用手法——封裝/解封裝技術,將 L2 的乙太網幀(Ethernet frames)封裝成 L4 的 UDP 資料包(datagrams),然後在 L3 的網路中傳輸,效果就像 L2 的乙太網幀在一個廣播域中傳輸一樣,實際上是跨越了 L3 網路,但卻感知不到 L3 網路的存在。
如下圖所示,左右兩邊是 L2 廣播域,中間跨越一個 L3 網路,VTEP 是 VxLAN 隧道端點(VxLAN Tunnel Point),當 L2 乙太網幀到達 VTEP 的時候,通過 VxLAN 的封裝,跨越 L3 層網路完成通訊,由於 VxLAN 的封裝"遮蔽"了 L3 網路的存在,所以整個過程就像在同一個 L2 廣播域中傳輸一樣。
VxLAN 是應網路虛擬化技術而生的。隨著資料中心網路不斷擴增,Cisco、VMware 和 Arista Networks 這些巨頭髮現,傳統的 VLAN 隔離已經無法應對網路虛擬化技術所帶來的成千上萬的裝置增長,於是便聯合起草了這個協議,一直到 2014 年才定稿,由 RFC 7348 所定義。
02 為什麼需要 VxLAN?
主要有三點考慮,使得網路虛擬化迫切需要向 VxLAN 轉變。
1、VLAN ID 數量限制
虛擬化技術的發展,使得以前以單個物理裝置組網的方式,逐步向以虛擬裝置的方式過渡。
以前一臺物理裝置(一臺伺服器也好,一臺網路裝置也好),能支援幾十個埠就已經很了不起了,所以使用 VLAN 是綽綽有餘,但是虛擬化環境下就大不同了,一臺物理主機可能虛擬出上百上千臺虛擬裝置,整個雲資料中心可能要劃分超過成千上萬個的廣播域,而 VLAN 被限制為最多 4094 個,這就顯得捉襟見肘了。
具體我們分析下 VLAN 的包格式就知道了。802.1Q 標準定義了 VLAN 協議的乙太網幀格式如下:
可以看到,VLAN 幀在乙太網幀的基礎上增加了 VLAN Tag 欄位,該欄位包含 TPID、PCP、CFI 和 VID 4 個部分,其中 VID 即表示 VLAN ID,佔 12bit,取值範圍為 0~4095,其中 0 和 4095 為保留值,不能給使用者使用,所以一個乙太網最多可以劃分為 4094 個 VLAN。這就是 4094 這個值的由來。
2、更好地利用多條網路鏈路
VLAN 使用 STP 來管理多條網路鏈路,避免資料傳輸時出現的環路。STP 根據優先順序和成本,只會選擇其中一條鏈路工作,其餘鏈路作為備用鏈路,也就是主備模式(active-passive)。這樣雖然既避免了環路,也增強了可用性,但沒有充分利用多條線路來提升效能,對於使用者來說,等於是花 N 倍的錢,卻只享受到了 1 倍的服務。
VxLAN 則不然,VxLAN 可以在 L3 層網路上,透明地傳輸 L2 層資料,這讓它可以利用 ECMP (Equal-cost multi-path,等價多路徑) 等協議實現多條路徑同時工作,也就是 active-active 模式。這樣當網路流量較大時,可以實現流量的負載均衡,提升資料傳輸效能。
3、TOR 交換機 MAC 地址表限制
交換機的原理是根據 MAC 地址表完成資料包的二層轉發。在虛擬化技術沒出現之前,資料中心的 TOR(Top of Rack) 交換機的一個埠連線一臺物理主機,並對應一個 MAC 地址,當虛擬化技術出現之後,一臺物理主機虛擬出幾十甚至上百臺虛擬機器,TOR 交換機的一個埠雖然還是連線一臺物理主機,但卻對應多個 MAC 地址(這還在不算 VLAN 劃分的情況下),如下圖所示:
這無疑會造成 TOR MAC 地址表的膨脹,交換機本身 MAC 表的空間是有限的,如果溢位,就會造成交換機的不斷泛洪,增加了處理負擔。
如果使用 VxLAN 則不然,VxLAN 使用 VTEP 封裝虛擬機器的二層幀,在三層網路上傳輸,通常,一臺物理機對應一個 VTEP,一個 VTEP 可以被該臺物理機上的所有虛擬機器共有,所以,對於 TOR 交換機的 MAC 地址表來說,一臺物理機只用記錄一條 VTEP 資訊即可。這樣就避免了 MAC 地址表暴增的問題。
4、靈活的虛擬機器部署和遷移
採用 VLAN 的虛擬網路環境,不存在 overlay 網路,只有 underlay 網路。也就是說 虛擬機器的 VLAN 資料包直接在物理網路上傳輸,和物理網路上的 VLAN 資料包融合在一起,這樣的好處是虛擬機器能直接訪問到物理網路的裝置,但壞處也很明顯,虛擬網路無法打破物理網路的界限,具體表現在虛擬機器的部署和遷移不太靈活。
- 部署 :如果要在 VLAN 100 上部署虛擬機器,那麼只能在支援 VLAN 100 的物理機上部署,如下圖所示,假設左右兩個區域分屬 VLAN 100 和 VLAN 200,現在 VLAN 100 已經部署了很多虛擬機器,而 VLAN 200 卻才部署了少量的虛擬機器,如果這時需要繼續往 VLAN 100 部署新的虛擬機器,那麼也只能選擇在左邊區域部署,這就會造成左邊區域負擔過重。
- 遷移 :同樣,如果從左邊區域往右邊區域遷移虛擬機器,因為兩邊分屬於不同的 VLAN,虛機所分配的 IP 地址不同,無法直接進行遷移,這會造成整個叢集機器的負載分配不均。
使用 VxLAN 則完全不全在這些問題,通過 VxLAN 的封裝,在一個 L3 網路上構建了 L2 網路,或者說基於 underlay 網路的 overlay 網路,虛擬機器的資料可以打破 L2 網路的限制,在 L3 網路上傳輸,虛擬機器的部署和遷移也不受物理網路的限制,可以靈活部署和遷移,使得整個資料中心保持一個平均的利用率。
03 VxLAN 的報文格式
VxLAN 是一種隧道封裝技術,那自然它的報文格式也是一種封裝的結構,如下圖很好地展現了 VxLAN 的封裝報文格式。
首先,最裡面是原始的 L2 乙太網幀,也就是虛擬機器發出的資料幀,接著封裝上 VxLAN 的頭部,然後整個 VxLAN 幀再封裝在物理網路中的 UDP 報文中,接著是 IP 包頭,MAC 頭。為了和內部的原始乙太網幀區別,外部封裝的都加上外層 IP 頭,外層 MAC 頭。
其中,VxLAN 頭由 8Bytes 組成,分別是:
- Flags:佔 8bits,具體是
RRRRIRRR
,其中I
必須設定為 1,表示是是一個合法的 VxLAN ID,其它 7bits 的R
作為保留欄位並且設定為 0。 - VNI(VxLAN Network Identifier):佔 24bits,VxLAN 的 ID 標識,這個欄位就對比於 12bits 的 VLAN ID,支援 ID 個數擴充套件為
2^24 = 16777216
,約等於 16M 個。 - Reserved:有兩個欄位,分別佔 24 bits 和 8 bits,作為保留欄位並且設定為 0。
對於 UDP 頭部,需要注意的是,目的埠(dst port) 預設設定為 4789,這是 IANA 分配的 VxLAN 協議使用埠號。
其餘欄位都是我們常見的 TCP/IP 協議欄位,這裡就不再贅述了。
如果嫌以上圖示還比較抽象,可以參考下面這幅用 Wireshark 抓包的圖,更為直觀:
04 VxLAN 的資料傳輸
下面通過一個具體的例子來看看基於 VxLAN 的網路結構及資料傳輸是怎樣的。
如下圖,是一個基於 VxLAN 的網路結構圖:
圖中,VTEP 叫做 VxLAN 隧道端點(VxLAN Tunnel Endpoint),是 VxLAN 協議中將對原始資料包進行封裝和解封裝的裝置,它可以由硬體裝置實現,也可以由軟體實現。
假如圖中 VM1 ping VM2,會是怎樣一個通訊過程:
- VM1 不知道 VM2 的 MAC 地址,會發出 ARP 請求。
- VM1 所在主機的 VTEP 封裝 ARP 請求包,並向網路中其餘 VTEP 廣播。同時在 MAC 地址表中記錄 VM1 的表項。
- VM2 所在主機的 VTEP 接收 ARP 請求包,解封裝之後將原始包發到 VM2,同時記錄 VM1 的 MAC 地址表項。
- VM2 發出 ARP 響應,經過 VTEP,再次封裝之後,由於之前學習到 VM1 的地址,所以直接單播發給 VM1 所在主機的 VTEP,同時記錄 VM2 的 MAC 地址表項。
- VM1 所在主機 VTEP 接收 ARP 響應包,解封裝之後發給 VM1,同時記錄 VM2 的 MAC 地址表項。
- VM1 拿到 VM2 的 MAC 地址之後,發出 ICMP 包,這個時候 VTEP 的 MAC 地址表中已經學習到 VM2 的地址,所以直接封裝之後,單播發給 VM2 所在主機 VTEP。
- VM2 所在主機 VTEP 解封裝之後,直接發給 VM2。
- VM2 構造 ICMP 的響應包,同樣的過程發給 VM1,至此完成整個 ping 的過程。
05 總結
VxLAN 相比 VLAN 有很多的優勢,不過在可預見的未來,還不能完全替代 VLAN,這需要根據使用場景具體分析。VxLAN 的優勢更多體現大規模環境下,如果網路裝置規模,不論是虛擬的還是物理的,只有百十臺的樣子,那麼直接使用 VLAN 就足夠了。另外一個 VxLAN 的封裝解封裝機制也會影響效能,所以需要綜合考慮。
VxLAN 在 Linux、OVS、容器網路等實現中都有非常多的應用,關於這些內容,留作後面具體講解了。
原創不易,如果覺得文章不錯呢,麻煩動動小指給個在看吧,或者轉發分享一下,這將會是對我原創的最大支援!謝謝!
後臺回覆“加群”,帶你進入高手如雲交流群
我的公眾號 「Linux雲端計算網路」(id: cloud_dev) ,號內有 10T 書籍和視訊資源,後臺回覆 「1024」 即可領取,分享的內容包括但不限於 Linux、網路、雲端計算虛擬化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++程式設計技術等內容,歡迎大家關注。
參考:
https://tools.ietf.org/html/rfc7348
http://www.just4coding.com/blog/2017/05/21/vxlan/
https://zhuanlan.zhihu.com/p/36165475
https://www.openstack.org/assets/presentation-media/OpenStackOverVxlan.pdf