Alongside the CoNEXT 2017 paper, we release both the prototype source code and the tools used for the evaluation. We hope those artifacts will assess the reproducibility of the paper and help researchers to improve Multipath QUIC.
The elements required to rerun our experiments are the following:
- The Multipath QUIC prototype based on quic-go
- A Mininet VM
- Minitopo, a helper tool to build multipath networks over Mininet
- Minitopo-experiences, helper scripts running Minitopo experiences
To reproduce our measurement setup, you have two choices. Either you start from the available Mininet VM available here or you download our VM with most of the setup performed here. Notice that the VM was run using
kvm and was not tested with Virtual Box. This walkthrough describes both processes.
Starting from the Mininet VM (skip if you downloaded our VM)
(Unless stated, all commands are performed inside the VM)
Once you downloaded the Mininet VM and run into it, you should first edit the file
/etc/sysctl.conf and uncomment the following line:
If you don’t, the Mininet router will not forward packets between hosts and tests will fail. Reboot the VM to apply the change.
You then need to install
go inside the VM. The archive is available at https://golang.org/dl/.
# Download the golang archive $ wget https://redirector.gvt1.com/edgedl/go/go1.9.2.linux-amd64.tar.gz # Extract the archive $ sudo tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz # Add go to your PATH in .profile $ echo "export PATH=$PATH:/usr/local/go/bin" >> ~/.profile # Reload the .profile $ source ~/.profile # This should return your go version $ go version
go is installed, you can download the source code of
quic-go and then checkout the code to the Multipath QUIC prototype.
# Get upstream quic-go code $ go get github.com/lucas-clemente/quic-go # Add the mp-quic remote and checkout to the prototype branch $ cd ~/go/src/github.com/lucas-clemente/quic-go $ git remote add mp-quic https://github.com/qdeconinck/mp-quic.git $ git fetch mp-quic $ git checkout conext17 # Download all dependency packages $ go get -t -u ./...
UPDATE: It might be possible that the
go getcommand returns an issue like
internal/handshake/mint_utils.go:57:16: mc.conn.State undefined (type *mint.Conn has no field or method State, but does have mint.state). This is because the
mintlibrary changed its API since the artifacts release and
go get -t -u ./...fetches the last commit of the required dependencies. To fix this issue, you can reset the
mintrepository in the state it was when the artifacts were released.
$ cd ~/go/src/github.com/bifurcation/mint $ git reset --hard a6080d464fb57a9330c2124ffb62f3c233e3400e # Check that no more build issues arise $ cd ~/go/src/github.com/lucas-clemente/quic-go $ go build # This should not produce any outputw
Now, you have to install Minitopo. This can be done with the following commands.
# The ~/git directory is used by the minitopo-experiences script $ mkdir ~/git $ cd ~/git # Fetch minitopo $ git clone https://github.com/qdeconinck/minitopo.git
Everything is there for (Multipath) QUIC, but the VM is not Multipath TCP capable. This can be done with the following debian packages.
# Download MPTCP deb files. Note that they will only work on Mininet configurations! $ wget http://multipath-quic.org/mptcp_debs.zip # Install deb packages $ cd mptcp_debs $ sudo dpkg -i *.deb # Reboot the VM $ sudo reboot now # ... After logging back, check if the VM runs the good kernel version $ uname -a # Should print Linux 4.1.39+ #81 ...
This is nearly done, and you should have a VM which should (nearly) be in the same state as the VM we provide. There still remains a few configurations to perform before running tests. Those are common with the provided VM, so continue to the next section.
Starting from the provided VM
Before having a VM ready to run tests, two additional steps are required.
The first one is to provide the public SSH key of the host machine to the guest one. This would the VM from prompting the password of the
mininet user for each remote command triggered by the host.
# Running on the VM, assuming the host public key is located at ~/id_rsa.pub # First create the .ssh directory, if it does not exist yet $ mkdir ~/.ssh $ cat id_rsa.pub >> ~/.ssh/authorized_keys
The next login should not prompt the
mininet password anymore (but maybe the password of your private key).
The second one is to mount the file measurement location on the RAM. This should limit the impact of the hard disk on the results.
# Create if it does not exists yet $ sudo mkdir /mnt/tmpfs # This should be run each time the VM is restarted $ sudo mount -t tmpfs -o size=256M tmpfs /mnt/tmpfs
The VM is now ready to perform measurements.
At the host side, you can now get the minitopo-experiences scripts to perform the experiments.
# Clone the repository $ git clone https://github.com/qdeconinck/minitopo-experiences.git
Before running a script, you must set the hostname and the port of the VM on which tests will be performed. This is done using the variables
REMOTE_SERVER_RUNNER_PORT. Then, you can simply run a script (for instance
quic_mptcp_https_tests_expdes_wsp_lowbdp_quic.py) that will generate folders containing the measurement results.
UPDATE: Please ensure that in
minitopo-experiments/core/core.py, the variable
THREAD_TIMEOUT is set to a value of at least 7200 (seconds). The original value of 600 will always make the script to show
Experience failed; please look at the machine since some tests are theoretically not completable in that timeslot.