sgcQUIC bringt das QUIC-Transportprotokoll (RFC 9000) zu Delphi, C++ Builder und .NET. Es liefert zwei neue Komponenten, TsgcQUICClient und TsgcQUICServer, beide aufgebaut auf der nativen QUIC-Engine in OpenSSL 3.5, sodass der Transport und der TLS 1.3-Handshake in einem einzigen Durchgang ablaufen.
QUIC ist das Protokoll unter HTTP/3, aber es ist auch für sich allein nützlich. Es läuft über UDP, multiplext viele unabhängige Streams auf einer Verbindung, nimmt mit 0-RTT wieder auf und übersteht dank Verbindungsmigration einen Netzwerkwechsel. Dieser Beitrag behandelt die reine QUIC-Schicht. Der nächste Beitrag behandelt die HTTP/3-Komponenten, die darauf aufsetzen.
Warum QUIC
Eine klassische TLS-über-TCP-Verbindung benötigt einen TCP-Handshake und dann einen TLS-Handshake, bevor das erste Byte an Anwendungsdaten übertragen wird. QUIC fasst beides in einem einzigen Austausch zusammen, sodass eine neue Verbindung nach einem einzigen Roundtrip bereit ist und eine wiederaufgenommene Daten mit 0-RTT senden kann.
Da jeder QUIC-Stream eigenständig ausgeliefert wird, hält ein verlorenes Paket auf einem Stream die anderen nicht auf. Das beseitigt das Head-of-Line-Blocking, das entsteht, wenn man über einen einzigen TCP-Socket multiplext. Eine QUIC-Verbindung wird durch eine Connection-ID identifiziert und nicht durch das Paar aus IP und Port, sodass sie ohne Abbruch von Wi-Fi zu Mobilfunk wechseln kann.
Der QUIC-Client
Setzen Sie Host und Port, weisen Sie die Ereignisse zu und setzen Sie dann Active auf True. Der Handshake wird in einem einzigen Durchgang abgeschlossen, und WriteData sendet Bytes auf einem 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;
Eingehende Bytes treffen im Ereignis OnQUICStreamData ein, das die Stream-ID und die Nutzdaten meldet:
procedure TForm1.OnQUICStreamData(Sender: TObject; aStreamId: Int64;
aUnidirectional: Boolean; const aData: TBytes);
begin
Memo1.Lines.Add('stream ' + IntToStr(aStreamId) + ': ' +
TEncoding.UTF8.GetString(aData));
end;
Der QUIC-Server
Der Server lauscht an einem UDP-Port und benötigt ein Zertifikat und einen privaten Schlüssel im PEM-Format. QUIC läuft immer über TLS 1.3, daher ist das Zertifikat zwingend erforderlich. Client-Bytes treffen in OnQUICData ein, und Sie antworten mit WriteData, indem Sie die Verbindung übergeben, die Sie beantworten möchten.
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
Eine einzige QUIC-Verbindung kann viele Streams gleichzeitig transportieren. Rufen Sie EnableMultiStream auf, bevor Sie eine Verbindung herstellen, und öffnen Sie dann so viele Streams, wie Sie benötigen. Ein bidirektionaler Stream transportiert eine Anfrage und ihre Antwort; ein unidirektionaler Stream schiebt Daten in eine Richtung.
oClient.EnableMultiStream;
oClient.OpenStream; // a new bidirectional stream
oClient.OpenStream(True); // a unidirectional stream
Der Multi-Stream-Modus verwendet die eingebaute QUIC-Engine von OpenSSL 3.5. Jeder Stream wird eigenständig flusskontrolliert, sodass ein langsamer oder blockierter Stream niemals den Rest aufhält.
0-RTT und Verbindungsmigration
Nach einem ersten erfolgreichen Handshake kann der Client das Session-Ticket behalten und sich mit 0-RTT erneut verbinden, wobei er Anwendungsdaten bereits im allerersten Paket sendet. Die Verbindungsmigration hält eine Sitzung über einen Netzwerkwechsel hinweg am Leben, was für mobile Clients wichtig ist, die zwischen Wi-Fi und Mobilfunk wechseln. Beides wird von der zugrunde liegenden QUIC-Engine übernommen.
Verfügbarkeit
sgcQUIC ist ein separates Paket, lizenziert als Add-on zu sgcWebSockets Enterprise. Jede Lizenz umfasst den vollständigen Pascal-Quellcode und ein Jahr Updates. Die Komponenten werden in der Palette SGC QUIC installiert und unterstützen Delphi und C++ Builder 7 bis 13, plus einen .NET-Port mit denselben Tsgc-Klassennamen.
Die HTTP/3 Client- und Server-Komponenten werden in dem nächsten Beitrag behandelt. Sie können die Testversion herunterladen und die vollständige Komponentenreferenz auf der sgcQUIC-Produktseite lesen.
Fragen oder Feedback? Nehmen Sie Kontakt auf, Sie erhalten eine Antwort von den Menschen, die den Code geschrieben haben.
