Immutable
release. Only release title and notes can be modified.
The quic package now accepts connections as well as dialing them, so a server can be built on it.
Server role (new)
Listen/Listener.Accept— many connections on one UDP socket, demuxed by Destination Connection ID. The caller drives each acceptedConnwithPoll, exactly as a client drives its own.NewServerConn— a connected server-roleConn. It accepts client-initiated request (bidirectional) and control (unidirectional) streams viaAcceptBidiStream/AcceptUniStream.AcceptInitial,NewServerHandshake,StartServerHandshake,ServerFlight.HandleClientHandshake,SealPacket— the server handshake primitives.ServerTransportParams/AppendServerTransportParams— per-connection parameters carrying the connection IDs a client authenticates (RFC 9000 §7.3). The advertised receive windows are exactly the ones a server connection enforces.- Stream IDs now follow the connection's role (RFC 9000 §2.1): a server opens 3, 7, 11 … and 1, 5, 9 ….
Connteardown now releases its TLS handshake.crypto/tlsruns aQUICConnhandshake on a goroutine that exits only when closed, so every terminated connection previously leaked one — client connections included.
A real client Conn completes a handshake against the listener over UDP and exchanges a request and a response, each side driven by its own Poll loop.
Not implemented on the listener: Retry / address validation, connection migration, per-peer rate limiting; each inbound Initial starts one goroutine for its handshake. Put a rate limiter in front of it before exposing it to the internet.
Also since v0.9.0
- ChaCha20-Poly1305 packet protection (#204); opt-in BBR congestion control (#203, #206)
- GSO / GRO batched send and receive on Linux (#199, #200); deferred and piggybacked ACKs (#201)
- QPACK dynamic table in both directions (#194, #195, #196, #202)
- HTTP/1.1 pool and managed transports (#219)
Requires Go 1.25, and adds golang.org/x/crypto (ChaCha20 header protection).