Skip to content

fix: Allow Initial CRYPTO retransmission during Handshake PTO#3350

Open
larseggert wants to merge 6 commits intomozilla:mainfrom
larseggert:fix-handshake-pto
Open

fix: Allow Initial CRYPTO retransmission during Handshake PTO#3350
larseggert wants to merge 6 commits intomozilla:mainfrom
larseggert:fix-handshake-pto

Conversation

@larseggert
Copy link
Collaborator

When the client has lost Initial CRYPTO data and PTO fires for Handshake space (primed to prevent deadlocks), the client must still be able to retransmit the lost Initial CRYPTO frames per RFC 9002 Section 6.2.4.

Previously, SendProfile::ack_only() incorrectly returned true for Initial space when PTO was for Handshake space, blocking CRYPTO frame transmission. Additionally, Initial packets were not being marked for retransmission when Handshake PTO fired.

This fix:

  • Simplifies ack_only() to only check congestion window limits, removing the incorrect space-based restriction
  • Marks Initial packets for retransmission in maybe_fire_pto() when Handshake PTO fires, ensuring lost Initial CRYPTO data is resent
  • Removes the redundant SendProfile::pto field, using should_probe() for equivalent assertions in tests
  • Adds unit and integration tests that verify Initial CRYPTO can be retransmitted when Handshake PTO fires
  • Fixes reorder_handshake test flakiness by disabling packet number randomization for deterministic behavior

Bug scenario from QNS L1/C1 test failures:

  1. Client sends ClientHello split across Initial packets
  2. Server receives first packet but second is lost/corrupted
  3. Server ACKs first packet; client detects second as lost
  4. PTO fires for Handshake (primed to prevent deadlocks)
  5. BUG: ack_only(Initial) returned true, blocking CRYPTO retransmission
  6. Client times out waiting for handshake completion

@codspeed-hq
Copy link

codspeed-hq bot commented Jan 23, 2026

Merging this PR will degrade performance by 11.55%

⚡ 1 improved benchmark
❌ 5 regressed benchmarks
✅ 45 untouched benchmarks
⏩ 11 skipped benchmarks1

⚠️ Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
WallTime neqo-s2n 586.4 ms 605.9 ms -3.2%
WallTime s2n-s2n 618.1 ms 654 ms -5.48%
WallTime msquic-msquic 459.2 ms 473.7 ms -3.05%
WallTime quiche-neqo 310 ms 350.5 ms -11.55%
WallTime msquic-neqo 426.5 ms 413.7 ms +3.1%
WallTime walltime/1-streams/each-1000-bytes 1.3 ms 1.4 ms -3.37%

Comparing larseggert:fix-handshake-pto (65f68fc) with main (26711da)

Open in CodSpeed

Footnotes

  1. 11 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@codecov
Copy link

codecov bot commented Jan 23, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 94.14%. Comparing base (4b3cc44) to head (65f68fc).
⚠️ Report is 8 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #3350      +/-   ##
==========================================
- Coverage   94.26%   94.14%   -0.12%     
==========================================
  Files         125      129       +4     
  Lines       37973    38341     +368     
  Branches    37973    38341     +368     
==========================================
+ Hits        35795    36097     +302     
- Misses       1339     1397      +58     
- Partials      839      847       +8     
Flag Coverage Δ
freebsd 93.20% <100.00%> (-0.07%) ⬇️
linux 94.25% <100.00%> (+<0.01%) ⬆️
macos 94.11% <100.00%> (-0.04%) ⬇️
windows 94.24% <100.00%> (+0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Components Coverage Δ
neqo-common 98.49% <ø> (ø)
neqo-crypto 86.90% <ø> (ø)
neqo-http3 93.91% <100.00%> (+0.02%) ⬆️
neqo-qpack 94.79% <100.00%> (ø)
neqo-transport 95.18% <95.23%> (-0.05%) ⬇️
neqo-udp 82.90% <ø> (ø)
mtu 86.61% <ø> (ø)

@larseggert larseggert marked this pull request as ready for review January 23, 2026 14:35
Copilot AI review requested due to automatic review settings January 23, 2026 14:35
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR fixes a critical bug where Initial CRYPTO frames could not be retransmitted when Handshake PTO fires, causing handshake timeouts. The fix simplifies the SendProfile::ack_only() logic and ensures Initial packets are marked for retransmission when Handshake PTO fires.

Changes:

  • Removed the redundant SendProfile::pto field and simplified ack_only() to only check congestion window limits
  • Modified maybe_fire_pto() to mark Initial packets for retransmission when Handshake PTO fires, ensuring lost CRYPTO data is resent
  • Added comprehensive unit and integration tests to verify Initial CRYPTO retransmission during Handshake PTO

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 4 comments.

File Description
neqo-transport/src/recovery/mod.rs Removed SendProfile::pto field, simplified ack_only(), added logic to mark Initial packets for retransmission when Handshake PTO fires, updated tests to use should_probe() instead of pto field
neqo-transport/src/connection/tests/idle.rs Updated test expectations to allow CRYPTO frames in Initial packets during PTO
neqo-transport/src/connection/tests/handshake.rs Fixed reorder_handshake test flakiness with deterministic packet numbers, added new integration test initial_crypto_retransmit_during_handshake_pto
neqo-transport/src/connection/mod.rs Updated call to ack_only() to remove space parameter

When the client has lost Initial CRYPTO data and PTO fires for
Handshake space (primed to prevent deadlocks), the client must still
be able to retransmit the lost Initial CRYPTO frames per RFC 9002
Section 6.2.4.

Previously, `SendProfile::ack_only()` incorrectly returned `true` for
Initial space when PTO was for Handshake space, blocking CRYPTO frame
transmission. Additionally, Initial packets were not being marked for
retransmission when Handshake PTO fired.

This fix:

- Simplifies `ack_only()` to only check congestion window limits,
  removing the incorrect space-based restriction
- Marks Initial packets for retransmission in `maybe_fire_pto()` when
  Handshake PTO fires, ensuring lost Initial CRYPTO data is resent
- Removes the redundant `SendProfile::pto` field, using `should_probe()`
  for equivalent assertions in tests
- Adds unit and integration tests that verify Initial CRYPTO can be
  retransmitted when Handshake PTO fires
- Fixes `reorder_handshake` test flakiness by disabling packet number
  randomization for deterministic behavior

Bug scenario from QNS L1/C1 test failures:
1. Client sends `ClientHello` split across Initial packets
2. Server receives first packet but second is lost/corrupted
3. Server ACKs first packet; client detects second as lost
4. PTO fires for Handshake (primed to prevent deadlocks)
5. BUG: `ack_only(Initial)` returned true, blocking CRYPTO retransmission
6. Client times out waiting for handshake completion
Copy link
Member

@mxinden mxinden left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This makes sense to me. Thanks for the elaborate test. I think we can simplify maybe_fire_pto. What do you think?

@larseggert
Copy link
Collaborator Author

larseggert commented Feb 27, 2026

Claude encountered an error —— View job


I'll analyze this and get back to you.

@github-actions
Copy link
Contributor

Failed Interop Tests

QUIC Interop Runner, client vs. server, differences relative to main at 26711da.

neqo-pr as clientneqo-pr as server
neqo-pr vs. go-x-net: BP BA
neqo-pr vs. haproxy: ⚠️M BP BA
neqo-pr vs. kwik: BP BA
neqo-pr vs. lsquic: run cancelled after 20 min
neqo-pr vs. msquic: A L1 C1
neqo-pr vs. mvfst: A L1 ⚠️C1 BA
neqo-pr vs. neqo: Z
neqo-pr vs. nginx: BP BA
neqo-pr vs. ngtcp2: CM
neqo-pr vs. picoquic: run cancelled after 20 min
neqo-pr vs. quiche: BP BA
neqo-pr vs. s2n-quic: ⚠️BP BA CM
neqo-pr vs. tquic: S ⚠️L1 BP BA
neqo-pr vs. xquic: A L1 C1
aioquic vs. neqo-pr: Z ⚠️C1 CM
go-x-net vs. neqo-pr: CM
kwik vs. neqo-pr: Z BP BA CM
lsquic vs. neqo-pr: Z ⚠️C1
msquic vs. neqo-pr: Z CM
mvfst vs. neqo-pr: Z A L1 C1 CM
neqo vs. neqo-pr: Z
openssl vs. neqo-pr: LR M A CM
picoquic vs. neqo-pr: Z
quic-go vs. neqo-pr: Z 🚀BA ⚠️BP CM
quiche vs. neqo-pr: Z L1 CM
quinn vs. neqo-pr: Z V2 CM
s2n-quic vs. neqo-pr: 🚀B CM
tquic vs. neqo-pr: Z CM
xquic vs. neqo-pr: M CM
All results

Succeeded Interop Tests

QUIC Interop Runner, client vs. server

neqo-pr as client

neqo-pr as server

Unsupported Interop Tests

QUIC Interop Runner, client vs. server

neqo-pr as client

neqo-pr as server

@github-actions
Copy link
Contributor

Benchmark results

No significant performance differences relative to 26711da.

All results
transfer/1-conn/1-100mb-resp (aka. Download)/mtu-1504: Change within noise threshold.
       time:   [199.46 ms 199.84 ms 200.26 ms]
       thrpt:  [499.35 MiB/s 500.40 MiB/s 501.35 MiB/s]
change:
       time:   [-1.2556% -0.8285% -0.4341] (p = 0.00 < 0.05)
       thrpt:  [+0.4360% +0.8354% +1.2715]
       Change within noise threshold.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high severe
transfer/1-conn/10_000-parallel-1b-resp (aka. RPS)/mtu-1504: Change within noise threshold.
       time:   [283.46 ms 285.19 ms 286.94 ms]
       thrpt:  [34.850 Kelem/s 35.064 Kelem/s 35.279 Kelem/s]
change:
       time:   [+0.6331% +1.6121% +2.5102] (p = 0.00 < 0.05)
       thrpt:  [-2.4487% -1.5866% -0.6291]
       Change within noise threshold.
transfer/1-conn/1-1b-resp (aka. HPS)/mtu-1504: No change in performance detected.
       time:   [38.636 ms 38.796 ms 38.978 ms]
       thrpt:  [25.656   B/s 25.776   B/s 25.883   B/s]
change:
       time:   [-0.7333% -0.0675% +0.5512] (p = 0.84 > 0.05)
       thrpt:  [-0.5482% +0.0676% +0.7388]
       No change in performance detected.
Found 6 outliers among 100 measurements (6.00%)
1 (1.00%) high mild
5 (5.00%) high severe
transfer/1-conn/1-100mb-req (aka. Upload)/mtu-1504: Change within noise threshold.
       time:   [201.74 ms 202.09 ms 202.48 ms]
       thrpt:  [493.88 MiB/s 494.84 MiB/s 495.68 MiB/s]
change:
       time:   [-1.5459% -1.2487% -0.9809] (p = 0.00 < 0.05)
       thrpt:  [+0.9906% +1.2645% +1.5702]
       Change within noise threshold.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high severe
decode 4096 bytes, mask ff: No change in performance detected.
       time:   [4.5112 µs 4.5283 µs 4.5536 µs]
       change: [-0.4534% -0.0775% +0.2904] (p = 0.70 > 0.05)
       No change in performance detected.
Found 6 outliers among 100 measurements (6.00%)
4 (4.00%) high mild
2 (2.00%) high severe
decode 1048576 bytes, mask ff: No change in performance detected.
       time:   [1.1568 ms 1.1584 ms 1.1601 ms]
       change: [-2.0270% -0.9085% -0.0613] (p = 0.07 > 0.05)
       No change in performance detected.
Found 13 outliers among 100 measurements (13.00%)
10 (10.00%) low severe
1 (1.00%) high mild
2 (2.00%) high severe
decode 4096 bytes, mask 7f: No change in performance detected.
       time:   [5.7943 µs 5.8176 µs 5.8569 µs]
       change: [-0.0678% +0.3857% +1.0411] (p = 0.15 > 0.05)
       No change in performance detected.
Found 7 outliers among 100 measurements (7.00%)
3 (3.00%) high mild
4 (4.00%) high severe
decode 1048576 bytes, mask 7f: No change in performance detected.
       time:   [1.4868 ms 1.4894 ms 1.4924 ms]
       change: [-0.1515% +0.1052% +0.3412] (p = 0.41 > 0.05)
       No change in performance detected.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
decode 4096 bytes, mask 3f: No change in performance detected.
       time:   [5.5369 µs 5.5461 µs 5.5566 µs]
       change: [-0.2015% +0.1292% +0.4803] (p = 0.47 > 0.05)
       No change in performance detected.
Found 5 outliers among 100 measurements (5.00%)
2 (2.00%) high mild
3 (3.00%) high severe
decode 1048576 bytes, mask 3f: No change in performance detected.
       time:   [1.4139 ms 1.4160 ms 1.4181 ms]
       change: [-0.8344% -0.2784% +0.1078] (p = 0.29 > 0.05)
       No change in performance detected.
streams/simulated/1-streams/each-1000-bytes: No change in performance detected.
       time:   [129.68 ms 129.68 ms 129.68 ms]
       thrpt:  [7.5303 KiB/s 7.5305 KiB/s 7.5307 KiB/s]
change:
       time:   [-0.0053% -0.0014% +0.0025] (p = 0.49 > 0.05)
       thrpt:  [-0.0025% +0.0014% +0.0053]
       No change in performance detected.
streams/simulated/1000-streams/each-1-bytes: No change in performance detected.
       time:   [2.5362 s 2.5366 s 2.5369 s]
       thrpt:  [394.18   B/s 394.23   B/s 394.28   B/s]
change:
       time:   [-0.0258% -0.0081% +0.0090] (p = 0.37 > 0.05)
       thrpt:  [-0.0090% +0.0081% +0.0258]
       No change in performance detected.
Found 7 outliers among 100 measurements (7.00%)
7 (7.00%) high mild
streams/simulated/1000-streams/each-1000-bytes: No change in performance detected.
       time:   [6.5913 s 6.6033 s 6.6171 s]
       thrpt:  [147.58 KiB/s 147.89 KiB/s 148.16 KiB/s]
change:
       time:   [-0.1644% +0.0753% +0.3354] (p = 0.56 > 0.05)
       thrpt:  [-0.3343% -0.0753% +0.1646]
       No change in performance detected.
Found 9 outliers among 100 measurements (9.00%)
1 (1.00%) high mild
8 (8.00%) high severe
streams/walltime/1-streams/each-1000-bytes: Change within noise threshold.
       time:   [584.03 µs 586.09 µs 588.49 µs]
       change: [-1.3723% -0.8418% -0.2801] (p = 0.00 < 0.05)
       Change within noise threshold.
Found 8 outliers among 100 measurements (8.00%)
8 (8.00%) high severe
streams/walltime/1000-streams/each-1-bytes: Change within noise threshold.
       time:   [12.384 ms 12.402 ms 12.421 ms]
       change: [-1.1874% -0.9710% -0.7512] (p = 0.00 < 0.05)
       Change within noise threshold.
streams/walltime/1000-streams/each-1000-bytes: No change in performance detected.
       time:   [45.298 ms 45.366 ms 45.443 ms]
       change: [-0.5041% -0.1658% +0.1036] (p = 0.32 > 0.05)
       No change in performance detected.
Found 5 outliers among 100 measurements (5.00%)
2 (2.00%) high mild
3 (3.00%) high severe
coalesce_acked_from_zero 1+1 entries: No change in performance detected.
       time:   [92.012 ns 92.322 ns 92.633 ns]
       change: [-0.2251% +0.3388% +0.9621] (p = 0.33 > 0.05)
       No change in performance detected.
Found 11 outliers among 100 measurements (11.00%)
9 (9.00%) high mild
2 (2.00%) high severe
coalesce_acked_from_zero 3+1 entries: No change in performance detected.
       time:   [109.90 ns 110.22 ns 110.56 ns]
       change: [-0.6092% -0.0702% +0.4087] (p = 0.80 > 0.05)
       No change in performance detected.
Found 12 outliers among 100 measurements (12.00%)
1 (1.00%) low mild
11 (11.00%) high severe
coalesce_acked_from_zero 10+1 entries: No change in performance detected.
       time:   [109.27 ns 109.65 ns 110.12 ns]
       change: [-0.1132% +0.4533% +1.1606] (p = 0.17 > 0.05)
       No change in performance detected.
Found 20 outliers among 100 measurements (20.00%)
6 (6.00%) low severe
2 (2.00%) low mild
2 (2.00%) high mild
10 (10.00%) high severe
coalesce_acked_from_zero 1000+1 entries: No change in performance detected.
       time:   [94.468 ns 94.629 ns 94.820 ns]
       change: [-1.3011% -0.4667% +0.2635] (p = 0.26 > 0.05)
       No change in performance detected.
Found 18 outliers among 100 measurements (18.00%)
8 (8.00%) high mild
10 (10.00%) high severe
RxStreamOrderer::inbound_frame(): Change within noise threshold.
       time:   [109.21 ms 109.38 ms 109.66 ms]
       change: [+0.7462% +0.9274% +1.2044] (p = 0.00 < 0.05)
       Change within noise threshold.
Found 23 outliers among 100 measurements (23.00%)
2 (2.00%) low severe
9 (9.00%) low mild
7 (7.00%) high mild
5 (5.00%) high severe
sent::Packets::take_ranges: No change in performance detected.
       time:   [4.4358 µs 4.5327 µs 4.6307 µs]
       change: [-4.4984% -1.3848% +1.6944] (p = 0.40 > 0.05)
       No change in performance detected.
Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high mild
transfer/simulated/pacing-false/varying-seeds: No change in performance detected.
       time:   [23.941 s 23.941 s 23.941 s]
       thrpt:  [171.09 KiB/s 171.09 KiB/s 171.09 KiB/s]
change:
       time:   [+0.0000% +0.0000% +0.0000] (p = NaN > 0.05)
       thrpt:  [+0.0000% +0.0000% +0.0000]
       No change in performance detected.
transfer/simulated/pacing-true/varying-seeds: No change in performance detected.
       time:   [23.676 s 23.676 s 23.676 s]
       thrpt:  [173.01 KiB/s 173.01 KiB/s 173.01 KiB/s]
change:
       time:   [+0.0000% +0.0000% +0.0000] (p = NaN > 0.05)
       thrpt:  [+0.0000% +0.0000% +0.0000]
       No change in performance detected.
transfer/simulated/pacing-false/same-seed: No change in performance detected.
       time:   [23.941 s 23.941 s 23.941 s]
       thrpt:  [171.09 KiB/s 171.09 KiB/s 171.09 KiB/s]
change:
       time:   [+0.0000% +0.0000% +0.0000] (p = NaN > 0.05)
       thrpt:  [+0.0000% +0.0000% +0.0000]
       No change in performance detected.
transfer/simulated/pacing-true/same-seed: No change in performance detected.
       time:   [23.676 s 23.676 s 23.676 s]
       thrpt:  [173.01 KiB/s 173.01 KiB/s 173.01 KiB/s]
change:
       time:   [+0.0000% +0.0000% +0.0000] (p = NaN > 0.05)
       thrpt:  [+0.0000% +0.0000% +0.0000]
       No change in performance detected.
transfer/walltime/pacing-false/varying-seeds: Change within noise threshold.
       time:   [22.790 ms 22.818 ms 22.860 ms]
       change: [-1.4655% -1.2081% -0.9679] (p = 0.00 < 0.05)
       Change within noise threshold.
Found 3 outliers among 100 measurements (3.00%)
1 (1.00%) high mild
2 (2.00%) high severe
transfer/walltime/pacing-true/varying-seeds: No change in performance detected.
       time:   [23.175 ms 23.203 ms 23.244 ms]
       change: [-0.0431% +0.1909% +0.4273] (p = 0.10 > 0.05)
       No change in performance detected.
Found 7 outliers among 100 measurements (7.00%)
1 (1.00%) low mild
4 (4.00%) high mild
2 (2.00%) high severe
transfer/walltime/pacing-false/same-seed: Change within noise threshold.
       time:   [23.072 ms 23.101 ms 23.147 ms]
       change: [+0.2829% +0.5386% +0.7825] (p = 0.00 < 0.05)
       Change within noise threshold.
Found 6 outliers among 100 measurements (6.00%)
1 (1.00%) low mild
4 (4.00%) high mild
1 (1.00%) high severe
transfer/walltime/pacing-true/same-seed: Change within noise threshold.
       time:   [23.551 ms 23.577 ms 23.616 ms]
       change: [+0.5279% +0.7007% +0.9249] (p = 0.00 < 0.05)
       Change within noise threshold.
Found 4 outliers among 100 measurements (4.00%)
1 (1.00%) low mild
2 (2.00%) high mild
1 (1.00%) high severe

Download data for profiler.firefox.com or download performance comparison data.

@github-actions
Copy link
Contributor

Client/server transfer results

Performance differences relative to 26711da.

Transfer of 33554432 bytes over loopback, min. 100 runs. All unit-less numbers are in milliseconds.

Client vs. server (params) Mean ± σ Min Max MiB/s ± σ Δ main Δ main
neqo-google-cubic 754.0 ± 4.6 747.0 768.6 42.4 ± 7.0 💚 -1.6 -0.2%
neqo-neqo-cubic 96.2 ± 4.4 88.7 105.6 332.6 ± 7.3 💚 -2.8 -2.8%
neqo-neqo-cubic-nopacing 93.7 ± 3.6 89.3 103.1 341.6 ± 8.9 💚 -3.0 -3.1%
neqo-neqo-newreno-nopacing 94.8 ± 4.1 88.1 105.2 337.4 ± 7.8 💚 -1.7 -1.7%
neqo-quiche-cubic 192.6 ± 5.0 184.5 203.0 166.2 ± 6.4 💔 2.4 1.3%
neqo-s2n-cubic 221.0 ± 4.4 210.7 228.7 144.8 ± 7.3 💔 3.4 1.6%
quiche-neqo-cubic 153.0 ± 5.1 139.8 164.7 209.1 ± 6.3 💔 2.1 1.4%

Table above only shows statistically significant changes. See all results below.

All results

Transfer of 33554432 bytes over loopback, min. 100 runs. All unit-less numbers are in milliseconds.

Client vs. server (params) Mean ± σ Min Max MiB/s ± σ Δ main Δ main
google-google-nopacing 456.0 ± 4.4 449.3 466.0 70.2 ± 7.3
google-neqo-cubic 273.4 ± 4.4 266.6 284.3 117.1 ± 7.3 -0.9 -0.3%
msquic-msquic-nopacing 184.6 ± 58.9 137.7 413.1 173.4 ± 0.5
msquic-neqo-cubic 208.5 ± 62.8 156.7 414.2 153.5 ± 0.5 6.2 3.1%
neqo-google-cubic 754.0 ± 4.6 747.0 768.6 42.4 ± 7.0 💚 -1.6 -0.2%
neqo-msquic-cubic 159.0 ± 4.5 151.8 170.1 201.3 ± 7.1 -0.6 -0.3%
neqo-neqo-cubic 96.2 ± 4.4 88.7 105.6 332.6 ± 7.3 💚 -2.8 -2.8%
neqo-neqo-cubic-nopacing 93.7 ± 3.6 89.3 103.1 341.6 ± 8.9 💚 -3.0 -3.1%
neqo-neqo-newreno 97.3 ± 4.5 89.7 107.1 328.8 ± 7.1 -0.9 -0.9%
neqo-neqo-newreno-nopacing 94.8 ± 4.1 88.1 105.2 337.4 ± 7.8 💚 -1.7 -1.7%
neqo-quiche-cubic 192.6 ± 5.0 184.5 203.0 166.2 ± 6.4 💔 2.4 1.3%
neqo-s2n-cubic 221.0 ± 4.4 210.7 228.7 144.8 ± 7.3 💔 3.4 1.6%
quiche-neqo-cubic 153.0 ± 5.1 139.8 164.7 209.1 ± 6.3 💔 2.1 1.4%
quiche-quiche-nopacing 143.1 ± 3.9 136.4 152.1 223.6 ± 8.2
s2n-neqo-cubic 174.2 ± 4.9 164.9 187.2 183.7 ± 6.5 0.9 0.5%
s2n-s2n-nopacing 243.3 ± 15.4 233.0 348.7 131.5 ± 2.1

Download data for profiler.firefox.com or download performance comparison data.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants