首頁 > 軟體

多路徑TCP(MPTCP)

2020-06-16 16:31:00

前言:tcp連線時,一直以來都是只能系結一個ip地址,但是隨著多網絡卡主機越來越多,從一個主機到另一個主機往往都會有多條鏈路可以到達,這種情況下,如何充分利用這多條鏈路進行並行的傳輸或者作為鏈路備份,就變得十分有意義,本篇就簡單介紹其中一種多路徑傳輸的方法—多路徑TCP。

一. 多路徑傳輸的背景

我們來看另一個常見的場景:使用者的手機一般都有4G和WIFI兩種網路接入方式,當使用者進行下載資料時,如果接入了WIFI了就會優先使用WIFI,但是如果中間WIFI鏈路斷了,那麼只能提示下載失敗,並不會切換到4G中接著下載。同時,對於已經存在的多條鏈路,並沒有充分使用以提高頻寬。

以上就是其中的一個重要的應用場景,解下來我們重點說明一下其中的一種實現方法—MPTCP。

二. 實施多路徑傳輸的關鍵點

  1. 多路徑流量的排程和擁塞控制。

    多路徑的流量排程是指對於存在的多個子路徑,如何分配流量到各個子路徑,以達到盡可能提高頻寬的目的。但另一方面,又需要對各個子路徑進行統一的擁塞控制,當一條鏈路上的流量傳送擁塞時,把流量導到另一條鏈路上去。

  2. 路徑傳送失敗後的重傳。

    既然依然是可靠通訊,那麼就會涉及到失敗後的重傳問題。重傳的時候自然就要找到對應的序列號,然而,在多路徑傳輸時,本來序列號連續的包可能被排程到不同的鏈路中傳送,導致出現一個問題:在每個鏈路中傳送的包的序列號不是連續的,在網路傳輸中可能會被網路安全裝置攔截下來。所以需要解決重傳時的序列號的問題。

  3. 建立和管理子路徑。

    對於傳輸時的多路徑,需要對路徑進行管理,以便能夠知曉鏈路情況,在鏈路被移除的時候,通知對端不再使用這條鏈路。在鏈路新增的時候,使能對應的鏈路。

三. 多路徑TCP

在第一節中我們提到了多路徑傳輸,從實現的層次來說,可以分為網路層實現,傳輸層實現,應用層實現。首先說這個應用層實現,這個實施起來代價最高,因為需要改動現有的應用程式。而在網路層實現在面對流量控制等問題時時又困難重重,只有在傳輸層可以藉助天然的TCP的可靠性機制,進行改造。

3.1 多路徑TCP的體系結構

多路徑tcp的功能和過程如下:

  1. 初始化一個連線
  2. 使能一個新的子流
  3. 資料序列號的對映
  4. 可靠性和重傳
  5. 擁塞控制
  6. 鏈路管理
  7. 快速關閉
  8. 回落功能

3.1.1 初始化一個連線

初始化時,是通過SYN,SYN/ACK,ACK報文互動後完成的,在這些報文的tcp選項中,帶有這一端使能的標誌---MP_CAPABLE。同時也會傳遞一個生成的64位元的key值來標示這條連線,在後面有新的子流新增到這條連線時,就會用來進行鑑權(確切說是以這個key生成的token)。

3.1.2 使能一條新的子流

在初始化一個連線以後,在有新的子流需要新增時,是在SYN,ACK報文的tcp選項中的MP_JOIN子段標示的,帶有要加入哪個連線。

3.1.3 鏈路管理

當有新的地址需要新增到連線或者要刪除連線中的一條子流時,通過地址通告的方式,傳遞到對端。

3.1.4 可靠性與重傳

在說到重傳的時候,就得先說到序列號的問題,為了保持每個子流中的序列號是連續的,給每個子流都分配了獨立的序列號,同時,保持一個全域性的連線級別的序列號。當某一條流中資料傳送失敗後,根據其對映後的序列號找到連線級別的序列號,就找到了傳送失敗的包,進而,可以把這個包重新排程到別的子流中再進行傳送。

3.1.5 擁塞控制

擁塞控制不能單純的著眼於某一條流的擁塞控制,必須全域性考慮,因為如果每一條都單獨考慮自己的擁塞情況,在瓶頸時,就會導致對於普通的tcp而言,流量分配不公平。對於擁塞演算法,具體的可以參考rfc 6356。這個文件提供了一種對於多流的擁塞控制的方法。

3.1.6 快速關閉

因為一條tcp通過傳送RST報文,只能關閉一條子流,所以,為了能夠快速的關閉所有的連線,使用快速關閉控制報文可以達到這個目的。


IT145.com E-mail:sddin#qq.com