MPTCP 理解

lxgeek發表於2014-12-26
背景
     隨著技術的發展許多裝置具有了多個網路介面,而TCP依然是一個單線路的協議,在TCP的通訊過程中發端和收端都
不能隨意變換地址。我們可以利用多個網路介面的這一特性來改善效能和有效冗餘。例如:你的手機同時連線
WIFI訊號和3G訊號的時候,如果WIFI關掉,使用WIFI進行的TCP連線就會斷開,而不能有效利用3G網路繼續收發資料。
而Multipath TCP可以在一條TCP連結中包含多條路徑,避免上述問題出現。
 
MPTCP簡介
     MPTCP允許在一條TCP鏈路中建立多個子通道。當一條通道按照三次握手的方式建立起來後,可以按照三次握手的
方式建立其他的子通道,這些通道以三次握手建立連線和四次握手解除連線。這些通道都會繫結於MPTCP session,
傳送端的資料可以選擇其中一條通道進行傳輸。
 
MPTCP的設計遵守以下兩個原則:
1.應用程式的相容性,應用程式只要可以執行在TCP環境下,就可以在沒有任何修改的情況下,執行於MPTCP環境。
2.網路的相容性,MPTCP相容其他協議。
 
MPTCP在協議棧中的位置如下所示:
 
 
 
建立連線過程 
 
  如上圖所示:MPTCP的第一個子通道的建立遵守TCP的三次握手,唯一的區別是每次傳送的
報文段需要新增MP_CAPABLE的的TCP選項和一個安全用途的key。而下圖是建立其他的子通道:
 
  如上圖所示:第二條子通道的建立依然遵守TCP的三次握手,而TCP選項換成了MP_JOIN。
而token是基於key的一個hash值,rand為一個隨機數,而HMAC是基於rand的一個hash值。
 
資料的傳送和接收
     MPTCP可以選擇多條子通道中任意一條來傳送資料。MPTCP如果使用傳統的TCP的方式
來傳送資料,將會出現一部分包在一條子通道,而另一部分包在另外一條子通道。這樣的話,防火牆等
中間裝置將會收到TCP的序號跳躍的包,因此將會發生丟包等異常情況。為了解決這個問題,MPTCP通過
增加DSN(data sequence number)來管理包的傳送,DSN統計總的報文段序號,而每個子通道中的
序號始終是連續。
     MPTCP的接收包過程分為兩個階段:第一、每個子通道依據自身序號來重組報文段;第二、MPTCP
的控制模組依據DSN對所有子通道的報文段進行重組。
 
擁塞控制 
     MPTCP中擁塞控制的設計需遵守以下兩個原則:
第一:MPTCP和傳統TCP應該擁有相同的吞吐量,而不是MPTCP中每一條子通道和傳統TCP具有相同的吞吐量。
第二:MPTCP在選擇子通道的時候應該選擇擁塞情況更好的子通道。
 
MPTCP的實現
MPTCP的實現主要分為三部分:
  1. master subsocket 
  2. Multi-path control bock(mpcb)
  3. slave subsocket
 
master subsock是一個標準的sock結構體用於TCP通訊。mpcb提供開啟或關閉子通道、
選擇傳送資料的子通道以及重組報文段的功能。slave subsocket對應用程式並不可見,他們
都是被mpcb管理並用於傳送資料。 
 
應用:
MPTCP的作用除了體現在移動裝置領域,還可以用於資料中心。
比如EC2就會讓兩個終端間冗餘有多條路徑,論文《An overview of Multipath TCP》中對此進行了
實驗,作者租借40臺機器安裝MPTCP的核心然後實驗,其效果如下:
 

參考文獻:
An overview of Multipath TCP - O. Bonaventure, M. Handley and C. Raiciu. USENIX login; , October 2012.