Giter Club home page Giter Club logo

picoquic's Introduction

picoquic

Minimalist implementation of the QUIC protocol, as defined by the IETF. The IETF spec started with the version of QUIC defined by Google and implemented in Chrome, but the IETF spec is independent of Chrome, and does not attempt to be backward compatible. The main developer is Christian Huitema.

The first goal of this project is to provide feedback on the development of a QUIC standard in the IETF QUIC WG. Information on the WG is available at https://datatracker.ietf.org/wg/quic/charter/. The in-progress version of the spec is available on GitHub at https://github.com/quicwg.

The second goal is to experiment with API for non-HTTP development, such as DNS over QUIC. Then there are plenty of other features we may dream off, such as support for multipath, or support for peer-to-peer applications. That's on the horizon, but not there now.

The code in this repo is a work in progress. In fact, the specification itself is a work in progress. The working group is progressing by running a series of meetings and of interop trials between several implementations, listed at https://github.com/quicwg/base-drafts/wiki/Implementations. The current interoperability matrix is listed at https://docs.google.com/spreadsheets/d/1D0tW89vOoaScs3IY9RGC0UesWGAwE6xyLk0l4JtvTVg/edit#gid=273618597.

Bastian Köcher has developed bindings of the picoquic library to RUST (https://www.rust-lang.org/en-US/). His repository can be found here: https://github.com/bkchr/picoquic-rs. You may want to check it.

Development

Picoquic is currently developed as a Visual Studio 2017 project, and simultaneously tested on Windows and on Linux. It has a dependency on the Picotls implementation of TLS 1.3 (https://github.com/h2o/picotls). Picotls has two mode, a feature rich version that depends on OpenSSL, and a leaner version that only depends on the "minicrypto" library. For now, Picoquic uses the OpenSSL version, and has a dependency on OpenSSL.

The project consists of a core library (picoquic), of a test library (picoquictest), and of a test program (picoquicfirst). All these are written in C. In the Visual Studio project, the test library is wrapped up in the Visual Studio unittest framework, which makes for convenient regression testing during development. In the Linux builds, the tests are run through a command line program.

Milestones

As explained in the Wiki, Picoquic is actively tested against other implementations during the QUIC Interop days. See https://github.com/private-octopus/picoquic/wiki/QUIC-milestones-and-interop-testing.

The implementations are progressing with the spec. The next step, with draft 09, brings support for TLS 1.3 draft 23, hopefully very close to final TLS 1.3 version.

There are a few big features coming after that: packet number encryption, NAT rebinding, connection migration, and variable length connection ID. Hopefully we will be able to start testing that during the next IETF meeting in March.

In parallel, we plan to do an implementation of DNS over QUIC (https://datatracker.ietf.org/doc/draft-huitema-quic-dnsoquic/).

We are also starting to spend time bettering the implementation. Until now the focus has been on correctness rather than performance. We will keep correctness, but we will improve performance, especially in light of practical experience with applications. Suggestions are wellcome.

Building Picoquic

Picoquic is developed in C, and can be built under Windows or Linux. Building the project requires first managing the dependencies, Picotls (https://github.com/h2o/picotls) and OpenSSL. Please note that you will need a recent version of Picotls -- we had to get a few changes in the API to enable 0-RTT in QUIC, and these changes were checked in on December 20 and 21, 2017.

Picoquic on Windows

To build Picoquic on Windows, you need to:

  • Install and build Openssl on your machine

  • Document the location of the Openssl install in the environment variable OPENSSLDIR (OPENSSL64DIR for the x64 builds)

  • Clone and compile Picotls, using the Picotls for Windows options

  • Clone and compile Picoquic, using the Visual Studio 2017 solution picoquic.sln included in the sources.

  • You can use the unit tests included in the Visual Studio solution to verify the port.

Picoquic on Linux

The build experience on Linux is now much improved, thanks to check-ins from Deb Banerjee and Igor Lubashev.

To build Picoquic on Linux, you need to:

  • Install and build Openssl on your machine

  • Clone and compile Picotls, using cmake as explained in the Picotls documentation.

  • Clone and compile Picoquic:

   cmake .
   make
  • Run the test program "picoquic_ct" to verify the port.

Picoquic on MacOSX

Thanks to Frederik Deweerdt for ensuring that Picoquic runs on MacOSX. The build steps are the same as for Linux.

Developing applications

Sorry, not all that much documentation yet. This will come as we populate the wiki. Your best bet is to look at the demonstration program "picoquicdemo" that is included in the release. The sources are in "picoquicfirst/picoquicdemo.c".

picoquic's People

Contributors

huitema avatar bkchr avatar dbavatar avatar igorlord avatar alagoutte avatar deweerdt avatar

Watchers

Tatsuhiro Tsujikawa avatar James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.