Low-level access to the QUIC Initial Packet for mimicry purposes, hard fork of quic-go. https://quic.tlsfingerprint.io
Find a file
2016-12-14 11:54:01 +01:00
.travis run unit and integration tests separately, only generate coverage reports for unit tests 2016-06-08 15:14:36 +07:00
ackhandler Merge pull request #340 from lucas-clemente/fix-106 2016-11-18 22:10:39 +01:00
congestion remove unused congestion const 2016-09-05 13:35:09 +02:00
crypto use LRU cache for cached certificates 2016-09-08 23:08:57 +02:00
docs add gopher-logo 2016-05-03 10:27:59 +02:00
example Don't rely on GOPATH to load the certificates or error codes 2016-12-02 13:52:12 +01:00
flowcontrol use a mock ConnectionParameterManager in flow controller tests 2016-12-08 18:52:46 +07:00
frames use VersionWhatever in AckFrame tests 2016-12-02 22:37:31 +07:00
h2quic Don't rely on GOPATH to load the certificates or error codes 2016-12-02 13:52:12 +01:00
handshake create interface for the ConnectionParametersManager 2016-12-08 18:39:14 +07:00
integrationtests rename PublicHeader.WritePublicHeader to PublicHeader.Write 2016-11-06 22:34:16 +07:00
protocol correctly read MIDS and MSPC parameter 2016-12-08 16:15:31 +07:00
qerr Don't rely on GOPATH to load the certificates or error codes 2016-12-02 13:52:12 +01:00
testdata Don't rely on GOPATH to load the certificates or error codes 2016-12-02 13:52:12 +01:00
utils slightly improve utils.Write* performance by using slices 2016-09-05 23:38:40 +02:00
.editorconfig add editorconfig 2016-04-15 12:13:33 +02:00
.gitignore add debug.test (dvelve output) to gitignore 2016-05-03 14:26:50 +02:00
.travis.yml add Go 1.8beta1 for Travis 2016-12-03 14:31:19 +07:00
appveyor.yml update Go versions for CIs 2016-12-03 14:26:22 +07:00
benchmark_test.go create interface for the ConnectionParametersManager 2016-12-08 18:39:14 +07:00
buffer_pool.go add a buffer pool test for wrong-sized puts 2016-08-06 17:45:32 +02:00
buffer_pool_test.go add a buffer pool test for wrong-sized puts 2016-08-06 17:45:32 +02:00
codecov.yml move ackhandler.Packet and PacketList shared types to new ackhandler 2016-09-01 20:26:31 +02:00
LICENSE add Google to license file 2016-12-14 11:54:01 +01:00
packet_number_generator.go only increase packet number when sending a packet in PacketPacker 2016-08-16 17:07:03 +07:00
packet_number_generator_test.go only increase packet number when sending a packet in PacketPacker 2016-08-16 17:07:03 +07:00
packet_packer.go create interface for the ConnectionParametersManager 2016-12-08 18:39:14 +07:00
packet_packer_test.go use a mock ConnectionParametersManager in quic tests 2016-12-08 21:50:10 +07:00
packet_unpacker.go minor cleanup 2016-09-05 23:10:18 +02:00
packet_unpacker_test.go remove entropy from packet unpacker and session 2016-09-01 20:26:31 +02:00
public_header.go rename PublicHeader.WritePublicHeader to PublicHeader.Write 2016-11-06 22:34:16 +07:00
public_header_test.go rename PublicHeader.WritePublicHeader to PublicHeader.Write 2016-11-06 22:34:16 +07:00
public_reset.go slightly simplify public reset writing 2016-05-17 19:24:49 +02:00
public_reset_test.go slightly simplify public reset writing 2016-05-17 19:24:49 +02:00
quic_suite_test.go add public header parser 2016-04-06 23:10:52 +02:00
README.md fix typo 2016-10-28 12:30:52 +07:00
server.go ignore delayed packets with a version mismatched 2016-12-02 13:48:48 +07:00
server_test.go ignore delayed packets with a version mismatched 2016-12-02 13:48:48 +07:00
session.go create interface for the ConnectionParametersManager 2016-12-08 18:39:14 +07:00
session_test.go remove unused function from streamsMap 2016-12-09 17:56:04 +07:00
stream.go remove stream.ReadByte 2016-09-05 23:22:49 +02:00
stream_frame_sorter.go improve overlapping stream data errors 2016-08-06 17:08:23 +02:00
stream_frame_sorter_test.go fix typo 2016-10-28 12:30:52 +07:00
stream_framer.go don't send BlockedFrames after sending the FinBit for a stream 2016-10-27 17:56:02 +07:00
stream_framer_test.go use a mock ConnectionParametersManager in quic tests 2016-12-08 21:50:10 +07:00
stream_test.go use a mock ConnectionParametersManager in quic tests 2016-12-08 21:50:10 +07:00
streams_map.go add support for server-side opened streams 2016-12-09 23:14:15 +07:00
streams_map_test.go add support for server-side opened streams 2016-12-09 23:14:15 +07:00
udp_conn.go fix race condition in updConn 2016-11-02 20:03:19 +07:00

A QUIC server implementation in pure Go

Godoc Reference Linux Build Status Windows Build Status Code Coverage

quic-go is an implementation of the QUIC protocol in Go. While we're not far from being feature complete, there's still 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 34-36
  • 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
  • Connection migration
  • QUIC client

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 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)

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.