From 34fc79fe568784294a274851e3040c1171af1fe2 Mon Sep 17 00:00:00 2001 From: eunhhu Date: Tue, 29 Sep 2026 10:48:59 +0100 Subject: Let M6's path waver by 1 ms when flows share it, and count from 20 s of 60 With a fixed delay the drop-tail queue dropped one flow's packets eight times as often as the other's by their phases alone (Floyd and Jacobson, 1992): Pure took 0.63-0.77 of the path from TCP and 0.69 from quinn, 0.47 from itself, and 0.49 under fq_codel. With 1 ms of jitter it takes 0.53 at an RTT of 20 ms. --- research/experiments/020-lossy-paths/run.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'research') diff --git a/research/experiments/020-lossy-paths/run.py b/research/experiments/020-lossy-paths/run.py index 5fc2ede..9dbb53f 100644 --- a/research/experiments/020-lossy-paths/run.py +++ b/research/experiments/020-lossy-paths/run.py @@ -18,8 +18,11 @@ GSO: a qdisc takes a GSO burst as one packet. queued (written) to handed over (read): p50, p99, max. share Pure, quinn or a second TCP flow beside a TCP CUBIC flow, each a process of its own, started together, for --share-seconds; each - one's share of the goodput from 10 s on (CUBIC's flows converge - slowly at an RTT of 100 ms). + one's share of the goodput from 20 s on (CUBIC's flows converge + slowly at an RTT of 100 ms). The path's delay wavers by 1 ms: with + a fixed delay a drop-tail queue drops one flow's packets far more + than the other's by their phases alone (Floyd and Jacobson, 1992), + and which flow that is says nothing of either. python3 research/experiments/020-lossy-paths/run.py [--rounds 3] [--out FILE] """ @@ -228,8 +231,8 @@ def inner(case): else: theirs = finish_quinn(start_quinn(work, seconds), seconds)['timeline_100ms'] mine = finish_tcp(tcp, seconds) - row['mbit'] = goodput(theirs, SIZE + 13, 10.0, seconds - 1) - row['tcp_mbit'] = goodput(mine, 1, 10.0, seconds - 1) + row['mbit'] = goodput(theirs, SIZE + 13, 20.0, seconds - 1) + row['tcp_mbit'] = goodput(mine, 1, 20.0, seconds - 1) total = row['mbit'] + row['tcp_mbit'] row['share'] = round(row['mbit'] / total, 3) if total else 0.0 return row @@ -248,14 +251,14 @@ def cases(seconds, share_seconds): for who in ('pure', 'quinn'): yield {'kind': 'paced', 'who': who, 'rtt_ms': rtt, 'loss': loss, 'jitter_ms': 0, 'seconds': seconds} for who in ('pure', 'quinn', 'tcp'): - yield {'kind': 'share', 'who': who, 'rtt_ms': rtt, 'loss': 0, 'jitter_ms': 0, 'seconds': share_seconds} + yield {'kind': 'share', 'who': who, 'rtt_ms': rtt, 'loss': 0, 'jitter_ms': 1, 'seconds': share_seconds} def main(): parser = argparse.ArgumentParser() parser.add_argument('--rounds', type=int, default=1) parser.add_argument('--seconds', type=int, default=20) - parser.add_argument('--share-seconds', type=int, default=40) + parser.add_argument('--share-seconds', type=int, default=60) parser.add_argument('--only', default=None, help='kinds to run, for example bulk,share') parser.add_argument('--out', type=Path, default=None) parser.add_argument('--inner', default=None, help=argparse.SUPPRESS) -- cgit v1.2.3