mirror of https://github.com/vacp2p/nim-quic.git
18c0c6c155
or "why Questionable is awesome" |
||
---|---|---|
.github/workflows | ||
quic | ||
tests | ||
.editorconfig | ||
.gitignore | ||
.tool-versions | ||
Readme.md | ||
nim.cfg | ||
quic.nim | ||
quic.nimble |
Readme.md
QUIC for Nim
We're working towards an implementation of the QUIC protocol for Nim. This is very much a work in progress, and not yet in a usable state.
Building and testing
Install dependencies:
nimble install -d
Run tests:
nimble test
Examples
Import quic and the chronos async library:
import quic
import chronos
Outgoing connections
Connect to a QUIC peer:
let connection = await dial(initTAddress("127.0.0.1:12345"))
Open a new stream:
let stream = await connection.openStream()
Write to the stream:
let message = cast[seq[byte]]("some message")
await stream.write(message)
Close stream:
await stream.close()
Wait for peer to close connection:
await connection.waitClosed()
Incoming connections
Listen for incoming connections:
let listener = listen(initTAddress("127.0.0.1:12345"))
Accept an incoming connection:
let connection = await listener.accept()
Wait for an incoming stream:
let stream = await connection.incomingStream()
Read from a stream:
let message = await stream.read()
Close stream:
await stream.close()
Close connection:
await connection.close()
Stop listening:
await listener.stop()
Roadmap
This is a rough outline of the steps that we expect to take during implementation. They are bound to change over time.
- Wrap existing C library for QUIC, to test Nim implementation against
- Wrap C library with Nimterop
- Dummy TLS implementation
- Open connection
- Complete handshake
- Create uni-directional stream
- Create bi-directional stream
- Send data over stream
- Close stream
- Close connection
- Interface with real TLS library
- Integrate QUIC as a transport in libp2p
- Support IPv6 UDP addresses
- Idle timeouts
- Handle zero-length destination ids
- Packet formats
- Frames
- Initial & Handshake frames
- Other frames
- Connections
- Handshake
- Streams
- Outgoing (writing)
- Incoming (reading)
- Uni-directional
- Bi-directional
- ACKs and retransmissions
- Flow control
- Packet encryption
- Start by using dummy TLS implementation
- Select suitable TLS lib
- Integrate TLS lib
- Loss detection
- Congestion control
- Address validation
- Connection migration
- Version negotiation
Thanks
We would like to thank the authors of the NGTCP2 library, on whose work we're building.