sgcQUIC, QUIC taşıma protokolünü (RFC 9000) Delphi, C++ Builder ve .NET'e getirir. İki yeni bileşen sunar, TsgcQUICClient ve TsgcQUICServer, her ikisi de OpenSSL 3.5 içindeki yerel QUIC motoru üzerine kuruludur, böylece taşıma ve TLS 1.3 el sıkışması tek bir alışverişte çalışır.
QUIC, HTTP/3'ün altında yatan protokoldür, ancak kendi başına da kullanışlıdır. UDP üzerinde çalışır, tek bir bağlantı üzerinde birçok bağımsız akışı çoğullar, 0-RTT ile devam eder ve bağlantı geçişi sayesinde bir ağ değişikliğinden sağ çıkar. Bu yazı ham QUIC katmanını ele alıyor. Sonraki yazı üstte yer alan HTTP/3 bileşenlerini ele alıyor.
Neden QUIC
Klasik bir TLS-over-TCP bağlantısı, ilk uygulama verisi baytı iletilmeden önce bir TCP el sıkışması ve ardından bir TLS el sıkışması gerektirir. QUIC her ikisini tek bir alışverişte birleştirir, böylece yeni bir bağlantı tek bir gidiş-dönüşte hazır olur ve devam ettirilen bir bağlantı verileri 0-RTT ile gönderebilir.
Her QUIC akışı kendi başına teslim edildiği için, bir akıştaki kayıp bir paket diğerlerini durdurmaz. Bu, tek bir TCP soketi üzerinden çoğullama yaptığınızda karşılaştığınız satır başı engellemesini (head-of-line blocking) ortadan kaldırır. Bir QUIC bağlantısı, IP ve port çifti yerine bir bağlantı kimliği (connection ID) ile tanımlanır, böylece bağlantı düşmeden Wi-Fi'den mobil veriye geçebilir.
QUIC İstemcisi
Host ve Port değerlerini ayarlayın, olayları atayın, ardından Active değerini True olarak ayarlayın. El sıkışması tek bir alışverişte tamamlanır ve WriteData, bir QUIC akışında bayt gönderir.
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;
Gelen baytlar, akış kimliğini ve yükü bildiren OnQUICStreamData olayında gelir:
procedure TForm1.OnQUICStreamData(Sender: TObject; aStreamId: Int64;
aUnidirectional: Boolean; const aData: TBytes);
begin
Memo1.Lines.Add('stream ' + IntToStr(aStreamId) + ': ' +
TEncoding.UTF8.GetString(aData));
end;
QUIC Sunucusu
Sunucu bir UDP portunu dinler ve PEM biçiminde bir sertifika ile özel anahtara ihtiyaç duyar. QUIC her zaman TLS 1.3 üzerinde çalışır, bu nedenle sertifika zorunludur. İstemci baytları OnQUICData olayında gelir ve yanıtlamak istediğiniz bağlantıyı geçirerek WriteData ile yanıt verirsiniz.
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;
Çoğullanmış Akışlar
Tek bir QUIC bağlantısı aynı anda birçok akış taşıyabilir. Bağlanmadan önce EnableMultiStream çağırın, ardından ihtiyacınız olduğu kadar akış açın. Çift yönlü bir akış bir istek ve onun yanıtını taşır; tek yönlü bir akış verileri tek yöne iter.
oClient.EnableMultiStream;
oClient.OpenStream; // a new bidirectional stream
oClient.OpenStream(True); // a unidirectional stream
Çoklu akış modu, yerleşik OpenSSL 3.5 QUIC motorunu kullanır. Her akış kendi başına akış kontrolüne tabidir, böylece yavaş veya takılmış bir akış diğerlerini asla engellemez.
0-RTT ve Bağlantı Geçişi
İlk başarılı el sıkışmasından sonra, istemci oturum biletini saklayabilir ve 0-RTT ile yeniden bağlanarak uygulama verilerini ilk paketin içinde gönderebilir. Bağlantı geçişi, bir ağ değişikliği boyunca bir oturumu canlı tutar, bu da Wi-Fi ile hücresel ağ arasında hareket eden mobil istemciler için önemlidir. Her ikisi de altta yatan QUIC motoru tarafından yönetilir.
Kullanılabilirlik
sgcQUIC, sgcWebSockets Enterprise'a bir eklenti olarak lisanslanan ayrı bir pakettir. Her lisans, tam Pascal kaynak kodunu ve bir yıllık güncellemeleri içerir. Bileşenler SGC QUIC paletine kurulur ve Delphi ile C++ Builder 7'den 13'e kadar destekler, ayrıca aynı Tsgc sınıf adlarına sahip bir .NET portu içerir.
HTTP/3 istemci ve sunucu bileşenleri bir sonraki yazıda ele alınmaktadır. Deneme sürümünü indirebilir ve tam bileşen referansını sgcQUIC ürün sayfasında okuyabilirsiniz.
Sorularınız veya geri bildiriminiz mi var? İletişime geçin, kodu yazan kişilerden bir yanıt alacaksınız.
