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:

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:

net.ipv4.ip_forward=1

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

Once 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 get command 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 mint library 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 mint repository 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_HOSTNAME and 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.