2015年11月25日 星期三

MPTCP

From: http://www.cnblogs.com/lxgeek/category/671444.html

MPTCP

背景
     隨著技術的發展許多設備具有了多個網絡接口,而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.
MultiPath TCP: From Theory to Practice  -  S. Barré ,  C. Paasch  and  O. Bonaventure . IFIP Networking, 2011

How to use simple speedtest in RaspberryPi CLI

  pi@ChunchaiRPI2:/tmp $  wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py --2023-06-26 10:4...