TCP is the main protocol that provides crucial services such as reliability and in-order delivery to other protocols higher up on the OSI model such as HTTP.
A HTTP Request uses a stack of protocols: HTTP on TLS on TCP on IP.
- HTTP deals with URLs and data interpretation
- TLS secures the connection with encryption
- TCP enables reliable in order delivery
- IP routes packets between machines
A new protocol was introduced called
HTTP/2 requires changes to work on
TCP (Transmission Control Protocol) focuses on reliability over efficiency - requiring a full handshake and a round trip for requests. TCP is large and complex and has many implementations and extensions.
HTTP/3 is essential HTTP/2 over QUIC
Main features coming from QUIC:
- Faster connection set-up
- Less HoL blocking
- Connection migration
Importantly - many other protocols can run over QUIC:
The reason QUIC runs on UDP (User Datagram Protocol) - is due to the difficulty in updating all the hardware and software of the internet. A full independent transport layer - would require all devices on the internet to be upgraded.
UDP is bare bones. ONly supports port numbers. Good for live traffic, low-up front delay requirements (like DNS) and for single round trip requirements.
So reasons UDP is used is for easy deployment.
QUIC implements most TCP features:
- reliable (with acknowledgements and retransmissions)
- connection setup with a handshake
- flow-control and congestion-control
Re-implemented in a more performant way
Newer versions of TLS (1.3 and up) only require a single round trip.
There is no clear text version of QUIC. Encryption is ingrained into QUIC. Most packet headers are also encrypted.
Cons of QUIC:
- Network providers hesitate to allow QUIC: as the headers encrypt metrics they use to block
- QUIC encrypts each individual packet - TLS-over-TCP can encrypt several at a time
- Centralisation - Originally introduced by Google - the IETF QUIC proposal was created by many big companies: facebook, cloudflare, google and big CDNs - most likely leading to more centralisation.
For HTTP/1.1, the resource-loading process is quite simple, because each file is given its own TCP connection and downloaded in full.
TCP was never designed to transport multiple, independent files over a single connection. Because that is exactly what web browsing requires, this has led to many inefficiencies over the years. QUIC solves this by making multiple byte streams a core concept at the transport layer and handling packet loss on a per-stream basis.
For TCP, In practice every network change means that existing TCP connections can no longer be used.
Quick introduces the
connection identifier (CID) - a common list of (randomly generated) CIDs mapping to a single connection.
It does not change when chainging networks - unlike TCP that uses the 4 tuple (client IP address + client port + server IP address + server port)
QUIC changes the CID every time a new network is used - to prevent privacy issues? But its encrypted right?
QUIC Implementations are currently done in user-space not kernel-space yet.
QUIC can evolve:
QUIC uses individual frames to send meta data, instead of a large fixed packet header.