MPTCP(Multipath TCP)简介

概述

MPTCP(Multipath TCP,多路径 TCP) 是一种对传统 TCP 协议的扩展,旨在允许单个 TCP 连接同时通过多个网络路径(如 Wi-Fi、蜂窝网络、以太网等)传输数据,从而提升吞吐量、提高网络资源利用率,并增强连接的鲁棒性(容错能力)。

为什么需要 MPTCP?

传统 TCP 问题 MPTCP 解决方案
单路径传输,带宽利用率低 聚合多路径带宽(Wi-Fi + 4G/5G)
网络切换时连接中断 无缝切换(如从 Wi-Fi 切换到 5G)
无法利用冗余路径提升可靠性 多路径容错(单路径故障不影响服务)
中间设备(NAT)导致路径固化 动态添加/删除路径

关键价值:在不改变应用层接口的前提下,透明提升吞吐量 40%~100%**(实测聚合 Wi-Fi + 5G 场景),切换延迟 < 100ms**。

MPTCP 的设计目标

  1. 提升吞吐量:利用多条路径并行传输数据,充分利用可用带宽。
  2. 增强鲁棒性:当某条路径中断时,其他路径仍可维持连接,避免断连。
  3. 向后兼容:与传统 TCP 兼容,中间网络设备(如 NAT、防火墙)无需特殊支持即可工作(部分功能受限)。
  4. 无缝切换:在移动场景下(如从 Wi-Fi 切换到 4G/5G),保持连接不中断。

MPTCP 的优势与挑战

优势:

  • 带宽聚合:Wi-Fi + 5G 可实现更高吞吐。
  • 无缝切换:移动设备切换网络时连接不中断。
  • 负载均衡:智能分配流量,优化资源。
  • 容错能力:单路径故障不影响整体连接。

挑战:

  • 中间设备兼容性:部分 NAT、防火墙会丢弃带未知 TCP 选项的包。
  • 部署复杂度:需两端支持 MPTCP(客户端和服务器)。
  • 调度与拥塞控制复杂:需精细设计以避免不公平。
  • 安全考虑:需防止子流劫持(通过 HMAC 认证缓解)。

MPTCP 的应用场景

  • 移动设备:智能手机同时使用 Wi-Fi 和蜂窝网络。
  • 数据中心:跨多个路径传输大文件,提升吞吐。
  • 高可用服务:关键业务通过多路径保障连接稳定性。
  • 视频流/在线游戏:降低延迟、提升体验。

协议栈架构

分层模型

应用层
  │
  ▼
MPTCP 层(核心逻辑)
  ├── 数据调度器(Scheduler) → 决定数据发往哪条路径
  ├── 拥塞控制器(Congestion Control) → 协调多路径流量
  └── 路径管理器(Path Manager) → 添加/删除子流
  │
  ▼
子流 1(TCP 层) ←→ 子流 2(TCP 层) ←→ ... 
  │                   │
  ▼                   ▼
Wi-Fi 网卡           5G 网卡

核心概念

1. 子流(Subflow)

  • MPTCP 将一个逻辑连接拆分为多个“子流”(Subflow)。
  • 每个子流是一个标准的 TCP 连接,使用一对 IP 地址和端口(四元组)。
  • 多个子流可使用不同的网络接口(如 Wi-Fi 和 5G)。

2. Token 与 Key

  • Key:每个 MPTCP 连接在建立时生成一个 64 位的密钥(Key),用于生成 Token 和校验。
  • Token:由 Key 通过哈希生成的 32 位值,用于快速识别 MPTCP 连接(避免全连接扫描)。

3. 数据序列号(Data Sequence Number, DSN)

  • MPTCP 引入全局的数据序列号(DSN),独立于每个子流的 TCP 序列号。
  • 接收端根据 DSN 对来自不同子流的数据进行重排序,保证应用层数据顺序。

4. 映射(Mapping)

  • 每个子流的数据段需映射到全局 DSN 空间。
  • 通过 Data Sequence Mapping 选项告知接收端:该子流的某段数据对应全局 DSN 的哪一部分。

5. 子流本地序列号(Subflow Sequence Number, SSN)

  • 子流本地序列号(标准 TCP 序列号)

6. 全局确认号(Data ACK, DACK)

  • 全局确认号,确认 DSN 范围的数据已接收

连接建立流程(RFC 8684 核心机制)

MPTCP 使用标准的 TCP 三次握手,但在 SYN/SYN-ACK 中携带 MPTCP 选项。

阶段 1:初始子流建立(MP_CAPABLE)

sequenceDiagram
    Client->>Server: SYN (MP_CAPABLE, Key_A)
    Server->>Client: SYN-ACK (MP_CAPABLE, Key_B)
    Client->>Server: ACK (HMAC(Key_A|Key_B))
  • 关键操作
    • 双方交换 Key_A/Key_B → 生成 Token_A = HMAC(Key_A)Token_B = HMAC(Key_B)
    • 生成共享密钥 HMAC(Key_A|Key_B) 用于后续子流认证

此时,第一个子流建立完成,可传输数据。

阶段 2:添加新子流(MP_JOIN)

sequenceDiagram
    Client->>Server: SYN (MP_JOIN, Token_B, Nonce_A)
    Server->>Client: SYN-ACK (MP_JOIN, Nonce_B, HMAC)
    Client->>Server: ACK (HMAC)
  • 安全机制
    • HMAC = HMAC(Nonce_A | Nonce_B | Key_B) 防止子流劫持
    • 仅当 Token_B 匹配时服务器才接受子流

🔍 中间设备兼容性

  • 若防火墙丢弃 MP_JOIN 包 → 退化为单路径 TCP(向后兼容)
  • 通过 ADD_ADDR 选项通告新地址(如切换 Wi-Fi 后的新 IP)

新子流加入后,数据可在多个路径上并行传输。

数据传输机制

  • 应用层看到的是一个逻辑 TCP 连接。
  • 内核的 MPTCP 层负责:
    • 将应用数据按策略分配到不同子流;
    • 为每个子流的数据块分配 DSN 和映射;
    • 接收端按 DSN 重组数据,提交给应用。

数据映射(Mapping)

  • 问题:子流使用本地 SSN,接收端需按全局 DSN 重组数据
  • 解决方案
    // 每个数据包携带映射信息(TCP 选项)
    Data Sequence Mapping (DSM) {
        DSN:  10000,    // 全局起始 DSN
        SSN:  200,      // 子流起始 SSN
        Len:  1500      // 数据长度
    }
    • 接收端根据 DSM 将子流数据插入全局 DSN 队列

调度策略(Scheduler)

策略 适用场景 原理
default 通用场景 轮询分配数据块
low-latency 实时视频/游戏 优先选择 RTT 最小的路径
throughput 大文件传输 优先高带宽路径,按子流带宽比例分配流量
redundant 高可靠场景(如医疗监控) 冗余传输,同一数据发两条路径,接收即确认

拥塞控制

MPTCP 需要协调多个子流的拥塞控制,避免“饿死”其他 TCP 流。

  • 常用算法:Linked Increase Algorithm (LIA)**、Balanced Linked Adaptation (BALIA)wVegas** 等。
  • 目标:整体公平性 + 路径利用率最大化。

拥塞控制算法

  • LIA(Linked Increase Algorithm)
    • 为每条路径计算权重:w_i = (cwnd_i * RTT_min) / RTT_i
    • 增加 cwnd 时按权重比例分配(避免高 RTT 路径被饿死)
  • BALIA(Balanced LIA)
    • 引入公平性因子,确保 MPTCP 流与普通 TCP 流公平竞争带宽

⚠️ 关键挑战
避免“拥塞欺骗”——恶意路径报告虚假低 RTT 以独占带宽(需结合 RTT 历史数据过滤)

路径管理(Path Management)

  • 添加路径:通过 MP_JOIN 建立新子流。
  • 删除路径:发送 MP_FASTCLOSE 或正常关闭子流。
  • 故障检测:通过子流的 RTO 或显式 MP_FAIL 通知。
  • 地址通告:通过 ADD_ADDR 选项通告新 IP 地址(如切换 Wi-Fi 后的新地址)。

动态路径生命周期

stateDiagram-v2
    [*] --> Active
    Active --> Subflow_Failed: 持续 RTO 超时
    Active --> User_Removed: 应用层删除接口
    Subflow_Failed --> Degraded: 仅剩 1 条路径
    Degraded --> Active: 新子流加入
    User_Removed --> Active: 重新添加接口
  • 故障检测
    • 子流 RTO 超时 3 次 → 标记为失效
    • 发送 MP_FAIL 告知对端丢弃该子流数据
  • 地址变更
    • 移动设备切换 Wi-Fi 时,通过 ADD_ADDR 通告新 IP(如 192.168.1.10010.0.0.5

实现与支持

  • Linux 内核:自 4.1 起实验性支持,5.6+ 更稳定(需启用 CONFIG_MPTCP)。
  • iOS:Apple 自 iOS 7 起在部分服务(如 Siri、iCloud)中使用私有 MPTCP 实现。

工具

工具 命令示例 用途
mptcptrace mptcptrace -i eth0 -f dsn > trace.log 抓取 DSN 序列号分析数据调度
tcpdump tcpdump 'tcp[tcpflags] & tcp-syn != 0' 过滤 MPTCP 握手包
mptcpd mptcpd -c /etc/mptcpd/mptcpd.conf 用户态守护进程,地址、路径管理
ss ss -i 查看 MPTCP 连接状态
mptcpize mptcpize run iperf3 -s 可透明地将普通应用转为使用 MPTCP

总结

MPTCP 是对传统 TCP 的重要演进,通过多路径传输解决了单路径 TCP 在移动性、带宽和可靠性方面的局限。MPTCP 已从实验室走向大规模商用(Apple iCloud、Facebook 移动后端),尽管部署仍面临挑战,但在 5G、边缘计算和高可用网络场景中具有广阔前景。

更多参考

如需深入了解,可参考 Linux MPTCP 社区或阅读 RFC: