A run is valid only if every segment landed on one protocol. A
split count means the browser fell back mid-run — discard that run.
Congestion control (CUBIC) is not visible from the browser; verify it on
the hosts with ../setup_cubic.sh --verify.
| Run | Proto | Condition | # | Dur | Sw | Up | Dn | Rebuf | Rebuf s | Startup | Avg Mbps | Avg res | Stall % |
|---|
| id | Bitrate | Resolution | Decodable |
|---|
The browser picks HTTP/3 on its own via Alt-Svc, which is
not deterministic enough for a measurement. Launch a clean Chrome per arm:
# QUIC arm - force h3 to the server google-chrome \ --user-data-dir=/tmp/cn-quic \ --enable-quic \ --origin-to-force-quic-on=SERVER_IP:8088 \ --ignore-certificate-errors-spki-list=SPKI # TCP arm - QUIC compiled out of the run google-chrome \ --user-data-dir=/tmp/cn-tcp \ --disable-quic \ --ignore-certificate-errors-spki-list=SPKI
Confirm with the Transport panel above, and cross-check in
DevTools → Network → Protocol column (h3 vs h2).
A page cannot read process CPU. Sample it alongside the run and merge on the run label when plotting:
# desktop client, 1 Hz for the run duration pidstat -u -h -p $(pgrep -d, chrome) 1 120 \ > cpu_PROTO_COND_runN.log # android adb shell top -n 120 -d 1 -o %CPU,ARGS \ | grep -i chrome > cpu_mobile_PROTO_runN.log