forked from quic-go/quic-go
c5be7d0d62b712ce09490e3eea37444f6338c270
Improve AEAD speed with slightly faster poly1305 implementation. Avoid memory allocations whenever possible. (AEAD) But currently missing AVX2 support. BenchmarkSeal64B-8 1561 ns/op 40.97 MB/s BenchmarkSeal1K-8 5570 ns/op 183.82 MB/s BenchmarkSeal64K-8 161271 ns/op 406.37 MB/s BenchmarkOpen64B-8 1747 ns/op 45.79 MB/s BenchmarkOpen1K-8 5741 ns/op 181.14 MB/s BenchmarkOpen64K-8 157116 ns/op 417.22 MB/s
A QUIC server implementation in pure Go
quic-go is an implementation of the QUIC protocol in Go. While we're not far from being feature complete, there's still a lot of work to do regarding performance and security. At the moment, we do not recommend use in production systems. We appreciate any feedback :)
Roadmap
Done:
- Basic protocol with support for QUIC version 30-33
- HTTP/2 support
- Crypto (RSA / ECDSA certificates, curve25519 for key exchange, AES-GCM or Chacha20-Poly1305 as stream cipher)
- Loss detection and retransmission (currently fast retransmission & RTO)
- Flow Control
- Congestion control using cubic
Major TODOs:
- Security, especially DOS protections
- Performance
- Better packet loss detection
- Support for QUIC version 34
- Connection migration
- QUIC client
- Public API design
- Integration into caddy (mostly to figure out the right server API)
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 --quic-version=32 --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
Usage
See the example server or the current beta version of Caddy (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)
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.
Languages
Go
99.8%
Shell
0.1%