概要:本科毕业设计课题的内容是实现低优先级MPTCP,在实现过程中碰到的困难有点多,现在顺利完成了毕业论文的答辩,希望能够把自己的一些经验和教训总结一下,希望有这方面需要的同学可以有所参考,不用像我那么艰难。
实验环境:VMware Workstation Pro 网上的破解版,之前电脑上装的版本有点问题,VMtools不能正常用,安装就直接在百度搜索是没什么问题的。
测试环节使用的工具是mininet,这部分内容在后面一些讲。
在这里先提前致谢一下带我做毕业设计的马学姐,非常有耐心,帮我一起做实验,帮我修改代码,我的毕设内容已经非常简化,只是在支持MPTCP的内核当中新添加了一个拥塞控制算法,而且做出来的效果并不好,所以本篇文章的作用更多是让大家学习怎么编译好支持MPTCP的版本,通过发送端的多个接口进行发送数据以及怎么使用mininet来测试。和MPTCP调度器的相关开发工作比较难,如果有同学在选题前看到这篇文章,建议你换一个课题来选。
一、MPTCP的配置
安装依赖环境
sudo apt-get update
sudo apt-get install libncurses5-dev
apt-get install build-essential
获取MPTCP的代码
cd /usr/src
git clone --depth=1 git://github.com/multipath-tcp/mptcp.git
cd mptcp
这两部分我本来是按照网上的一篇博主bryanting的教程来做的,但是后来编译内核进去之后发现学姐写的拥塞控制算法没办法编译进去,所以就选择换了个版本号,具体版本如下。
因为打算编译进去的拥塞控制算法是在LEDBAT上进行改进的,所以直接用那位博主的版本会不支持,大家可以根据自己的实际需求下载指定的内核版本。
配置编译内核
sudo make menuconfig
这部分的配置工作也都是博主bryanting所写,我做一个搬运,文末也会贴上链接,大家可以去学习一下。
编译MPTCP内核
cd /usr/src/mptcp
sudo make
编译并安装模块
sudo make modules_install
安装
sudo make install
时间较长需要耐心等待,等安装完成之后重启Ubuntu系统,开机过程中按住shift挑选我们编译的内核版本,比如我就需要选择4.9.169+:
建议使用虚拟机的同学拍摄好快照,因为工作比较繁琐,出现了问题从头做会比较耗费时间和精力。
这部分完成之后MPTCP就算是编译完成了。
在我毕设内容中,我把拥塞控制算法编译进去,就直接进行测试了,是阉割版的低优先级MPTCP,因为MPTCP是能够支持TCP的拥塞控制算法的,比如CUBIC算法、LEDBAT算法其实都是能够直接用的,因此在这个过程中必须要对调度器进行修改,难度比较大,因为MPTCP的代码你只能够自己看源码一点一点的看。
对LEDBAT的相关理解,有机会我会在其他文章中写,希望能够给大家一点帮助。
完成MPTCP编译之后,你可以进行调度器、路径管理的配置,这部分的内容我参考的博客是:
https://blog.csdn.net/bryanting/article/details/52397427
在编译拥塞控制算法进入内核这里,我以LEDBAT算法为例,我们先从github上下载LEDBAT算法,然后将它放到usr\src的目录下面,然后我们
sudo make
sudo make install
编译成功后我们通过下面的命令来查看现在系统所支持的拥塞控制算法
cat /proc/sys/net/ipv4/tcp_available_congestion_control
指定你要使用的拥塞控制算法
sudo sysctl -w net.ipv4.tcp_congestion_control=”拥塞控制算法名称”
接下来是毕设当中的测试环节,利用mininet可以构建自己的拓扑结构,mininet的安装教程网上很多,在这里就不再赘述了。如果在平时不需要使用MPTCP的情况下,可以直接使用里面的工具miniedit直接在可视化的情况下搭建拓扑结构,非常方便快捷,相关的教程网上都有,但是对于MPTCP来说是行不通的,我刚进行测试的时候使用miniedit是根本没有办法利用多个接口的,耗费了很长时间,我还在网上加了一个研究生学姐,她跟我说是在NS-3环境下面做的,NS-3的环境弄起来特别繁琐复杂,期间真的非常痛苦,因为没办法利用多条子路,后来发现网上的一个用python写的拓扑能够使用多条子路进行数据收发,说明还是需要自己书写python脚本来搭建拓扑结构,而且多接口的体现不能够让发送端同时连到一个路由上面,要经过多个路由的方式来体现多条子路,可以用下图的拓扑结构:
具体的python代码我贴在下面,拓扑结构就是上图,可以自己修改对应链路的参数,比如带宽、时延还有最大缓存,对于IP地址,可以自己画张图,然后写出来,看起来会比较直观,对IP地址的配置总之是要让两个接口在同一个子网下面,并且最后的网络号要从1开始,之前在这里犯过错误:
#!/usr/bin/python
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.link import TCLink
from mininet.cli import CLI
import time
import subprocess
import os,signal
import sys
# 5.0 6.0 7.0
# ___r1____ ____r5____
# / \0 1 0 /1 \ 10.0
# h1 r3-----r4 r7---h2
# \ /2 \____r6____/
# ---r2----- 8.0 9.0
max_queue_size = 100
net = Mininet( cleanup=True )
h1 = net.addHost('h1',ip='10.0.1.1')
r1 = net.addHost('r1',ip='10.0.1.2')
r2 = net.addHost('r2',ip='10.0.3.2')
r3 = net.addHost('r3',ip='10.0.5.1')
r4 = net.addHost('r4',ip='10.0.5.2')
r5 = net.addHost('r5',ip='10.0.6.2')
r6 = net.addHost('r6',ip='10.0.8.2')
r7 = net.addHost('r7',ip='10.0.10.1')
h2 = net.addHost('h2',ip='10.0.10.2')
##############^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
h3 = net.addHost('h3',ip='10.0.11.1')
r8 = net.addHost('r8',ip='10.0.11.2')
r9 = net.addHost('r9',ip='10.0.13.2')
r10 = net.addHost('r10',ip='10.0.16.2')
r11 = net.addHost('r11',ip='10.0.18.2')
r12 = net.addHost('r12',ip='10.0.20.1')
h4 = net.addHost('h4',ip='10.0.20.2')
#############-------------------------------------------------------
#links
net.addLink(h3,r8,intfName1='h3-eth0',intfName2='r8-eth0',cls=TCLink , bw=5, delay='25ms', max_queue_size=10*max_queue_size)
net.addLink(r8,r3,intfName1='r8-eth1',intfName2='r3-eth3',cls=TCLink , bw=5, delay='25ms', max_queue_size=10*max_queue_size)
net.addLink(h3,r9,intfName1='h3-eth1',intfName2='r9-eth0',cls=TCLink , bw=5, delay='25ms', max_queue_size=10*max_queue_size)
net.addLink(r9,<