This release enables GSO (Generic Segmentation Offload) in the send path, drastically increasing the packet send rate. Without GSO, quic-go had to use a single (sendmsg) syscall for every UDP datagram sent. GSO allows us to pass one giant (up to 64k) datagram to the sendmsg syscall, and have the kernel chop it into MTU sized (~1300 bytes) datagrams before sending them out on the wire. For more details on syscall optimizations, CloudFlare published an excellent blog post about this a while ago. GSO is currently only available on Linux (and with kernels >4.18).
Users who are using the same net.PacketConn for QUIC and to send out non-QUIC packets now need to call the newly introduced OptimizeConn function before passing the connection to the Transport. Otherwise, calls to WriteTo will fail after GSO support was enabled. Users who are not using the same net.PacketConn in this way don't need to change anything.
We also continued our effort to further reduce allocations during data transfers (#3526). Work on improving performance even further will continue in future releases.
Other Notable Changes
http3: The server now returns http.ErrServerClosed instead of quic.ErrServerClosed (#3900)
quic-go now correctly deals with super-short idle timeouts (#3909)
uint62 overflows are now correctly handled in the Config (#3866)
only run DPLPMTUD (RFC 8899) on connections that support setting the DF bit (#3879)
switch to the packet number length derivation logic described in the RFC (#3885)
fix panics when closing an uninitialized Transport (#3908)
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Bumps github.com/quic-go/quic-go from 0.35.1 to 0.36.0.
Release notes
Sourced from github.com/quic-go/quic-go's releases.
... (truncated)
Commits
da298d0
docs: improve documentation of OptimizeConn (#3910)8352e5d
check for uninitialized fields when closing the Transport (#3908)9acce3c
http3: return http.ErrServerClosed instead of quic.ErrServerClosed (#3900)e4fe289
docs: add detailed description of the quic package (#3902)28d5106
wire: switch to crypto/rand for greased transport parameter generation (#3904)f57f876
respect minimum idle timeout of 3 PTOs (#3909)85764da
docs: improve doc comments for the ConnectionState fields (#3901)30527c5
frame fuzzer: handle frames one by one (#3884)c52b583
Merge pull request #3889 from quic-go/ackhandler-unexport-packete45c460
ackhandler: don't allocate a packet struct for non-ack-eliciting packetsDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase
.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)