forked from quic-go/quic-go
75 lines
3.0 KiB
Markdown
75 lines
3.0 KiB
Markdown
# A QUIC implementation in pure Go
|
|
|
|
<img src="docs/quic.png" width=303 height=124>
|
|
|
|
[](https://godoc.org/github.com/lucas-clemente/quic-go)
|
|
[](https://travis-ci.org/lucas-clemente/quic-go)
|
|
[](https://ci.appveyor.com/project/lucas-clemente/quic-go/branch/master)
|
|
[](https://codecov.io/gh/lucas-clemente/quic-go/)
|
|
|
|
quic-go is an implementation of the [QUIC](https://en.wikipedia.org/wiki/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](https://github.com/quicwg/base-drafts), 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](example/main.go) or try out [Caddy](https://github.com/mholt/caddy) (from version 0.9, [instructions here](https://github.com/mholt/caddy/wiki/QUIC)). Starting a QUIC server is very similar to the standard lib http in go:
|
|
|
|
```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](example/client/main.go). Use a `QuicRoundTripper` as a `Transport` in a `http.Client`.
|
|
|
|
```go
|
|
http.Client{
|
|
Transport: &h2quic.QuicRoundTripper{},
|
|
}
|
|
```
|
|
|
|
## Building on Windows
|
|
|
|
Due to the low Windows timer resolution (see [StackOverflow question](http://stackoverflow.com/questions/37706834/high-resolution-timers-millisecond-precision-in-go-on-windows)) 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.
|