어제 게시글에서는 sgcQUIC의 원시 QUIC 전송을 소개했습니다. 오늘은 그 위에 자리하는 계층인 HTTP/3(RFC 9114)를 살펴봅니다. 두 컴포넌트인 TsgcHTTP3Client와 TsgcHTTP3Server는 현대적인 웹 전송을 Delphi, C++ Builder 및 .NET에 제공합니다.
HTTP/3는 HTTP/1.1 및 HTTP/2에서 이미 알고 있는 요청 및 응답 시맨틱을 유지하지만, TCP 대신 QUIC 위에서 실행합니다. 헤더는 QPACK(RFC 9204)로 압축되며, QUIC가 스트림을 독립적으로 멀티플렉싱하기 때문에 패킷 손실이 더 이상 연결의 모든 요청을 멈추게 하지 않습니다.
HTTP/3 클라이언트
호스트에 연결한 다음 verb 메서드 중 하나를 호출합니다. Get은 본문을 문자열로 반환하며, 상태 코드와 헤더를 포함한 전체 응답은 OnResponse로 전달됩니다.
uses
sgcHTTP3_Client;
var
oClient: TsgcHTTP3Client;
vBody: string;
begin
oClient := TsgcHTTP3Client.Create(nil);
oClient.OnResponse := OnResponse;
oClient.OnAltSvc := OnAltSvc;
oClient.Connect('www.example.com', 443);
vBody := oClient.Get('https://www.example.com/');
end;
procedure TForm1.OnResponse(Sender: TObject; aResponse: TsgcHTTP3Response);
begin
Memo1.Lines.Add('status ' + IntToStr(aResponse.StatusCode));
Memo1.Lines.Add(aResponse.GetDataAsString);
end;
모든 HTTP 메서드를 사용할 수 있습니다: Get, Head, Post, Put, Delete, Patch, Options, Trace, Connect 및 Query. 각 메서드에는 즉시 반환되고 결과를 OnResponse를 통해 보고하는 비동기 대응 메서드(GetAsync, PostAsync 등)가 있습니다.
QPACK 및 Alt-Svc
QPACK는 전용 인코더 및 디코더 스트림으로 전달되는 동적 테이블을 사용하여 요청 및 응답 헤더를 압축합니다. Settings를 통해 이를 조정할 수 있습니다:
oClient.Settings.QPACKMaxTableCapacity := 4096;
oClient.Settings.MaxFieldSectionSize := 65536;
많은 서버는 여전히 첫 번째 요청을 HTTP/1.1 또는 HTTP/2로 응답하고 Alt-Svc 헤더(RFC 7838)에 HTTP/3를 광고합니다. OnAltSvc 이벤트가 그 광고를 노출하므로, 클라이언트는 HTTP/3 엔드포인트를 검색하여 다음 요청에서 업그레이드할 수 있습니다.
HTTP/3 서버
서버는 QUIC 계층에서 QUIC 리스너 및 인증서 옵션을 상속하므로, 포트와 PEM 인증서 및 키를 사용하여 동일한 방식으로 구성됩니다. 각 요청은 OnH3Request를 발생시키며, 여기서 응답 객체를 채웁니다.
uses
sgcHTTP3_Server;
var
oServer: TsgcHTTP3Server;
begin
oServer := TsgcHTTP3Server.Create(nil);
oServer.Port := 443;
oServer.QUICOptions.SSLOptions.CertFile := 'cert.pem';
oServer.QUICOptions.SSLOptions.KeyFile := 'key.pem';
oServer.OnH3Request := OnH3Request;
oServer.Active := True;
end;
procedure TForm1.OnH3Request(Sender: TObject;
const aConnection: TsgcQUICServerConnection;
const aRequest: TsgcHTTP3Request; const aResponse: TsgcHTTP3Response);
begin
aResponse.StatusCode := 200;
aResponse.ContentType := 'text/plain';
aResponse.Data := TEncoding.UTF8.GetBytes('Hello from HTTP/3');
end;
서버 푸시, 터널 및 WebTransport
이 컴포넌트는 더 넓은 HTTP/3 기능 세트도 구현합니다. 서버는 PushPromise를 사용하여 클라이언트가 요청하기 전에 리소스를 푸시할 수 있으며, 클라이언트는 OnPushPromise를 통해 이를 받습니다. 확장 CONNECT(RFC 9220)는 HTTP/3 스트림을 통해 터널을 열고, WebTransport는 동일한 메커니즘을 기반으로 실시간 애플리케이션을 위한 양방향 스트림과 데이터그램을 제공합니다.
제공 정보
sgcQUIC는 별도의 패키지로, sgcWebSockets Enterprise의 애드온으로 라이선스가 부여되며, QUIC와 HTTP/3 컴포넌트를 모두 포함합니다. 모든 라이선스에는 전체 Pascal 소스 코드와 1년간의 업데이트가 제공됩니다. 컴포넌트는 SGC QUIC 팔레트에 설치되며 Delphi 및 C++ Builder 7부터 13까지 지원하고, 동일한 Tsgc 클래스 이름을 가진 .NET 포트도 지원합니다.
트라이얼을 다운로드하고 sgcQUIC 제품 페이지에서 전체 레퍼런스를 확인하세요.
질문이나 피드백이 있으신가요? 문의하기, 코드를 작성한 사람들로부터 답변을 받으실 수 있습니다.
