A unified MPQUIC Application Latency Evaluation platform (MAppLE) to evaluate and develop MPQUIC with modular multiplexers, stream schedulers, and packet schedulers.
This is an experimental network traffic generator for MPTCP and MP-QUIC
Usage:
cd ~/mpquic-latency/mpquic-go/src/github/lucas-clemente/quic-go/traffic-gen
go build
go run traffic-gen.go
-a string
Destination address (default "localhost")
-arrdist string
arrival distribution (default "c")
-arrval float
arrival value (default 1000)
-cc string
Congestion control (default "cubic")
-csizedist string
data chunk size distribution (default "c")
-csizeval float
data chunk size value (default 1000)
-log string
Log folder
-m Enable multipath (default true)
-mode string
start in client or server mode (default "server")
-p string
TCP or QUIC (default "tcp")
-sched string
Scheduler
-t uint
time to run (ms) (default 10000)
-v Debug mode
This suite implements a testbed for multi-path QUIC with Forward Erasure Correction. The main application is a DASH video stream on HTTP2 over QUIC.
Go version 1.14 was used during development. Everything was compiled and run under Linux on x86_64.
The MPQUIC-FEC implementation itself can be found in the src
directory. Go
modules are used to handle external dependencies.
Caddy is used as the HTTP2 server and can be found in the caddy
directory.
Its go.mod
file is setup in such a way that the local MPQUIC-FEC
implementation is used.
Files relevant to the DASH stream can be found in the dash
sub directory. To
host, run Caddy from here, as it searches for the Caddyfile
in the current
working directory.
Because you may want to inspect packets with Wireshark, a specific certificate
should be used by Caddy. Generate a self-signed keypair using OpenSSL. This can
be automatically done with the makecert.sh
script. Use the default for each
option except CN
. Set the common name of the certificate to the initial IP
you want to open the multipath connection on. E.g. if the connection is opened
on https://10.1.1.1:4242
, set the CN
to 10.1.1.1
. Don't use hostnames,
they cause issues with the testbed.
A video is not provided, but can be encoded and prepared for DASH using
ffmpeg
. Run the prepare_video.sh
shell script. On the first run it will
download the source video from http://www.jell.yfish.us
. ffmpeg version
n4.2.3 was used during development.
It outputs the encoded video segments and the DASH manifest into the video
sub directory, which can then be hosted by Caddy.
To use all features in caddy (QUIC, multipath, FEC, etc.) use the following set of parameters:
./caddy -quic -mp -scheduler s-edpf -fec --fecConfig win-xor
AStream's client portion is used to access the DASH stream. Here, it is ported to Python3. Python 3.6 is the lowest version the software was tested with.
An additional proxy module is required to allow using MPQUIC-FEC in AStream.
The module can be found in the proxy_module
sub directory. To build, navigate
into this sub directory and execute:
go build -o proxy_module.so -buildmode=c-shared proxy_module.go
Copy then the binary proxy_module.so
into astream/
dash_client.py
is the entry point to AStream.
python3 astream/dash_client.py -q -mp -m https://10.1.1.1/manifest.mpd -s s-edpf --fec --fecConfig win-xor
Evaluations were performed on Emulab. The utilized testbed descriptions are
found in the testbed
sub directory.
The configuration used in the experiments is experiment-moongen.tcl
. It is
made to use two moongen based delay nodes. Those form two connections from the
client to the intermediate router and simulate different link properties.
The implementation of S-EDPF is found in the src
directory. It is split into
two Go packages due to the testbed's code structure.
The employed statistical methods are found in src/sedpf/
. In contrast, the
multipath scheduler itself is found in the file src/scheduler_sedpf.go
Currently the implementation of S-IOD lives in src/scheduler_iod.go
. The main
function is SelectPathsAndOrder
. In contrast to other scheduling functions
this also prepares the actual packets in order to interweave with the FEC
framework. The return value is a list of the packets to be sent and their
respective paths. They are already ordered per-path and are actually sent in
parallel via goroutines. One such routine is spawned per path, allowing packets
to be sent out of order via multiple paths simultaneously.