35.5. 监控 MPTCP 子流
多路径 TCP(MPTCP)套接字的生命周期可能比较复杂:创建主 MPTCP 套接字,验证 MPTCP 路径,创建一个或多个子流并最终删除。最后,终止MPTCP 套接字。
MPTCP 协议允许使用 iproute
软件包提供的 ip
工具监控与套接字和子流创建和删除相关的特定于 MPTCP 的事件。这个工具使用 netlink
接口来监控 MPTCP 事件。
此流程演示了如何监控 MPTCP 事件。因此,它会模拟 MPTCP 服务器应用程序,以及客户端连接到此服务。本例中涉及的客户端使用以下接口和 IP 地址:
-
服务器:
192.0.2.1
-
客户端(以太网连接):
192.0.2.2
-
客户端(WiFi 连接):
192.0.2.3
为了简化这一示例,所有接口都在同一子网内。这不是必须的。但是,重要的是路由已正确配置,并且客户端能够通过两个接口访问服务器。
前提条件
- 有两个网络接口的 RHEL 客户端,如带有以太网和 WiFi 的笔记本电脑
- 客户端可以通过两个接口连接到服务器
- RHEL 服务器
- 客户端和服务器运行 RHEL 9.0 或更高版本
-
在客户端和服务器上安装了
mptcpd
软件包
流程
将客户端和服务器上的每个连接额外子流的限制设为
1
:# ip mptcp limits set add_addr_accepted 0 subflows 1
在服务器上,要模拟 MPTCP 服务器应用程序,请使用强制的 MPTCP 套接字而不是 TCP 套接字,以侦听模式启动
netcat
(nc
):# mptcpize run nc -l -k -p 12345
-k
选项可使nc
在第一次接受连接后不关闭监听程序。这要求演示子流的监控。在客户端中:
识别具有最低指标的接口:
# ip -4 route 192.0.2.0/24 dev enp1s0 proto kernel scope link src 192.0.2.2 metric 100 192.0.2.0/24 dev wlp1s0 proto kernel scope link src 192.0.2.3 metric 600
enp1s0
接口具有比wlp1s0
更低的指标。因此,RHEL 默认使用enp1s0
。在第一个终端上,启动监控:
# ip mptcp monitor
在第二个终端上,启动到服务器的 MPTCP 连接:
# mptcpize run nc 192.0.2.1 12345
RHEL 使用
enp1s0
接口及其关联的 IP 地址作为此连接的源。在监控终端上,
ip mptcp monitor
命令现在记录日志:[ CREATED] token=63c070d2 remid=0 locid=0 saddr4=192.0.2.2 daddr4=192.0.2.1 sport=36444 dport=12345
这个令牌将 MPTCP 套接字标识为唯一的 ID,之后它会在同一套接字上关联 MPTCP 事件。
在运行
nc
连接到服务器的终端上,按 Enter 键。第一个数据包完全建立连接。请注意,只要没有发送数据,连接就不会建立。在监控终端上,
ip mptcp monitor
现在记录日志:[ ESTABLISHED] token=63c070d2 remid=0 locid=0 saddr4=192.0.2.2 daddr4=192.0.2.1 sport=36444 dport=12345
可选:显示到服务器上端口
12345
的连接:# ss -taunp | grep ":12345" tcp ESTAB 0 0 192.0.2.2:36444 192.0.2.1:12345
此时,只建立一个到服务器的连接。
在第三个终端上,创建另一个端点:
# ip mptcp endpoint add dev wlp1s0 192.0.2.3 subflow
此命令设置客户端 WiFi 接口的名称和 IP 地址。
在监控终端上,
ip mptcp monitor
现在记录日志:[SF_ESTABLISHED] token=63c070d2 remid=0 locid=2 saddr4=192.0.2.3 daddr4=192.0.2.1 sport=53345 dport=12345 backup=0 ifindex=3
locid
字段显示新子流的本地地址 ID,即使连接使用了网络地址转换(NAT),也标识此子流。saddr4
字段与ip mptcp endpoint add
命令的端点的 IP 地址匹配。可选:显示到服务器上端口
12345
的连接:# ss -taunp | grep ":12345" tcp ESTAB 0 0 192.0.2.2:36444 192.0.2.1:12345 tcp ESTAB 0 0 192.0.2.3%wlp1s0:53345 192.0.2.1:12345
该命令现在显示两个连接:
-
源地址为
192.0.2.2
的、与之前建立的第一个 MPTCP 子流相对应的连接。 -
来自
wlp1s0
接口及源地址192.0.2.3
的子流的连接。
-
源地址为
在第三个终端上,删除端点:
# ip mptcp endpoint delete id 2
使用
ip mptcp monitor
输出中的locid
字段的 ID,或者使用ip mptcp endpoint show
命令来检索端点 ID。在监控终端上,
ip mptcp monitor
现在记录日志:[ SF_CLOSED] token=63c070d2 remid=0 locid=2 saddr4=192.0.2.3 daddr4=192.0.2.1 sport=53345 dport=12345 backup=0 ifindex=3
在第一个带有
nc
客户端的终端上,按 Ctrl+C 来终止会话。在监控终端上,
ip mptcp monitor
现在记录日志:[ CLOSED] token=63c070d2
其他资源
-
ip-mptcp(1)
手册页 - NetworkManager 如何管理多个默认网关