天天看點

資料中心内的負載均衡-MPTCP

1. 為什麼用MPTCP做負載均衡?

(1)充分利用網絡資源

以手機為例,手機包含兩種上網方式,蜂窩移動資料網絡(2G,3G,4G)和WIFI網絡。我們希望在有WIFI的時候盡量使用WIFI,這樣可以節省成本,沒有WIFI的時候自動切換到蜂窩移動網絡,避免斷連。同樣在PC端,我們希望有線網卡和無線網卡可以同時上網,提高網速。但是使用TCP協定是無法實作上述功能的。

(2)提供可靠傳輸

MPTCP在協定棧中,位于TCP之上,利用建立TCP子流進行資料傳輸。TCP是面向連接配接的4層協定,它可以提供可靠傳輸,并且擁有擁塞控制機制。但是TCP的單路徑傳輸的協定,即便網絡上存在多條路徑資源,也無法利用這些路徑資源。因為TCP是通過四元組:{源IP,目的IP,源端口,目的端口} 唯一的确定一個連接配接,當四元組中的任一項發生變化時,會導緻連接配接中斷。因為應用程式使用TCP協定隻能和單個四元組綁定,無法同時使用多個IP。使用MPTCP正好可以解決這個問題。

資料中心存在大量的路徑資源,使用MPTCP可以更加充分地利用帶寬資源,且提供可靠傳輸。資料中心最常使用的負載均衡算法為ECMP,通過根據資料流的五元組哈希,将這些資料均勻随機的分散到權重相等的路徑上。這種随機選路負載均衡第一個問題是會産生哈希碰撞。如圖一所示,紅色路徑與藍色路徑産生了碰撞。另一個問題是,用這種最優權重(如最短路徑)的方法選出的路徑,無法判斷路徑是否存在擁塞,很可能将流量繼續發送到一個已經擁塞的鍊路上。而使用MPTCP進行資料中心的負載均衡,在利用多路徑的同時,還可以對流量進行擁塞控制,避免産生擁塞,動态的将資料更多的發送到負載低的鍊路上。有效的提高負載均衡性能。

資料中心内的負載均衡-MPTCP

圖1. 随機哈希選路易産生哈希碰撞

2.MPTCP(Multipath TCP)協定介紹

簡單的說MPTCP是TCP的一個演進協定,MPTCP可以使TCP同時使用多條路徑進行通信。MPTCP在協定棧上的位置如圖2所示。MPTCP在2013年被正式定為标準,詳細内容可參考RFC 6824 https://tools.ietf.org/html/rfc6824。

資料中心内的負載均衡-MPTCP

圖2. MPTCP在協定棧中的位置

MPTCP在設計上的挑戰

(1)對應用層透明,MPTCP對于原本基于TCP的應用應該是完全透明的,即不需要應用做出任何改變,也不需要重新編譯,即可像原來一樣正常工作。應用程式并不知道在4層工作的其實是MPTCP。

(2)對網絡中間件透明,網絡上存在很多中間件,例如防火牆,NAT,這些裝置往往是特制的硬體裝置,即便使用MPTCP協定,應允許資料順利的通過這些中間件裝置而不需要對中間件裝置做任何改變。

MPTCP會話建立過程

MPTCP會話通過建立多個子流來實作同時使用多條路徑傳輸資料,MPTCP子流的建立類似于TCP建立連接配接的過程。這些子流類似于正常的TCP連接配接,通過三次握手建立連接配接,四次揮手關閉連接配接。但這些子流都是綁定到一個已有的MPTCP會話上的。發送端的資料可以選擇任意的子流進行傳輸。

例如:我們可以同時利用手機的WIFI和4G使用兩個IP來和WEB伺服器建立MPTCP會話。但若WEB伺服器隻有1個IP位址,還可以建立MPTCP會話麼?其實是可以的,WEB伺服器可以使用不同的端口分别和手機的WIFI,4G建立連接配接。

建立MPTCP會話的過程:假設我手機選擇用4G開啟建立連接配接,過程如圖3所示,

1.手機會發送一個SYN資料包給WEB伺服器,這個資料包和TCP建立連接配接時發送的一樣,隻不過增加了TCP選項MP_CAPABLE字段,表明手機端支援MPTCP協定,以及一個key(用于将來繼續添加子流時進行驗證)。

2.伺服器端回應SYN+ACK資料包同樣包含TCP選項MP_CAPABLE字段,以及一個key。

3.手機再次回應ACK,此時建立了連接配接。

資料中心内的負載均衡-MPTCP

圖3. MPTCP建立連接配接

此時4G和WEB伺服器建立了連接配接,手機和WEB伺服器可以通過這個路徑傳輸資料,那麼如何添加WIFI和WEB伺服器的路徑呢?要想增加WIFI和WEB伺服器的路徑,首先要用WIFI和WEB伺服器實作完整的建立連接配接過程,才可以使用WIFI與WEB伺服器通信,如圖4所示。這次連接配接和第一個4G與WEB伺服器建立的連接配接是有差別的。

(1)此時的SYN資料包中攜帶的TCP選項是MP_JOIN,并且向WEB伺服器提供足夠的資訊,說明其要加入的MPTCP會話,并确認它是安全的。其中token是前面4G與WEB伺服器建立連接配接的key的哈希。rand是一個随機數,HMAC是rand的哈希。

(2)與第一次建立連接配接不同的是,這次要進行4此握手。目的是保證連接配接安全。

資料中心内的負載均衡-MPTCP

圖4. MPTCP添加子流

實際上,子流在MPTCP會話期間是可以動态的增加或删除的,而且不會影響應用資料的傳輸。比如手機沒有了WIFI信号,那麼資料可以繼續使用4G進行傳輸,而不會造成應用中斷。

MPTCP多個子流亂序問題

當我們使用MPTCP建立多條子流傳輸資料時,每條子流選擇的路由路徑可能不同,那麼路徑延遲也會不同。雖然發送端按序發送資料,但接收端接收到的資料可能産生亂序。既然TCP協定可以使用TCP封包頭中的序号,将資料包排序,那麼MPTCP是不是同樣也可以利用資料包中的序号進行排序?這樣是行不通的,因為每條路徑上的中間件(防火牆等)可能隻有一半的資料經過,它會發現這些包的TCP序号存在間隙,中間盒可能會丢掉這些無序的資料,讓TCP重傳中間這些空缺的資料。

MPTCP通過增加每個子流的包序列号來解決這個問題。這個時候每個資料包有2個序列号,一個是在TCP標頭中的序列号,為子流的序列号;另一個是DSN(data sequence number)為所有傳輸資料的序列号,用于将各個子流的資料重排。那麼使用MPTCP收包,首先使用子流序列号,将各個子流接收到的資料包進行重組,然後使用DSN對各個子流封包重組。

MPTCP擁塞控制

TCP的擁塞控制機制可以根據網絡鍊路情況動态的調整發送速率,我們不再贅述TCP擁塞控制的具體過程。那麼MPTCP建立多條TCP子流傳輸資料,和TCP的擁塞機制有了些許差别。

(1)MPTCP的擁塞控制要保證公平性,即使用MPTCP和使用TCP占用的帶寬應該是相同的。

(2)使用MPTCP的性能至少要和傳統的TCP相持平,或者更好。

(3)使用MPTCP應能提供有效的負載均衡,減少資料在擁塞鍊路上傳輸。

MPTCP的每條子流的擁塞控制機制(慢啟動,擁塞避免,快重傳)與TCP是相同的。收到ACK時,增加擁塞視窗。發生丢包時,減少擁塞視窗的一半。不同的是子流擁塞視窗的調節方式,MPTCP中每個子流都有單獨的擁塞視窗,子流可以根據各自鍊路狀況動态的調節擁塞視窗,但要限制在整個MPTCP會話的視窗總量範圍内。子流擁塞視窗的調節方式如下所示:

子流發生丢包時,減少擁塞視窗的一半。

資料中心内的負載均衡-MPTCP

MPTCP性能

圖5為An overview of Multipath TCP文章中利用亞馬遜EC2資料中心的40台機器内對使用MPTCP做負載均衡進行的測試,實驗對比了使用傳統TCP,2個子流的MPTCP和4個子流的MPTCP的性能。可以看出使用MPTCP确實在一定程度上提高了吞吐量。

資料中心内的負載均衡-MPTCP

圖5. 利用亞馬遜EC2資料中心内的40台機器,對資料流使用TCP以及MPTCP不同子流的吞吐量測試

3.總結

在之前的文章中,曾介紹過資料中心内使用ECMP算法進行負載均衡,通過對資料包五元組哈希為流選擇路徑,實作負載均衡。但使用ECMP存在諸多缺陷:

(1)過于簡單,沒有擁塞控制機制,是以在網絡存在擁塞的情況下,使用ECMP可能會加劇路徑的擁塞。

(2)在非對稱網絡架構下,ECMP的負載均衡效果并不好。

(3)ECMP這種基于流的負載均衡,不适合在資料中心這種老鼠流、大象流并存的環境中。

本文介紹了使用MPTCP協定做負載均衡,通過建立多條TCP子流的方式使用多條路徑傳輸資料。MPTCP可以提供有效的擁塞控制機制,而且切割資料流為多個子流解決,避免大象流這種流量大的資料流在一條鍊路上傳輸。其實,我們還可以對每條子流使用ECMP算法,利用哈希随機選擇路徑,提高負載均衡效果。

不過MPTCP也不是一個完美的負載均衡方案,MPTCP存在以下幾個缺點:

(1)無法進行全局路徑感覺

如圖6所示的網絡拓撲中,L0到L1的流,若隻根據L0下一跳的鍊路狀态進行負載均衡,那麼很可能在S2-L1這段鍊路上發生擁塞。

資料中心内的負載均衡-MPTCP

圖6. 網絡拓撲示例

(2)部署困難

要想使用MPTCP協定,需要在更改通信雙方的協定棧,增加MPTCP協定,這為擴大MPTCP的使用範圍帶來的困難。

原文釋出時間為:2018-09-12

本文作者:SDNLAB君

本文來自雲栖社群合作夥伴“

SDNLAB

”,了解相關資訊可以關注“

”。

繼續閱讀