stardance has been extended another month! the new deadline is october 31 :)

You are browsing as a guest. Sign up (or log in) to start making projects!

ayman

@ayman

Joined June 10th, 2026

  • 25Devlogs
  • 1Projects
  • 1Ships
  • 2Votes
Ship Changes requested

What I made
linkprobe measures what a network does to messages between two machines: round-trip time, packet loss, and how many packets get lost in a row (bursts). It can degrade the link on purpose with 5 profiles: clean, latency-ladder, jitter, bernoulli-loss, and gilbert-elliott. I built it because robots that depend on a reply every control cycle get hurt way more by losses in a row than by random single losses, but a lot of tests assume losses are independent.

Main result
At the same 10% loss rate, Gilbert-Elliott bursts were about 4.4x longer than Bernoulli bursts (around 4.9 vs 1.1 packets), and the longest burst was 29 packets vs 5, across 3 seeds. With jitter, the deadline had to be 176 ms to get missed packets under 1%.

What was challenging
I found a bug where my client saved replies under the wrong packet. A late reply got recorded as the next packet’s reply, and every packet after that was shifted by one. Nothing crashed, the data was just wrong. I fixed it by giving every packet a deadline and only accepting the reply with the matching sequence number. Without that, every jitter run would have been garbage. Fixing Hackatime also took a lot of time.

What I’m proud of
Learning how researchers actually model packet loss, building the Gilbert-Elliott channel myself, and checking my results: a replay check across 60,000 packets found only one mismatch, and pytest tests cover the channel functions.
I also learned a lot of new coding libraries and tricks for the future

How to test it

  1. git clone https://github.com/AymanM-Projects/linkprobe
  2. pip install -r requirements.txt
  3. python run_all.py (runs all the profiles; the full set takes a while)
  4. python analyze.py, then run the plot_*.py files to make the graphs
    Everything runs on one computer over loopback, so the only delay and loss are the ones linkprobe adds. Full results are in RESULTS.md.
  • 25 devlogs
  • 30h
Try project → See source code →
Open comments for this post

43m 7s logged

Using pytest, I added a test_channel.py file that checks 3 of the functions in my code: make_channel, adding Bernoulli loss, and changing GE burst lengths.

0
0
6
Open comments for this post

28m 55s logged

OK, next I made a new plot to analyze the missed packet deadline percentage for my latency ladder and jitter runs. We can see that all the latency ladders show a similar shape with a horizontal shift, while the jitter run has an S-shaped curve with an inflection point around 100 ms.

0
0
4
Open comments for this post

47m 7s logged

I made a new Python file that creates a new figure using matplotlib, and it measures the median and p99 RTT for my latency ladder. I will now add this into my RESULTS.md.

0
0
4
Open comments for this post

33m 33s logged

So I worked on fixing and updating my plot.py with some features. I added a title version, fixed the y-axis labeling, and then added a theoretical value using the definitions of GE loss and Bernoulli loss. Something we see is that in the real data there is a staircase step, due to burst values being only integers, while the theoretical value is a straight line. Here is a before and after.

0
0
11
Open comments for this post

1h 13m 23s logged

i added a new file that is supposed to check across all runs if the value in the csv matches with my decide function to check my seeds. Out of 60000 packets i only got one mismatch

0
0
9
Open comments for this post

1h 50m 46s logged

I first added requirements.txt to my repo for people who want to rerun or add onto the experiment, and I also made sure to include instructions to repeat it in my README. Then I fixed some rounding errors in my summary.csv and also added a RESULTS.md that I have not finished yet.

0
0
8
Open comments for this post

2h 16m 23s logged

I used matplotlib to make a graph of my burst results. The x-axis is the burst length (how many packets are lost in a row), and the y-axis is the percentage of bursts that were greater than or equal to the k value. You obviously see a declining trend for both, because it’s much harder for a random point to lose a lot of packets in a row. We see a big difference between Gilbert-Elliott and Bernoulli here, and the difference between the two packet loss calculation methods.

0
0
11
Open comments for this post

20m 35s logged

So now I worked on making another CSV as part of analyze.py, which counts how many bursts were in each run and the length and frequency of the bursts. A burst is basically how many packets were lost in a row. Now I am going to download matplotlib to plot it, see how my data and experiment actually work, and try to understand my results.

0
0
13
Open comments for this post

1h 8m 38s logged

OK, I had to fix a few things with my analyze.py and summary.csv because it didn’t track lost packets or the parameters of the runs, so I used enumerate, slicing, and joining to get the right parameters for each run.

0
0
9
Open comments for this post

2h 9m 6s logged

So over the past few days, I have been working on an analyze.py Python file that takes my CSV results from the 14 trials and basically combines all of it into one summary. Obviously it’s missing late and params, so I have to fix that and make a new one, but I had to learn a lot, and there was a lot of logic I did wrong in the beginning, so I’m glad I worked it out.

0
0
7
Open comments for this post

3h 42m 46s logged

Today was a long day. I basically wrote a new Python file that connects to config.py and runs the server and client multiple times, and I ran a smoke test. I learned a lot of new things, like matrices, which keep all my tests, as well as parsing through argparse.

0
0
35
Open comments for this post

1h 0m 50s logged

Today I created a config.py where I can set all the parameters for the experiments I can do, and I used it to connect channel.py to config.py. I also ran some tests of Bernoulli versus Gilbert-Elliott.

0
0
15
Loading more…

Followers

Loading…