為何vxlan需要封裝在UDP里而不是直接使用IP包封裝?

之前考慮可以通過UDP埠號在母機中區分不同的虛擬機,所以需要傳輸層封裝。但是有看到說UDP協議用於封裝vxlan報文的埠號是固定的,所以對此比較疑惑,為何需要一層UDP封裝,其目的是為了解決什麼問題呢?


謝邀,個人認為主要是為了解決ECMP的問題


Vxlan主要應用在數據中心當中,數據中心有一個很大的需求就是避免STP,同時實現高速轉發;數據中心採用的拓撲結構基本也是有大量的冗餘鏈路,那麼ECMP就是不可避免的問題。

當網路中的一台網路設備面對多條等價路徑時,它需要做的就不光是對目地IP地址的轉發了,而是要對目的IP,原IP,上層的協議(TCP or UDP),目標埠和原埠這5元組進行HASH。(所以這裡你就知道為什麼GRE(IP over IP,外層IP後不是上層協議)不支持ECMP了,不是說技術上不支持,而是在網路設備層面,大多數網路設備不支持)。所以,為了支持ECMP,在vxlan中一定要有UDP墊片

那麼為什麼要選擇UDP呢?在傳統的乙太網環境中,常常要處理BUM(Broadcast,Unknow,Multicast)包,而這些包有個共同的特點就是影響的設備多,在一個廣播域中或一個組播域中的設備都要處理一下,如果採用TCP作為封裝方式,對網路中其他設備的開銷影響太大,UDP正好能避免這樣的問題


主要用於無障礙穿越NAT/PAT!更詳細的分析,請閱讀3。


VxLAN 的封裝格式:(圖片來源於網路)

目前常用的三種Tunnel有三種:

1 IP in IP
這種tunnel就是題主所說的用IP封裝VxLAN,這種tunnel僅僅依靠外層的IP頭很難穿越NAT/PAT設備。

如果使用IP封裝,VxLAN 協議頭需要提供欄位支持NAT,即使這樣,還需要VxLAN端點之間路徑上的NAT設備升級軟體,這是吃力不討好的方案。

2 GRE
在UDP tunnel 流行之前,GRE是最通用的封裝方式,比如PPTP就是採用GRE來封裝用戶數據,GRE有兩種格式:

2.1 標準格式 (Standard)
GRE頭一共4個位元組,4個位元組里也沒有哪個欄位適合做NAT,所以不便於做NAT穿越。

2.2 高級格式 ( Enhanced)
GRE頭一共8個位元組,8個位元組里有一個欄位:Key/VRF,適合做NAT,所以使用的更多,更通用!

但有的NAT設備只支持UDP/TCP/ICMP,並不一定支持Enhanced GRE,所以有時也會造成通信障礙。

3 UDP
細心的讀者會發現,UDP tunnel 越來越流行了,基於幾點特質:

3.1 無障礙穿越任何NAT設備
無論高端的商用路由器、還是家用路由器,都支持,所以無需額外的配置就可以工作,省時省心。

3.2 UDP是無狀態的
大家很少見到TCP tunnel吧?也是有的,比如Cisco Anyconnect Full Tunnel mode,使用TCP + TLS安全封裝,可以將用戶的所有IP包封裝在外層的安全傳輸層;由於建立tunnel 之前需要建立連接,然後再建立tunnel,發送數據的初始延遲就會稍大。外層的TCP是有狀態的,內層負載如果也是有狀態的,雙狀態機不利於排錯、debug。

L2TP、VxLAN、IKEv2 IP Security都是採用UDP封裝。

3.3 IP Protocol 數量有限
一個位元組,理論上可以提供255種協議復用,空間受限。

而採用UDP封裝,埠號2個位元組,理論上可以提供65535種協議復用,空間更遊刃有餘。

3.4 UDP天然支持組播的特性
終端用戶的廣播(如ARP廣播),以及用戶的組播,需要VxLAN傳輸,有兩種方式:

3.4.1 組播傳輸
需要運營商提供組播支持,需要將用戶的廣播、組播,全部映射為VxLAN組播,而支持組播最天然的協議就是UDP。

3.4.2 單播複製多份傳輸
如果運營商不支持用戶組播,則需要頭端設備將用戶的廣播、組播,複製為多份進行單播傳輸,無狀態的UDP協議也是一個合適候選者。


--------更新------
看到另外兩位同學的答案,UDP埠提供了更靈活的負載均衡的潛能,觀點正確,算是使用UDP封裝的一個原因,在這裡我給大家分析一下。

大家看上文的圖片里的Outer UDP Header,VxLAN協議規範指出:Destination Port使用固定埠號(協議埠),Source Port可以使用固定埠號,也可以使用隨機埠號

固定源埠號的負載均衡
Hash ( Source IP, Destination IP, Source Port,Destimation Port )
由於源、目的埠號都為固定,其Hash值與單純使用IP進行HASH沒有本質區別,即在負載均衡眼裡,這是同一個session,會選擇同一條物理路徑。

Hash ( Source IP, Destination IP)

所以如果使用固定源埠號,起不到負載均衡的效果,和採用IP封裝沒有任何區別。

隨機源埠號的負載均衡
由於源埠號基於內層乙太網頭的HASH,不同的Source MAC/ Destination MAC對應不同的業務,會將不同的業務映射到不同的ECMP(Equal Cost Multiple Path )的物理路徑上。

所以使用同一個VTEP,不同的業務使用不同的源埠號,可以起到負載均衡的效果,而這是使用IP封裝所不能實現的目標。


一般來說vxlan還是用在dc里做overlay,而大多數交換機不支持mpls,所以業界發明了vxlan,vxlan的好處在於vxlan hdr很小,overhead不大,並且通過源埠參與ecmp hash可以很容易實現ecmp,由於目的埠固定,題主可以通過源埠標記業務。

而且隨著nic和linux內核的發展,vxlan卸載技術是的傳輸性能進一步增強,於是逐漸成為dc overlay的主流協議了。

相比之下,nvgre這個就用了比較少了,缺點也比較多。

至於nat穿越,個人認為並不是一個主要原因。

20170213更新:

最近在分析一個帶寬數據時,估算了下傳輸速率,在不考慮內外層存在vlan不考慮ip option且按照mtu 1500計算的話,vxlan用於tcp stream流的數據是1396(1500減去外層eth,外層ip,外層udp,vxlan頭,內層eth,內層ip),而nvgre也是1404,基本上就是少消耗了vxlan頭的8位元組,對應的就是vxlan hdr那方面的開銷,100M帶寬的話差不多是0.5M的差異,不算太大,所以vxlan overhead大家一般都能接受。

至於nvgre的缺點,主要是無法take nic的offload特性,另外做leaf spine l3組網時,ecmp可能採用某些晶元的交換機不一定支持。


因為vxlan只是一個封裝,至於面向連接的可靠傳輸,滑動窗口等tcp機制,由內層報文完成即可。


推薦閱讀:

操作系統接駁網路連接設備後,都是怎樣判斷已經成功連入Interent?
tcp詳解v1 真的適合初學tcp/udp編程嗎?
TCP/IP 協議到底在講什麼?
tcp中的mss是536?
為什麼區域網要用mac地址而不直接使用IP地址,統一用IP地址不是更好嗎?

TAG:互聯網 | UDP | 計算機網路 | 網路工程 |