sgcQUIC brengt het QUIC-transportprotocol (RFC 9000) naar Delphi, C++ Builder en .NET. Het levert twee nieuwe componenten, TsgcQUICClient en TsgcQUICServer, beide gebouwd op de native QUIC-engine in OpenSSL 3.5, zodat het transport en de TLS 1.3-handshake in één enkele uitwisseling verlopen.
QUIC is het protocol onder HTTP/3, maar het is op zichzelf al nuttig. Het draait over UDP, multiplext veel onafhankelijke streams op één connectie, hervat met 0-RTT en overleeft een netwerkwissel dankzij connectiemigratie. Dit bericht behandelt de ruwe QUIC-laag. De volgende post behandelt de HTTP/3-componenten die erbovenop draaien.
Waarom QUIC
Een klassieke TLS-over-TCP-connectie heeft een TCP-handshake en vervolgens een TLS-handshake nodig voordat de eerste byte applicatiedata wordt verstuurd. QUIC vouwt beide samen in één uitwisseling, zodat een nieuwe connectie klaar is na één round trip en een hervatte connectie data kan versturen met 0-RTT.
Omdat elke QUIC-stream afzonderlijk wordt afgeleverd, blokkeert een verloren pakket op één stream de andere niet. Dat elimineert de head-of-line-blocking die je krijgt wanneer je multiplext over één enkele TCP-socket. Een QUIC-connectie wordt geïdentificeerd door een connectie-ID in plaats van door het IP-en-poortpaar, zodat ze kan migreren van Wi-Fi naar mobiele data zonder te worden verbroken.
De QUIC Client
Stel Host en Port in, wijs de events toe en zet vervolgens Active op True. De handshake wordt in één keer voltooid, en WriteData verstuurt bytes over een QUIC-stream.
uses
sgcQUIC_Client;
var
oClient: TsgcQUICClient;
begin
oClient := TsgcQUICClient.Create(nil);
oClient.Host := 'www.example.com';
oClient.Port := 443;
oClient.OnQUICConnect := OnQUICConnect;
oClient.OnQUICStreamData := OnQUICStreamData;
oClient.OnQUICDisconnect := OnQUICDisconnect;
oClient.Active := True; // TLS 1.3 handshake in a single flight
oClient.WriteData('ping'); // send bytes on a QUIC stream
end;
Inkomende bytes komen binnen in het OnQUICStreamData-event, dat de stream-id en de payload meldt:
procedure TForm1.OnQUICStreamData(Sender: TObject; aStreamId: Int64;
aUnidirectional: Boolean; const aData: TBytes);
begin
Memo1.Lines.Add('stream ' + IntToStr(aStreamId) + ': ' +
TEncoding.UTF8.GetString(aData));
end;
De QUIC Server
De server luistert op een UDP-poort en heeft een certificaat en een privésleutel in PEM-formaat nodig. QUIC draait altijd over TLS 1.3, dus het certificaat is verplicht. Bytes van de client komen binnen in OnQUICData, en je antwoordt met WriteData, waarbij je de connectie doorgeeft die je wilt beantwoorden.
uses
sgcQUIC_Server;
var
oServer: TsgcQUICServer;
begin
oServer := TsgcQUICServer.Create(nil);
oServer.Port := 443;
oServer.QUICOptions.SSLOptions.CertFile := 'cert.pem';
oServer.QUICOptions.SSLOptions.KeyFile := 'key.pem';
oServer.OnQUICConnect := OnQUICConnect;
oServer.OnQUICData := OnQUICData;
oServer.Active := True;
end;
procedure TForm1.OnQUICData(Sender: TObject;
aConnection: TsgcQUICServerConnection; const aData: TBytes);
begin
// echo the message back to the client that sent it
oServer.WriteData(aConnection, aData);
end;
Gemultiplexte Streams
Eén enkele QUIC-connectie kan tegelijkertijd veel streams dragen. Roep EnableMultiStream aan voordat je verbinding maakt, en open daarna zoveel streams als je nodig hebt. Een bidirectionele stream draagt een request en het antwoord daarop; een unidirectionele stream duwt data één kant op.
oClient.EnableMultiStream;
oClient.OpenStream; // a new bidirectional stream
oClient.OpenStream(True); // a unidirectional stream
De multi-streammodus gebruikt de ingebouwde OpenSSL 3.5 QUIC-engine. Elke stream heeft zijn eigen flow control, zodat een trage of vastgelopen stream de rest nooit blokkeert.
0-RTT en Connectiemigratie
Na een eerste geslaagde handshake kan de client het session ticket bewaren en opnieuw verbinden met 0-RTT, waarbij applicatiedata al in het allereerste pakket wordt meegestuurd. Connectiemigratie houdt een sessie in leven bij een netwerkwissel, wat belangrijk is voor mobiele clients die zich verplaatsen tussen Wi-Fi en mobiel netwerk. Beide worden afgehandeld door de onderliggende QUIC-engine.
Beschikbaarheid
sgcQUIC is een apart pakket, gelicentieerd als add-on voor sgcWebSockets Enterprise. Elke licentie bevat de volledige Pascal-broncode en één jaar updates. De componenten installeren op het SGC QUIC-palet en ondersteunen Delphi en C++ Builder 7 tot en met 13, plus een .NET-port met dezelfde Tsgc-klassenamen.
De HTTP/3 client- en servercomponenten worden behandeld in de volgende post. Je kunt de trial downloaden en de volledige componentreferentie lezen op de sgcQUIC-productpagina.
Vragen of feedback? Neem contact op, je krijgt antwoord van de mensen die de code hebben geschreven.
