quic

package module
v0.0.0-...-1e9be1c Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 9, 2016 License: MIT Imports: 19 Imported by: 0

README

A QUIC server implementation in pure Go

Build Status Coverage Status Godoc Reference

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, chacha20-poly1305 as 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 our fork of caddy. 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)

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Server

type Server struct {
	// contains filtered or unexported fields
}

A Server of QUIC

func NewServer

func NewServer(addr string, tlsConfig *tls.Config, cb StreamCallback) (*Server, error)

NewServer makes a new server

func (*Server) Close

func (s *Server) Close() error

Close the server

func (*Server) ListenAndServe

func (s *Server) ListenAndServe() error

ListenAndServe listens and serves a connection

func (*Server) Serve

func (s *Server) Serve(conn *net.UDPConn) error

Serve on an existing UDP connection.

type Session

type Session struct {
	// contains filtered or unexported fields
}

A Session is a QUIC session

func (*Session) Close

func (s *Session) Close(e error) error

Close the connection. If err is nil it will be set to qerr.PeerGoingAway.

func (*Session) GetOrOpenStream

func (s *Session) GetOrOpenStream(id protocol.StreamID) (utils.Stream, error)

GetOrOpenStream returns an existing stream with the given id, or opens a new stream

func (*Session) OpenStream

func (s *Session) OpenStream(id protocol.StreamID) (utils.Stream, error)

OpenStream creates a new stream open for reading and writing

type StreamCallback

type StreamCallback func(*Session, utils.Stream)

StreamCallback gets a stream frame and returns a reply frame

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL