Hi All,

As H3 in libcurl is going steadily to the production feature, I would like to 
tell about one H3/QUIC issue, which was OK for the experimental stage, but 
probably needs to be addressed to make H3 a full production feature.

When I was comparing H3/QUIC with the H1/H2 TCP in my local network setup, I 
noticed that H3 download speed was unexpectedly much slower compared to H1/H2.
After looking into the issue, I figured out that UDP socket options setting 
socket receive buffer (1MB in my case) didn't affect QUIC performance for H3 as 
they did for TCP used by H1/H2 because QUIC protocol is implemented in user 
space (by ngtcp2 and other QUIC backends) vs TCP in kernel,
and its flow-control options are not affected by UDP socket receive buffer size.

On the other hand, for TCP, socket receive buffer size also specifies 
flow-control option, like max TCP window size (which allows to reach better 
download speeds for large downloads when it is increased).

So, QUIC as user-space transport layer, requires its own receive buffering and 
flow-control setup (similar to TCP receive buffer) in order to match TCP 
buffering/flow-control capabilities provided by socket options.
(I found an interesting discussion about this subject: 
https://github.com/ngtcp2/nghttp3/issues/20)

Because libcurl controls H3 QUIC flow-control options via CURLOPT_BUFFERSIZE 
option, I was able to reach for H3 the same speed as for H1/H2 with 1MB socket 
receive buffer size
by doing the following steps:

- Increased CURL_MAX_READ_SIZE to 1MB (required libcurl re-build)
- set CURLOPT_BUFFERSIZE option to 1MB for H3 transfers.

Obviously, such steps are not for production use, and "production ready" H3 
feature should provide a better and easier way to optimize H3 buffer/flow 
control settings for client apps.

So, I suggest to provide a new "QUIC" option (similar to the "TCP" options that 
we already have):
CURLOPT_QUIC_BUFFERSIZE
which will do similar steps that I did but in just one option setting call and 
without the need to modify libcurl for each desired buffer size.

Thanks,
Dmitry  Karpov
-- 
Unsubscribe: https://lists.haxx.se/listinfo/curl-library
Etiquette:   https://curl.se/mail/etiquette.html

Reply via email to