89 lines
3.1 KiB
Markdown
89 lines
3.1 KiB
Markdown
# TCP ROCCET :rocket: (RTT Oriented CUBIC Congestion control ExTension)
|
|
|
|
TCP ROCCET is a new TCP congestion control algorithm that reduces latency by detecting queuing.
|
|
Additionally, it is specially suited for 4G/5G cellular networks.
|
|
|
|
A peer-reviewed [paper on TCP ROCCET](https://opendl.ifip-tc6.org/db/conf/wons/wons2026/1571217211.pdf) was presented at the WONS 2026 conference.
|
|
|
|
## Install with apt
|
|
Add tcp-roccet-dkms to your source lists and install:
|
|
```
|
|
echo "deb [trusted=yes] https://apt.fury.io/timfuchs/ /" | sudo tee /etc/apt/sources.list.d/tcp-roccet.list
|
|
sudo apt update
|
|
sudo apt install tcp-roccet-dkms
|
|
```
|
|
|
|
### Loading and using the congestion control
|
|
Note: This change is not persistent, the module will not be loaded at boot.
|
|
```
|
|
sudo modprobe tcp_roccet
|
|
sudo sysctl net.ipv4.tcp_congestion_control=roccet
|
|
```
|
|
|
|
## Build from source
|
|
|
|
### Setup
|
|
Kernel headers are required:
|
|
* Debian: `sudo apt install linux-headers-generic`
|
|
* Fedora: `sudo dnf install kernel-devel`
|
|
(`sudo reboot`)
|
|
|
|
### Build
|
|
`make`
|
|
|
|
|
|
## Loading & Unloading the Module
|
|
**1.** Insert into Kernel: `sudo insmod tcp_roccet.ko`
|
|
In case you get the "Invalid module Format" error, it can help to reinstall the kernel-headers.
|
|
|
|
**2.** Use the Algorithm:
|
|
* Either via globally loading it: `sudo sysctl net.ipv4.tcp_congestion_control=roccet`
|
|
* Or via using it in specific measurements: `sudo iperf3 -c <Server-IP> -C roccet`
|
|
|
|
**3.** Unload the Module: `sudo rmmod tcp_roccet`
|
|
|
|
|
|
## Debugging (Using kprobe)
|
|
In order to debug the `tcp_roccet` congestion control algorithm, there exists a Kprobe module (`roccet_kprobe.c`). Using this, it is possible to inspect events generated by the algorithm.
|
|
|
|
In order to use the Kprobe module, the following steps are necessary:
|
|
|
|
**1. Specify the event to inspect**
|
|
For this, head into the `tcp_roccet.c` source code and find the function the Kprobe should attach to.
|
|
|
|
For Example:
|
|
```
|
|
__bpf_kfunc static void roccettcp_cong_avoid(struct sock *sk, u32 ack, u32 acked);
|
|
```
|
|
Specify this function name in the field `symbol_name` of the `kprobe` struct in `roccet_kprobe.c`
|
|
|
|
Obtain the arguments in the kprobe using the `regs` field.
|
|
(See the System V ABI for Linux under https://en.wikipedia.org/wiki/X86_calling_conventions#List_of_x86_calling_conventions)
|
|
|
|
**2. Build Kprobe module**
|
|
Use the provided Makefile to build the `roccet_kprobe.c` module for the local machine. (`make`)
|
|
|
|
For this the adequate linux-headers are required
|
|
* Debian: `sudo apt install linux-headers-generic`
|
|
* Fedora: `sudo dnf install kernel-devel`
|
|
|
|
Required files for this are:
|
|
* `Makefile`
|
|
* `roccet_kprobe.c`
|
|
* `tcp_roccet.h`
|
|
* `tcp_roccet.c` (Optional; Need to remove corresponding entry in Makefile if missing)
|
|
|
|
**3. Load Kprobe module**
|
|
To then load the module use
|
|
`sudo insmod roccet_kprobe.ko`
|
|
If you are seeing the error "Unknown symbol in module" you need to first load the roccet algorithm.
|
|
|
|
**4. See the trace output**
|
|
To see the trace output use
|
|
`sudo cat /sys/kernel/tracing/trace_pipe`
|
|
|
|
**5. Unload Kprobe module**
|
|
To remove the module again, use
|
|
`sudo rmmod roccet_kprobe`
|
|
|
|
_See more info at_ https://docs.kernel.org/trace/kprobes.html and https://www.kernel.org/doc/Documentation/trace/kprobetrace.rst |