3 KiB
A QUIC implementation in pure Go

quic-go is an implementation of the QUIC protocol in Go.
Roadmap
quic-go is compatible with the current version(s) of Google Chrome and QUIC as deployed on Google's servers. We're actively tracking the development of the Chrome code to ensure compatibility as the protocol evolves. In that process, we're dropping support for old QUIC versions. As Google's QUIC versions are expected to converge towards the IETF QUIC draft, quic-go will eventually implement that draft.
Major TODOs:
- Better packet loss detection
- Connection migration
- Client-side 0-RTT support
- BBR congestion control
Guides
Installing deps:
go get -t
Running tests:
go test ./...
Running the example server
go run example/main.go -www /var/www/
Using the quic_client
from chromium:
quic_client --host=127.0.0.1 --port=6121 --v=1 https://quic.clemente.io
Using Chrome:
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --user-data-dir=/tmp/chrome --no-proxy-server --enable-quic --origin-to-force-quic-on=quic.clemente.io:443 --host-resolver-rules='MAP quic.clemente.io:443 127.0.0.1:6121' https://quic.clemente.io
Using the example client
go run example/client/main.go https://clemente.io
Usage
As a server
See the example server or try out Caddy (from version 0.9, instructions here). Starting a QUIC server is very similar to the standard lib http in go:
http.Handle("/", http.FileServer(http.Dir(wwwDir)))
h2quic.ListenAndServeQUIC("localhost:4242", "/path/to/cert/chain.pem", "/path/to/privkey.pem", nil)
As a client
See the example client. Use a QuicRoundTripper
as a Transport
in a http.Client
.
http.Client{
Transport: &h2quic.QuicRoundTripper{},
}
Building on Windows
Due to the low Windows timer resolution (see StackOverflow question) available with Go 1.6.x, some optimizations might not work when compiled with this version of the compiler. Please use Go 1.7 on Windows.