Skip to content

quic go and Go versions

Marten Seemann edited this page Mar 14, 2024 · 4 revisions

This article describes the situation before the v0.37.0 release. It DOES NOT apply to releases after this.

Current quic-go releases build with the most recent two versions of the Go compiler, and most importantly, are forwards-compatible. This means from v0.37.0 onwards, you can build any release with any new version of the Go compiler, as you can with any other Go library. This applies to yet unreleased Go versions as well.

Situation before v0.37.0

Unfortunately, quic-go is tied to the version of the Go compiler. Any release that we cut supports the two most recent Go version.

This is because the Go standard library TLS implementation, crypto/tls, doesn't expose the APIs necessary for QUIC. We therefore maintain our own fork of crypto/tls, in a separate repository. For example, the qtls code for Go 1.18 lives in https://github.com/marten-seemann/qtls-go1-18.

On the other hand, we really don't want to expose the qtls.Config in the quic-go API. For applications, switching from TLS/TCP to QUIC should be as easy as replacing tls.Listen with quic.Listen with the same tls.Config (or rather, adding quic.Listen, since they probably want to support both).

There have been discussions with the Go team at Google about this design quirk (for example in quic-go#2727), and proposals to add QUIC-capable APIs to crypto/tls in the standard library (see https://github.com/golang/go/issues/44886 and https://github.com/golang/go/issues/32204). Unfortunately, little progress has been made on these issues so far.