MPTCP(Multipath TCP)简介
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 的设计目标
- 提升吞吐量:利用多条路径并行传输数据,充分利用可用带宽。
- 增强鲁棒性:当某条路径中断时,其他路径仍可维持连接,避免断连。
- 向后兼容:与传统 TCP 兼容,中间网络设备(如 NAT、防火墙)无需特殊支持即可工作(部分功能受限)。
- 无缝切换:在移动场景下(如从 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.100
→10.0.0.5
)
- 移动设备切换 Wi-Fi 时,通过
实现与支持
- 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:
- 标准文档:
RFC 6824(2013):Multipath TCP(原始规范)
**RFC 8684**(2020):MPTCP v1(更新版,当前主流)
**RFC 9433**:(调度器框架) - 开源实现:
Linux 内核 MPTCP 代码仓库: https://github.com/multipath-tcp
用户态守护进程 mptcpd:https://github.com/multipath-tcp/mptcpd - Linux MPTCP 社区:
https://multipath-tcp.org/
https://www.mptcp.dev/
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 DD'Notes!
评论