MPTCP

点击跳转到内核课程所有目录

点击这里查看配套的教学视频

mptcp的maintainer之一Geliang Tang tanggeliang@kylinos.cn是我们麒麟软件的,最近在调研mptcp和smb、nfs结合的可能性,顺便记录一下。

1 资料

2 使用

2.1 qemu虚拟机

qemu命令行启动虚拟机时,多个网卡的启动参数如下:

-net tap \
-net nic,model=virtio,macaddr=00:11:22:33:44:06 \
-net nic,model=virtio,macaddr=00:11:22:33:44:56 \

启动后,在虚拟机中用ifconfig -a可以看到另一个网卡ens3,debian使用以下命令:

echo -e "auto ens3\niface ens3 inet dhcp" >> /etc/network/interfaces
systemctl restart networking

qemu命令行启动虚拟机可以参考《内核开发环境》

2.2 mptcp相关命令

编译内核时打开配置CONFIG_MPTCPCONFIG_MPTCP_IPV6CONFIG_INET_MPTCP_DIAG

检查系统配置:

# 也就是 /proc/sys/net/mptcp/enabled 文件的值
sysctl net.mptcp.enabled # 检查
sysctl -w net.mptcp.enabled=1 # 如果上面命令检查没开,就执行这条命令

安装相关软件:

dnf install mptcpd -y

路径管理器:

/proc/sys/net/mptcp/pm_type # 0: 内核, 1: 用户空间

数据包调度器:

/proc/sys/net/mptcp/available_schedulers
/proc/sys/net/mptcp/scheduler

已经编译完的二进程程序使用mptcp:

mptcpize run <command>
mptcpize enable <systemd unit>

2.3 路径管理

我的环境如下:

server:
    ens2: 192.168.53.209
    ens3: 192.168.53.37
client:
    ens2: 192.168.53.210
    ens3: 192.168.53.38

server端操作:

ss -iaM # 查看socket状态
    # State   Recv-Q  Send-Q  Local Address:Port  Peer Address:Port
    # ESTAB   0       0       192.168.53.37:9734  192.168.53.1:36632
    # LISTEN  0       5             0.0.0.0:9734       0.0.0.0:*
ip mptcp endpoint show # 列出主机上活动 IP 地址的标识符
    # 192.168.53.37 id 1 subflow dev ens3
    # 192.168.53.209 id 2 subflow dev ens2

client端操作:

ss -iaM # 查看socket状态
    # State  Recv-Q  Send-Q  Local Address:Port    Peer Address:Port
    # ESTAB  0       0       192.168.53.210:36632  192.168.53.37:9734
ip mptcp endpoint show # 列出主机上活动 IP 地址的标识符
    # 192.168.53.38 id 1 subflow dev ens3
    # 192.168.53.210 id 2 subflow dev ens2
ip mptcp limits # 查看限制
    # add_addr_accepted 0 subflows 2
ip mptcp limits set subflow 2
ip mptcp limits set add_addr_accepted 2
# 删除和添加路径
ip mptcp endpoint del id 1 # ens3
ip mptcp endpoint del id 2 # 全给删除了
ip mptcp endpoint add 192.168.53.38 dev ens3 subflow
ip mptcp endpoint add 192.168.53.210 dev ens2 subflow

3 内核态socket

测试步骤:

make
insmod ./kernel-socket-server.ko
insmod ./kernel-socket-client.ko

4 疑问