Kickass Endpoint - V. 1.0
Marcel Flores - marcel-flores@u.northwestern.edu
About
=====
Kickass is a congestion control mechanism by Marcel Flores and Aleksandar
Kuzmanovic at the Northwestern Networks Group.
These files contain the implementation of the kickass endpoint for Linux.
Kickass has been placed directly into the Linux Kernel. While it violates
a number of Kernel programming guidelines, it offers a real-life version of
kickass that can be run on real machines.
Requirements
============
0) Custom kernel installation instructions for your distribution
1) Any dependencies for building a regular kernel (e.g. bc, etc.)
2) ethtool - to turn off offloading
Building and patching
=====================
1) Obtain a copy of the Linux Kernel version 3.12.3:
wget http://kernel.org/pub/linux/kernel/v3.x/linux-3.12.3.tar.xz
2) Unpack the kernel
tar xvf linux-3.12.3.tar.xz
3) Apply the patch
patch -p0 < kickass_kernel.patch
4) Configure the kernel according to your distribution. The patch was largely
written and tested on Arch Linux (highly recommended).
5) Enable kickass (and set it as the default if you so desire) in:
-> Networking Support
->Networking Options
->TCP/IP Networking
->TCP: Advanced Congestion Control
->TCP Kickass
And
->TCP Default Congestion Control: Kickass
6) Build and install the kernel and modules according to your distribution,
likely something like:
make
make install [Or similar...]
Running
=======
1) Be sure to disable path MTU discovery, as this labels all packets as Do Not
Fragment:
echo 1 >> /proc/sys/net/ipv4/ip_no_pmtu_disc
2) Disable offloading using the included script:
./turn_off_offloading.sh
3) Use the network!
Kickass works by fragmenting packets to indicate explicit rates. In
particular, routers run an algorithm similar to that of RCP (kickass_qdisc),
and determine an explicit rate. As packets pass through the router, it
fragments them, encoding the rate in the size of the leading fragment. The
receiver notes these sizes, decodes the corresponding rates, and sends them
back to the sender in the corresponding ack messages. The sender then
changes its congestion window and pacing rate to conform to the instructions
from the router:
|Sender| -> [ data ] -> /Router/ -> [da] [ta] -> |Receiver|