How facebook/mvfst works
mvfst is a C++ implementation of the QUIC transport protocol, with client and server transports for applications. The principal workflow is an application opening a connection and exchanging reliable multiplexed streams over UDP; handshake, packet processing, stream/connection state, flow control, loss recovery, and congestion control support that exchange. The README also documents server scaling and routing, restart support, statistics, zero-RTT, GSO, and client address racing. Relationships below follow the documented architecture and sampled source; unsampled subsystem wiring is kept conservative.
Main entry points: QuicClientTransportLite.cpp Client Transport · QuicServerWorker.cpp Server Worker · api Transport API · QuicServer.cpp Server
Components 24
Application API
- Transport API
quic/api
Client and Server
- Client Transport
quic/client/QuicClientTransportLite.cpp - Address Racing
quic/happyeyeballs - Server
quic/server/QuicServer.cpp - Server Worker
quic/server/QuicServerWorker.cpp - Packet Router
quic/server/QuicServerPacketRouter.cpp
QUIC Protocol
- Handshake
quic/handshake/HandshakeLayer.cpp - Fizz TLS
quic/fizz - Packet Codec
quic/codec - Connection State
quic/state/StateData.h - Stream Manager
quic/state/QuicStreamManager.cpp - Flow Control
quic/flowcontrol/QuicFlowController.cpp - Datagram Flows
quic/datagram/DatagramFlowManager.cpp
Transport Runtime
- UDP Socket
quic/common/udpsocket/QuicAsyncUDPSocket.h - Packet Scheduling
quic/api/QuicPacketScheduler.cpp - Congestion Control
quic/congestion_control/CongestionControllerFactory.cpp - Loss Recovery
quic/loss/QuicLossFunctions.cpp - Event Timers
quic/common/events/QuicEventBase.h
Deployment Features
- CID Routing
quic/server/QuicServerWorker.cpp - UDP GSO
quic/api/QuicBatchWriterFactory.h - Transport Statistics
quic/api/TransportInfo.h - QLog
quic/logging/QLogger.h
Other components
- Application
- UDP Network
Connections 30
- Application → Transport API: uses
- Transport API → Client Transport: opens transport
- Transport API → Server: configures server
- Client Transport → Address Racing: races addresses
- Client Transport → Handshake: establishes session
- Handshake → Fizz TLS: uses TLS
- Client Transport → Packet Codec: encodes packets
- Client Transport → UDP Socket: sends and receives
- UDP Socket → UDP Network: exchanges datagrams
- UDP Network → UDP Socket: delivers datagrams
- Server → Server Worker: dispatches work
- Server Worker → Packet Router: routes packets
- Server Worker → UDP Socket: receives packets
- Server Worker → Packet Codec: decodes packets
- Server Worker → Handshake: establishes session
- Packet Codec → Connection State: updates connection
- Connection State → Stream Manager: tracks streams
- Stream Manager → Flow Control: checks data limits
- Transport API → Datagram Flows: queues datagrams
- Connection State → Packet Scheduling: provides send state
- Packet Scheduling → Congestion Control: checks send allowance
- Connection State → Loss Recovery: tracks packet loss
- Client Transport → Event Timers: schedules transport work
- Server Worker → Event Timers: schedules transport work
- Server Worker → CID Routing: routes connection IDs
- Server Worker → UDP GSO: configures packet writes
- Client Transport → Transport Statistics: reports statistics
- Server → Transport Statistics: exposes statistics
- Client Transport → QLog: records events
- Server → QLog: records events