Red Hat Training
A Red Hat training course is available for RHEL 8
29.2. 准备 RHEL 启用 MPTCP 支持
默认情况下,RHEL 中禁用 MPTCP 支持。启用 MPTCP,以便支持此特性的应用程序可以使用它。此外,您必须配置用户空间应用程序,以便在那些应用程序默认具有 TCP 套接字时强制使用 MPTCP 套接字。
您可以使用 sysctl
工具启用 MPTCP 支持,并使用 SystemTap
脚本为系统范围的应用程序启用 MPTCP 准备 RHEL。
前提条件
安装以下软件包:
-
systemtap
-
iperf3
流程
在内核中启用 MPTCP 套接字:
# echo "net.mptcp.enabled=1" > /etc/sysctl.d/90-enable-MPTCP.conf # sysctl -p /etc/sysctl.d/90-enable-MPTCP.conf
验证内核中是否启用了 MPTCP:
# sysctl -a | grep mptcp.enabled net.mptcp.enabled = 1
使用以下内容创建
mptcp-app.stap
文件:#!/usr/bin/env stap %{ #include <linux/in.h> #include <linux/ip.h> %} /* RSI contains 'type' and RDX contains 'protocol'. */ function mptcpify () %{ if (CONTEXT->kregs->si == SOCK_STREAM && (CONTEXT->kregs->dx == IPPROTO_TCP || CONTEXT->kregs->dx == 0)) { CONTEXT->kregs->dx = IPPROTO_MPTCP; STAP_RETVALUE = 1; } else { STAP_RETVALUE = 0; } %} probe kernel.function("__sys_socket") { if (mptcpify() == 1) { printf("command %16s mptcpified\n", execname()); } }
强制用户空间应用程序创建 MPTCP 套接字而不是 TCP 套接字:
# stap -vg mptcp-app.stap
注意:此操作会影响命令之后启动的所有 TCP 套接字。在使用 Ctrl+C 中断上述命令后,应用将继续使用 TCP 套接字。
另外,要允许 MPTCP 只用于特定的应用程序,您可以使用以下内容修改
mptcp-app.stap
文件:#!/usr/bin/env stap %{ #include <linux/in.h> #include <linux/ip.h> %} /* according to [1], RSI contains 'type' and RDX * contains 'protocol'. * [1] https://github.com/torvalds/linux/blob/master/arch/x86/entry/entry_64.S#L79 */ function mptcpify () %{ if (CONTEXT->kregs->si == SOCK_STREAM && (CONTEXT->kregs->dx == IPPROTO_TCP || CONTEXT->kregs->dx == 0)) { CONTEXT->kregs->dx = IPPROTO_MPTCP; STAP_RETVALUE = 1; } else { STAP_RETVALUE = 0; } %} probe kernel.function("__sys_socket") { cur_proc = execname() if ((cur_proc == @1) && (mptcpify() == 1)) { printf("command %16s mptcpified\n", cur_proc); } }
在可选择的情况下,假设您想要强制
iperf3
工具使用 MPTCP 而不是 TCP。要做到这一点,请输入以下命令:# stap -vg mptcp-app.stap iperf3
在
mptcp-app.stap
脚本安装内核探测后,会在内核dmesg
输出中出现以下警告# dmesg ... [ 1752.694072] Kprobes globally unoptimized [ 1752.730147] stap_1ade3b3356f3e68765322e26dec00c3d_1476: module_layout: kernel tainted. [ 1752.732162] Disabling lock debugging due to kernel taint [ 1752.733468] stap_1ade3b3356f3e68765322e26dec00c3d_1476: loading out-of-tree module taints kernel. [ 1752.737219] stap_1ade3b3356f3e68765322e26dec00c3d_1476: module verification failed: signature and/or required key missing - tainting kernel [ 1752.737219] stap_1ade3b3356f3e68765322e26dec00c3d_1476 (mptcp-app.stap): systemtap: 4.5/0.185, base: ffffffffc0550000, memory: 224data/32text/57ctx/65638net/367alloc kb, probes: 1
启动
iperf3
服务器:# iperf3 -s Server listening on 5201
将客户端连接到服务器:
# iperf3 -c 127.0.0.1 -t 3
建立连接后,验证
ss
输出以查看特定于子流的状态:# ss -nti '( dport :5201 )' State Recv-Q Send-Q Local Address:Port Peer Address:Port Process ESTAB 0 0 127.0.0.1:41842 127.0.0.1:5201 cubic wscale:7,7 rto:205 rtt:4.455/8.878 ato:40 mss:21888 pmtu:65535 rcvmss:536 advmss:65483 cwnd:10 bytes_sent:141 bytes_acked:142 bytes_received:4 segs_out:8 segs_in:7 data_segs_out:3 data_segs_in:3 send 393050505bps lastsnd:2813 lastrcv:2772 lastack:2772 pacing_rate 785946640bps delivery_rate 10944000000bps delivered:4 busy:41ms rcv_space:43690 rcv_ssthresh:43690 minrtt:0.008 tcp-ulp-mptcp flags:Mmec token:0000(id:0)/2ff053ec(id:0) seq:3e2cbea12d7673d4 sfseq:3 ssnoff:ad3d00f4 maplen:2
验证 MPTCP 计数器:
# nstat MPTcp* #kernel MPTcpExtMPCapableSYNRX 2 0.0 MPTcpExtMPCapableSYNTX 2 0.0 MPTcpExtMPCapableSYNACKRX 2 0.0 MPTcpExtMPCapableACKRX 2 0.0
其他资源
- 如何为 RHEL 系统下载或安装 debuginfo 软件包?
-
tcp(7)
手册页 -
mptcpize(8)
手册页