Delphi HTTP/2 클라이언트 & 서버 — 다중화, 스트리밍, 푸시

RFC 9113 HTTP/2의 네이티브 Pascal 구현 — 스트림 다중화, HPACK 헤더 압축, 흐름 제어, 서버 푸시 및 HTTP/2를 통한 WebSocket 확장(RFC 8441). 동일한 컴포넌트, 클라이언트 또는 서버, Delphi 7부터 Delphi 13까지.

순수 Pascal HTTP/2 스택

WinHTTP 또는 libcurl 주변의 얇은 래퍼가 아니에요 — 프레임 수준 제어를 제공하는 처음부터 작성된 구현이에요.

Delphi HTTP/2 클라이언트는 더 이상 선택 사항이 아니에요: HTTP/2는 전체 최신 웹이 사용하는 와이어 형식이에요. Apple Push Notifications는 HTTP/2가 필요해요. Google API는 HTTP/2를 협상해요. AWS, Azure 및 CloudFront는 HTTP/2를 기본값으로 사용해요. 그리고 이점은 실재해요: 단일 TCP/TLS 연결이 수십 개의 비행 중 요청을 다중화하고, 헤더 세트가 HPACK으로 압축되며, 서버는 클라이언트가 아직 요청하지 않은 리소스를 푸시할 수 있어요. sgcWebSockets는 TsgcHTTP2Client(클라이언트) 및 TsgcWebSocketHTTPServer(서버) 내부의 HTTP/2 지원을 제공해요 — 둘 다 순수 Pascal이며, 둘 다 Delphi 컴파일러가 대상으로 하는 모든 플랫폼에서 실행돼요.

동일한 라이브러리의 Delphi HTTP/2 서버는 REST API를 호스팅하고, 장기 클라이언트에 이벤트를 푸시하며, HTTP/2(RFC 8441)를 통한 WebSocket 업그레이드를 수락할 수 있어요 — 최신 인프라가 HTTP/2 / HTTP/3 위에 WebSocket을 계층화하는 표준 방법이에요.

클라이언트

TsgcHTTP2Client

서버

HTTP/2가 활성화된 TsgcWebSocketHTTPServer

표준

RFC 9113 (HTTP/2), RFC 7541 (HPACK), RFC 8441 (WS-over-H2)

TLS

OpenSSL, SChannel, HTTP.sys — ALPN 협상

HTTP/2가 중요한 이유

HTTP/1.1에 비해 네 가지 큰 승리 — 그리고 이를 작동시키는 운영 세부 사항.

스트림 다중화

단일 TCP+TLS 연결을 통해 최대 SETTINGS_MAX_CONCURRENT_STREAMS 비행 중 요청 — 헤드-오브-라인 차단 없음, 튜닝할 연결 풀 없음.

HPACK 압축

연결별 정적 + 동적 헤더 테이블이 HTTP/1.1 트래픽을 부풀리는 수 킬로바이트의 반복된 헤더(쿠키, 사용자 에이전트, 수락)를 제거해요.

서버 푸시

서버는 클라이언트가 요청하기 전에 클라이언트가 필요로 할 리소스(CSS, JS, JSON 하위 리소스)를 사전 예방적으로 보낼 수 있어요 — 요청 왕복을 줄여요.

스트림 우선순위

스트림별 가중치 및 종속성 트리를 통해 분석 블롭 전에 색인 문서를 배송하도록 서버에 지시할 수 있어요.

흐름 제어

스트림별 및 연결별 WINDOW_UPDATE는 느린 소비자가 발신자를 침수시키는 것을 방지해요 — 와이어 형식에 내장된 백프레셔.

ALPN 협상

TLS 계층 ALPN이 자동으로 h2를 협상해요 — 클라이언트와 서버는 첫 번째 요청 전에 HTTP/2에 동의하며, 피어가 사용하지 않으면 HTTP/1.1 폴백이 있어요.

HTTP/2를 통한 WebSocket

RFC 8441: 하나의 HTTP/2 스트림 내부에 WebSocket 세션을 터널링해요 — 모든 HTTP/2 인식 로드 밸런서(Envoy, nginx, ALB, GCLB)를 통해 실행돼요.

트레일러 & gRPC 친화적

HTTP 트레일러(RFC 7230에 따라)는 일류예요 — gRPC의 상태 / 메시지 메타데이터의 기반.

다중화된 GET 요청

단일 연결에서 10개의 동시 GET을 발사하세요 — HPACK과 다중화가 이것을 일상적으로 만들어요.

uses
  sgcHTTP2_Client, sgcHTTP_Classes;

var
  HTTP2: TsgcHTTP2Client;
  i: Integer;
begin
  HTTP2 := TsgcHTTP2Client.Create(nil);
  HTTP2.Host := 'api.example.com';
  HTTP2.Port := 443;
  HTTP2.TLS  := True;
  HTTP2.TLSOptions.ALPNProtocols.Add('h2');
  HTTP2.OnResponse := DoResponse;

  HTTP2.Connect;

  // 10 concurrent GETs on ONE connection, ONE TLS handshake
  for i := 1 to 10 do
    HTTP2.Get(Format('/items/%d', [i]));
end;

procedure TForm1.DoResponse(Sender: TObject;
  const aStreamId: Cardinal;
  aHeaders: TsgcHTTP2Headers;
  aData: TBytes);
begin
  Memo1.Lines.Add(Format('stream %d  status %s  bytes %d',
    [aStreamId, aHeaders.Status, Length(aData)]));
end;

클라이언트가 요청하기 전에 하위 리소스 푸시하기

OnCommandGet 핸들러 내부에서 PushPromise를 호출하여 /index.html과 함께 /style.css를 사전에 보내세요.

uses
  sgcWebSocket, sgcHTTP_Classes;

procedure TForm1.WSServerCommandGet(Sender: TObject;
  aContext: TsgcWSConnection;
  ARequestInfo: TsgcWSRequestInfo;
  AResponseInfo: TsgcWSResponseInfo);
begin
  if ARequestInfo.URI = '/index.html' then
  begin
    // Push the CSS so the browser doesn’t round-trip for it
    AResponseInfo.PushPromise('/style.css');
    AResponseInfo.PushPromise('/app.js');

    AResponseInfo.ContentType := 'text/html; charset=utf-8';
    AResponseInfo.ContentText :=
      '<!doctype html><link rel="stylesheet" href="/style.css">' +
      '<script src="/app.js" defer></script>' +
      '<h1>HTTP/2 from Delphi</h1>';
  end;
end;

HTTP/2가 선택이 아닌 필수인 곳

Apple Push Notifications

APNs는 HTTP/2만 수락해요 — 하나의 영구 연결, 초당 수천 개의 스트림, JWT 또는 인증서 기반 인증. Apple Push 페이지를 참조하세요.

Google FCM v1

HTTP v1 FCM API는 HTTP/2에서 실행돼요. Google FCM 페이지를 참조하세요.

gRPC 서비스

gRPC는 protobuf 및 트레일러가 있는 HTTP/2예요. 여기의 HTTP/2 스택은 Pascal gRPC 클라이언트가 구축하는 기반이에요.

HTTP/2를 통한 WebSocket

업스트림에 HTTP/2를 선호하는 최신 로드 밸런서 및 CDN을 통해 WebSocket을 배포하는 가장 깨끗한 방법.

고처리량 REST 클라이언트

하나의 연결, 수백 개의 비행 중 요청 — 크롤러, 시장 데이터 수집기 및 팬아웃 워커에 이상적.

롱 폴링 대체

단일 HTTP/2 스트림을 통해 JSON-lines 또는 SSE 스타일 응답을 스트리밍하세요 — 백프레셔 포함.

자세히 알아보기

HTTP/2 참조

HTTP/2 클라이언트 및 서버에 대한 전체 컴포넌트 참조.

HTTP/2 클라이언트

전용 클라이언트 컴포넌트 페이지.

HTTP/2 서버

전용 서버 컴포넌트 페이지.

WebSocket 컴포넌트

HTTP/2를 통한 WebSocket(RFC 8441) 및 HTTP/1.1을 통한(RFC 6455).

블로그: HTTP/2 초기 서버 지원

원래 발표 및 디자인 노트.

블로그: HTTP/2 vs HTTP/1 성능

다중화 및 HPACK 이득에 대한 벤치마크 수치.

블로그: HTTP/2 적합성 테스트

서버에 대해 h2spec 스위트 실행.

블로그: HTTP/2를 통한 APNs

실용적인 HTTP/2 예: APNs 알림.

오늘 요청을 다중화하세요

체험판을 다운로드하세요 — HTTP/2 클라이언트 및 서버 데모 모두 즉시 컴파일돼요.