Skip to content

Compatibility issues with quic-go server #2108

@nathanejohnson

Description

@nathanejohnson

I've been seeing issues connecting to a quic-go server from a quiche based client. This works fine with 0.22.0 based quiche, but no newer published versions will work properly. This commit seems to be the culprit:

b17904e

Below are some trace logs. Initial connection works, handshake succeeds, but then sometime later I get a CryptoFail error from quiche::send_on_path method.

[TRACE mio::poll] registering event source with poller: token=Token(0), interests=READABLE
[TRACE quiche::tls] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 write message lvl=Initial len=261
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx pkt Initial version=1 dcid=286c9160ef2b9748421b2723d2df60fd scid=ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 len=265 pn=0 
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx frm CRYPTO off=0 len=261
[TRACE quiche::recovery::congestion::recovery] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 timer=998.941208ms latest_rtt=0ns srtt=333ms min_rtt=333ms rttvar=166.5ms cwnd=13500 ssthresh=18446744073709551615 bytes_in_flight=328 app_limited=true congestion_recovery_start_time=None Rate { delivered: 0, delivered_time: Instant { tv_sec: 220838, tv_nsec: 587762083 }, first_sent_time: Instant { tv_sec: 220838, tv_nsec: 587762083 }, end_of_app_limited: 1, last_sent_packet: 0, largest_acked: 0, rate_sample: RateSample { bandwidth: 0.00 Kbps, is_app_limited: false, interval: 0ns, delivered: 0, prior_delivered: 0, prior_time: None, send_elapsed: 0ns, ack_elapsed: 0ns, rtt: 0ns } } pacer=Pacer { enabled: true, capacity: 13500, used: 0, rate: 0, last_update: Instant { tv_sec: 220838, tv_nsec: 587762083 }, next_time: Instant { tv_sec: 220838, tv_nsec: 587762083 }, max_datagram_size: 1350, last_packet_size: None, iv: 0ns, max_pacing_rate: None } hystart=window_end=Some(0) last_round_min_rtt=18446744073709551615.999999999s current_round_min_rtt=18446744073709551615.999999999s css_baseline_min_rtt=18446744073709551615.999999999s rtt_sample_count=0 css_start_time=None css_round_count=0 cubic={ k=0 w_max=0 } 
[TRACE quiche_test::connectiontest] written 1200
[DEBUG quiche_test::connectiontest] polling
[DEBUG quiche_test::connectiontest] normal socket selected
[DEBUG quiche_test::connectiontest] read 1280 bytes
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 rx pkt Initial version=1 dcid=ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 scid=30fe429d token= len=117 pn=0 
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 rx frm ACK delay=0 blocks=[0..0] ecn_counts=None
[TRACE quiche::recovery::congestion::recovery] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 packet newly acked 0
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 rx frm CRYPTO off=0 len=90
[TRACE quiche::tls] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 set write secret lvl=Handshake
[TRACE quiche::tls] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 set read secret lvl=Handshake
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 rx pkt Handshake version=1 dcid=ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 scid=30fe429d len=1096 pn=0 
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 rx frm CRYPTO off=0 len=1074
[TRACE quiche_test::connectiontest] read 0.0.0.0:54372: processed 1280 bytes
[DEBUG quiche_test::connectiontest] read 1280 bytes
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 rx pkt Handshake version=1 dcid=ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 scid=30fe429d len=1247 pn=1 
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 rx frm CRYPTO off=1074 len=1224
[TRACE quiche_test::connectiontest] read 0.0.0.0:54372: processed 1280 bytes
[DEBUG quiche_test::connectiontest] read 133 bytes
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 rx pkt Handshake version=1 dcid=ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 scid=30fe429d len=37 pn=2 
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 rx frm CRYPTO off=2298 len=15
[TRACE quiche::tls] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 write message lvl=Handshake len=36
[TRACE quiche::tls] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 set write secret lvl=OneRTT
[TRACE quiche::tls] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 set read secret lvl=OneRTT
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 connection established: proto=Ok("h3") cipher=Some(AES128_GCM) curve=Some("X25519") sigalg=Some("ecdsa_secp256r1_sha256") resumed=false TransportParams { original_destination_connection_id: Some(286c9160ef2b9748421b2723d2df60fd), max_idle_timeout: 30000, stateless_reset_token: Some(322861833387078862669263359729604088135), max_udp_payload_size: 1452, initial_max_data: 786432, initial_max_stream_data_bidi_local: 524288, initial_max_stream_data_bidi_remote: 524288, initial_max_stream_data_uni: 524288, initial_max_streams_bidi: 100, initial_max_streams_uni: 100, ack_delay_exponent: 3, max_ack_delay: 26, disable_active_migration: false, active_conn_id_limit: 4, initial_source_connection_id: Some(30fe429d), retry_source_connection_id: None, max_datagram_frame_size: Some(16383), unknown_params: None }
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 rx pkt Short dcid=ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 key_phase=false len=42 pn=0 
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 rx frm NEW_CONNECTION_ID seq_num=1 retire_prior_to=0 conn_id=[58, 20, 56, a4] reset_token=[20, 4c, 72, be, 7d, 28, 18, 29, ed, 62, 94, ad, 5b, 44, 8f, de]
[TRACE quiche_test::connectiontest] read 0.0.0.0:54372: processed 133 bytes
[DEBUG quiche_test::connectiontest] read 53 bytes
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 rx pkt Short dcid=ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 key_phase=false len=32 pn=1 
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 rx frm STREAM id=3 off=0 len=12 fin=false
[TRACE quiche_test::connectiontest] read 0.0.0.0:54372: processed 53 bytes
[TRACE quiche_test::connectiontest] 0.0.0.0:54372: recv() would block
[TRACE quiche_test::connectiontest] done reading
[TRACE quiche::h3] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx frm SETTINGS stream=2 len=18
[TRACE quiche::h3] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 open GREASE stream 14
[DEBUG quiche_test::connectiontest] in send_http3_request()
[DEBUG quiche_test::connectiontest] Sent HTTP request [":method: POST", ":scheme: https", ":authority: localtest.localhost:8080", ":path: /test", "user-agent: test", "transfer-method: chunked", "chunk-size: 80000", "chunk-count: 40", "content-length: 3200000"]
[TRACE quiche::h3] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx frm GREASE stream=0 len=0
[TRACE quiche::h3] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx frm GREASE stream=0 len=18
[TRACE quiche::h3] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx frm HEADERS stream=0 len=111 fin=false
[DEBUG quiche_test::connectiontest] write called
[TRACE quiche::h3] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx frm DATA stream=0 len=13298 fin=false
[DEBUG quiche_test::connectiontest] write returning, written: 13298 finsihed: false total bytes_sent: 13298
[DEBUG quiche_test::connectiontest] in read_http3_response
[TRACE quiche::h3] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 stream id 3 is readable
[TRACE quiche::h3::stream] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 read 1 bytes on stream 3
[TRACE quiche::h3] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 open peer's control stream 3
[TRACE quiche::h3::stream] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 read 1 bytes on stream 3
[TRACE quiche::h3::stream] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 read 1 bytes on stream 3
[TRACE quiche::h3::stream] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 read 9 bytes on stream 3
[TRACE quiche::h3] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 rx frm SETTINGS max_field_section=None, qpack_max_table=None, qpack_blocked=None raw=Some([(51, 1), (8, 1), (727725890, 1)]), additional_settings=Some([(727725890, 1)]) stream=3 payload_len=9
[DEBUG quiche_test::connectiontest] about to handle events
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx pkt Initial version=1 dcid=30fe429d scid=ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 len=6 pn=1 
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx frm ACK delay=172 blocks=[0..0] ecn_counts=None
[TRACE quiche::recovery::congestion::recovery] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 timer=337.956µs latest_rtt=575.875µs srtt=575.875µs min_rtt=575.875µs rttvar=287.937µs cwnd=13500 ssthresh=18446744073709551615 bytes_in_flight=0 app_limited=true congestion_recovery_start_time=None Rate { delivered: 328, delivered_time: Instant { tv_sec: 220838, tv_nsec: 589717458 }, first_sent_time: Instant { tv_sec: 220838, tv_nsec: 589717458 }, end_of_app_limited: 1, last_sent_packet: 1, largest_acked: 0, rate_sample: RateSample { bandwidth: 4.56 Mbps, is_app_limited: true, interval: 575.875µs, delivered: 328, prior_delivered: 0, prior_time: Some(Instant { tv_sec: 220838, tv_nsec: 587762083 }), send_elapsed: 0ns, ack_elapsed: 575.875µs, rtt: 575.875µs } } pacer=Pacer { enabled: true, capacity: 13500, used: 0, rate: 29303234, last_update: Instant { tv_sec: 220838, tv_nsec: 589717458 }, next_time: Instant { tv_sec: 220838, tv_nsec: 589717458 }, max_datagram_size: 1350, last_packet_size: Some(0), iv: 0ns, max_pacing_rate: None } hystart=window_end=Some(0) last_round_min_rtt=18446744073709551615.999999999s current_round_min_rtt=18446744073709551615.999999999s css_baseline_min_rtt=18446744073709551615.999999999s rtt_sample_count=0 css_start_time=None css_round_count=0 cubic={ k=0 w_max=0 } 
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx pkt Handshake version=1 dcid=30fe429d scid=ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 len=45 pn=2 
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx frm ACK delay=62 blocks=[0..2] ecn_counts=None
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx frm CRYPTO off=0 len=36
[TRACE quiche::recovery::congestion::recovery] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 timer=1.692873ms latest_rtt=575.875µs srtt=575.875µs min_rtt=575.875µs rttvar=287.937µs cwnd=13500 ssthresh=18446744073709551615 bytes_in_flight=95 app_limited=true congestion_recovery_start_time=None Rate { delivered: 328, delivered_time: Instant { tv_sec: 220838, tv_nsec: 589717458 }, first_sent_time: Instant { tv_sec: 220838, tv_nsec: 589717458 }, end_of_app_limited: 1, last_sent_packet: 2, largest_acked: 0, rate_sample: RateSample { bandwidth: 4.56 Mbps, is_app_limited: true, interval: 575.875µs, delivered: 328, prior_delivered: 0, prior_time: Some(Instant { tv_sec: 220838, tv_nsec: 587762083 }), send_elapsed: 0ns, ack_elapsed: 575.875µs, rtt: 575.875µs } } pacer=Pacer { enabled: true, capacity: 13500, used: 0, rate: 29303234, last_update: Instant { tv_sec: 220838, tv_nsec: 589717458 }, next_time: Instant { tv_sec: 220838, tv_nsec: 589717458 }, max_datagram_size: 1350, last_packet_size: None, iv: 3.242µs, max_pacing_rate: None } hystart=window_end=Some(0) last_round_min_rtt=18446744073709551615.999999999s current_round_min_rtt=18446744073709551615.999999999s css_baseline_min_rtt=18446744073709551615.999999999s rtt_sample_count=0 css_start_time=None css_round_count=0 cubic={ k=0 w_max=0 } 
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 dropped epoch 0 state
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx pkt Short dcid=30fe429d key_phase=false len=1176 pn=3 
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx frm ACK delay=57 blocks=[0..1] ecn_counts=None
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx frm NEW_CONNECTION_ID seq_num=1 retire_prior_to=0 conn_id=[5e, 6e, 0a, 47, 42, 66, 5d, fd, c6, 57, ef, c9, dd, 09, 55, 70, c0, 20, 6f, cc] reset_token=[15, 25, fb, 86, 07, 03, 51, b1, 0f, fe, da, 72, 2b, 8b, 92, f1]
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx frm STREAM id=2 off=0 len=19 fin=false
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx frm PADDING len=1107
[TRACE quiche::recovery::congestion::recovery] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 timer=1.65304ms latest_rtt=575.875µs srtt=575.875µs min_rtt=575.875µs rttvar=287.937µs cwnd=13500 ssthresh=18446744073709551615 bytes_in_flight=1293 app_limited=true congestion_recovery_start_time=None Rate { delivered: 328, delivered_time: Instant { tv_sec: 220838, tv_nsec: 589717458 }, first_sent_time: Instant { tv_sec: 220838, tv_nsec: 589717458 }, end_of_app_limited: 1, last_sent_packet: 3, largest_acked: 0, rate_sample: RateSample { bandwidth: 4.56 Mbps, is_app_limited: true, interval: 575.875µs, delivered: 328, prior_delivered: 0, prior_time: Some(Instant { tv_sec: 220838, tv_nsec: 587762083 }), send_elapsed: 0ns, ack_elapsed: 575.875µs, rtt: 575.875µs } } pacer=Pacer { enabled: true, capacity: 13500, used: 1198, rate: 29303234, last_update: Instant { tv_sec: 220838, tv_nsec: 589717458 }, next_time: Instant { tv_sec: 220838, tv_nsec: 589720700 }, max_datagram_size: 1350, last_packet_size: Some(1198), iv: 0ns, max_pacing_rate: None } hystart=window_end=Some(0) last_round_min_rtt=18446744073709551615.999999999s current_round_min_rtt=18446744073709551615.999999999s css_baseline_min_rtt=18446744073709551615.999999999s rtt_sample_count=0 css_start_time=None css_round_count=0 cubic={ k=0 w_max=0 } 
[DEBUG quiche_test::connectiontest] pulled 1350 bytes from conn, about to send to socket
[DEBUG quiche_test::connectiontest] written 1350
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx pkt Short dcid=30fe429d key_phase=false len=6 pn=4 
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx frm STREAM id=6 off=0 len=1 fin=false
[TRACE quiche::recovery::congestion::recovery] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 timer=1.612498ms latest_rtt=575.875µs srtt=575.875µs min_rtt=575.875µs rttvar=287.937µs cwnd=13500 ssthresh=18446744073709551615 bytes_in_flight=1321 app_limited=true congestion_recovery_start_time=None Rate { delivered: 328, delivered_time: Instant { tv_sec: 220838, tv_nsec: 589717458 }, first_sent_time: Instant { tv_sec: 220838, tv_nsec: 589717458 }, end_of_app_limited: 1, last_sent_packet: 4, largest_acked: 0, rate_sample: RateSample { bandwidth: 4.56 Mbps, is_app_limited: true, interval: 575.875µs, delivered: 328, prior_delivered: 0, prior_time: Some(Instant { tv_sec: 220838, tv_nsec: 587762083 }), send_elapsed: 0ns, ack_elapsed: 575.875µs, rtt: 575.875µs } } pacer=Pacer { enabled: true, capacity: 13500, used: 0, rate: 29303234, last_update: Instant { tv_sec: 220838, tv_nsec: 589825833 }, next_time: Instant { tv_sec: 220838, tv_nsec: 589720700 }, max_datagram_size: 1350, last_packet_size: None, iv: 41.838µs, max_pacing_rate: None } hystart=window_end=Some(0) last_round_min_rtt=18446744073709551615.999999999s current_round_min_rtt=18446744073709551615.999999999s css_baseline_min_rtt=18446744073709551615.999999999s rtt_sample_count=0 css_start_time=None css_round_count=0 cubic={ k=0 w_max=0 } 
[DEBUG quiche_test::connectiontest] pulled 28 bytes from conn, about to send to socket
[DEBUG quiche_test::connectiontest] written 28
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx pkt Short dcid=30fe429d key_phase=false len=6 pn=5 
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx frm STREAM id=10 off=0 len=1 fin=false
[ERROR quiche_test::connectiontest] send failed: CryptoFail
[DEBUG quiche_test::connectiontest] polling
[DEBUG quiche_test::connectiontest] normal socket selected
[DEBUG quiche_test::connectiontest] read 317 bytes
[TRACE quiche_test::connectiontest] read 0.0.0.0:54372: processed 317 bytes
[TRACE quiche_test::connectiontest] 0.0.0.0:54372: recv() would block
[TRACE quiche_test::connectiontest] done reading
[DEBUG quiche_test::connectiontest] write called
[DEBUG quiche_test::connectiontest] write() Err::Done
[DEBUG quiche_test::connectiontest] write returning, written: 0 finsihed: false total bytes_sent: 13298
[DEBUG quiche_test::connectiontest] in read_http3_response
[DEBUG quiche_test::connectiontest] about to handle events
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx pkt Handshake version=1 dcid=30fe429d scid=ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 len=8 pn=5 
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 tx frm CONNECTION_CLOSE err=1 frame=0 reason=[66, 61, 69, 6c]
[TRACE quiche::recovery::congestion::recovery] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 timer=1.717623ms latest_rtt=575.875µs srtt=575.875µs min_rtt=575.875µs rttvar=287.937µs cwnd=13500 ssthresh=18446744073709551615 bytes_in_flight=1379 app_limited=true congestion_recovery_start_time=None Rate { delivered: 328, delivered_time: Instant { tv_sec: 220838, tv_nsec: 589717458 }, first_sent_time: Instant { tv_sec: 220838, tv_nsec: 589717458 }, end_of_app_limited: 1, last_sent_packet: 5, largest_acked: 0, rate_sample: RateSample { bandwidth: 4.56 Mbps, is_app_limited: true, interval: 575.875µs, delivered: 328, prior_delivered: 0, prior_time: Some(Instant { tv_sec: 220838, tv_nsec: 587762083 }), send_elapsed: 0ns, ack_elapsed: 575.875µs, rtt: 575.875µs } } pacer=Pacer { enabled: true, capacity: 13500, used: 58, rate: 29303234, last_update: Instant { tv_sec: 220838, tv_nsec: 589825833 }, next_time: Instant { tv_sec: 220838, tv_nsec: 590073379 }, max_datagram_size: 1350, last_packet_size: Some(58), iv: 0ns, max_pacing_rate: None } hystart=window_end=Some(0) last_round_min_rtt=18446744073709551615.999999999s current_round_min_rtt=18446744073709551615.999999999s css_baseline_min_rtt=18446744073709551615.999999999s rtt_sample_count=0 css_start_time=None css_round_count=0 cubic={ k=0 w_max=0 } 
[DEBUG quiche_test::connectiontest] pulled 58 bytes from conn, about to send to socket
[DEBUG quiche_test::connectiontest] written 58
[DEBUG quiche_test::connectiontest] done writing
[DEBUG quiche_test::connectiontest] polling
[TRACE quiche_test::connectiontest] timed out
[TRACE quiche] ccc6ccf2d1124ff11c5bebe6075e027a395e32a1 draining timeout expired
[TRACE quiche_test::connectiontest] done reading
[INFO  quiche_test::connectiontest] connection closed, recv=6 sent=6 lost=0 retrans=0 sent_bytes=1764 recv_bytes=2746 lost_bytes=0 [local_addr=0.0.0.0:54372 peer_addr=127.0.0.1:8080 validation_state=Validated active=true recv=6 sent=6 lost=0 retrans=0 rtt=575.875µs min_rtt=Some(575.875µs) rttvar=287.937µs cwnd=13500 sent_bytes=1764 recv_bytes=2746 lost_bytes=0 stream_retrans_bytes=0 pmtu=1350 delivery_rate=569568]
failed to communicate with upstream

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions