HTTP/2 プロトコル

Delphi および C++Builder 向けのネイティブ HTTP/2 クライアントとサーバーです。バイナリフレーミング、ストリーム多重化、HPACK ヘッダー圧縮、ALPN ネゴシエーションを備え、IIS、Apache、Indy への依存はありません。

必要な側を選択できます

本番運用に対応した 2 つのコンポーネントが、HTTP/2 (RFC 9113) のワイヤープロトコルを完全に実装しています。クライアントは HTTP/2 API を利用するために、サーバーは HTTP/2 API を公開するために使用します。同じアプリケーション内で両方を併用することも可能です。

TsgcHTTP2Client

ネイティブな HTTP/2 クライアントです。単一の TLS 接続上で GET/POST/PUT/DELETE を多重化し、HPACK によるヘッダー圧縮、ALPN による h2 へのアップグレード、または事前知識モードでの h2c、サーバープッシュの処理、Bearer / Basic / NTLM 認証をサポートします。

HTTP/2 クライアントを開く →

TsgcWebSocketHTTPServer

ネイティブな HTTP/2 サーバーです。同じ WebSocket HTTP サーバーが、1 つの TLS ポート上で HTTP/1.1、HTTP/2 (h2)、WebSocket を提供します。ALPN ネゴシエーション、ストリーム多重化、HPACK レスポンス、オプションの RFC 8441 による WebSocket-over-HTTP/2 ブートストラップに対応します。

HTTP/2 サーバーを開く →

sgcWebSockets における HTTP/2

HTTP/2 フレーミングをクライアントと WebSocket HTTP サーバーの両方に組み込んだ、本格的な実装です。

標準仕様

HTTP/2 (RFC 9113)

コンポーネント

TsgcHTTP2Client
TsgcWebSocketHTTPServer

プラットフォーム

Windows、macOS、Linux、iOS、Android

エディション

クライアント: Standard / Pro / Enterprise
サーバー: Pro / Enterprise

HTTP/2 がもたらすメリット

HTTP/1.1 に対する HTTP/2 のすべての利点を、ネイティブな Delphi / C++Builder コードで利用できます。別の Web サーバーを起動する必要はありません。

バイナリフレーミング

リクエストとレスポンスはバイナリフレームに分割され、決定的なステートマシンによって解析されます。テキスト行のパースや HTTP/1.1 のあいまいさはもう必要ありません。

ストリーム多重化

処理中の多数のリクエストが 1 つの TCP/TLS 接続を共有します。HTTP レイヤーでヘッドオブラインブロッキングが発生せず、リクエストごとに追加のソケットを必要としません。

HPACK ヘッダー圧縮

HPACK エンコーダー / デコーダーを標準搭載しています (RFC 7541)。Cookie、認証トークン、Content-Type ヘッダーなど繰り返し送信される値は、初回リクエスト以降はほぼゼロバイトのコストで送信できます。

ALPN ネゴシエーション

TLS ハンドシェイク中に相手側が h2http/1.1 をアドバタイズし、ネゴシエートされた ALPN 値によってプロトコルが選択されます。ラウンドトリップを無駄にしません。

事前知識モードの h2c

信頼できる内部リンクやサービスメッシュのサイドカーでは、双方が ALPN をスキップし、HTTP2_PriorKnowledge を介して平文で HTTP/2 を開始できます。

サーバープッシュ

サーバーはプロアクティブに PUSH_PROMISE レスポンスを送信できます。クライアントはそれらを OnHTTP2StreamData を通じてキャッシュ用に取得します。注意: 公開 Web では非推奨ですが、内部利用では引き続き有用です。

ストリーム優先度制御

ストリームごとの優先度と依存関係のヒントにより、認証、ナビゲーション、JSON-RPC の結果などの重要なレスポンスを、同じ接続上でバルク転送よりも優先して処理できます。

フロー制御

ストリーム単位および接続単位の WINDOW_UPDATE フロー制御により、1 つの大きなレスポンスが小さなレスポンスを枯渇させることを防ぎます。SETTINGS フレームで調整可能です。

OpenSSL または SChannel による TLS

TLSOptions.IOHandleriohSChannel に設定すれば Windows カーネル TLS (DLL 不要)、iohOpenSSL に設定すればクロスプラットフォームで TLS 1.2/1.3 を完全にサポートします。

HTTP/2 が真価を発揮する場面

HTTP/2 の多重化と HPACK による削減効果がすぐに得られる、すぐに導入できるシナリオです。

Apple Push Notifications

Apple の APNs プロバイダー API は HTTP/2 を必須とします。TsgcHTTP2Client はトークンベース認証で Apple Push コンポーネントをエンドツーエンドで駆動します。

Firebase Cloud Messaging

Google の FCM HTTP v1 API は HTTP/2 上で動作します。同じコンポーネントが、サービスアカウントの JWT 発行により FCM を駆動します。

モダンな REST & JSON API

ほとんどのクラウド API (Stripe、GitHub、Cloudflare、Google、Azure…) はデフォルトで HTTP/2 を話します。多重化対応クライアントは並列呼び出しのレイテンシを削減できます。

サービス間通信

サイドカーメッシュの背後にある内部マイクロサービスでは、HTTP/2 の事前知識モード (h2c) を利用して、数百の RPC ストリームを 1 つのソケット上で多重化できます。

1 つのポートで WebSocket + HTTP/2

TsgcWebSocketHTTPServer は単一の TLS エンドポイント上で HTTP/1.1、HTTP/2、WebSocket を提供します。ALPN が各接続を自動的にルーティングします。

RFC 8441 WebSocket over HTTP/2

WebSocket フレームを HTTP/2 ストリーム内にトンネリングしたいクライアント向けに、サーバー側で Specifications.RFC8441 を有効化できます。

数行で実現するクライアントとサーバー

コンポーネントを配置し、TLS を設定するだけで動作します。ハンドシェイク中に ALPN が h2 を自動でネゴシエートします。

uses
  sgcHTTP, sgcHTTP2;

var
  HTTP2: TsgcHTTP2Client;
begin
  HTTP2 := TsgcHTTP2Client.Create(nil);
  HTTP2.TLSOptions.IOHandler := iohSChannel; // または iohOpenSSL
  HTTP2.TLSOptions.Version   := tls1_2;

  // カスタムヘッダーを追加 (HPACK で圧縮されます)
  HTTP2.Request.CustomHeaders.Add('authorization: Bearer eyJ...');

  // HTTP/2 経由の GET (ALPN が h2 をネゴシエート)
  Memo1.Text := HTTP2.Get('https://api.example.com/v1/items');
  ShowMessage(IntToStr(HTTP2.Response.Status));
end;
uses
  sgcWebSocket;

var
  Server: TsgcWebSocketHTTPServer;
begin
  Server := TsgcWebSocketHTTPServer.Create(nil);
  Server.Port := 443;
  Server.SSL  := True;
  Server.SSLOptions.CertFile := 'cert.pem';
  Server.SSLOptions.KeyFile  := 'key.pem';

  // HTTP/1.1、HTTP/2、WebSocket を同じ TLS ポートで提供
  Server.Specifications.HTTP    := True;
  Server.Specifications.HTTP2   := True;
  Server.Specifications.RFC6455 := True;

  Server.Active := True;
end;
// uses: sgcHTTP, sgcHTTP2
TsgcHTTP2Client *HTTP2 = new TsgcHTTP2Client(this);
HTTP2->TLSOptions->IOHandler = iohSChannel;
HTTP2->Request->CustomHeaders->Add("authorization: Bearer eyJ...");
Memo1->Text = HTTP2->Get("https://api.example.com/v1/items");

仕様 & 参考資料

これらのコンポーネントが実装するプロトコルの一次情報源です。

ドキュメント & デモ

コンポーネントページ、オンラインヘルプ、トライアルに同梱されているすぐに実行できるデモプロジェクトへのディープリンクです。

HTTP/2 クライアント — TsgcHTTP2Client コンポーネントページ: クライアントの機能、コードサンプル、TLS オプションを紹介します。
HTTP/2 サーバー — TsgcWebSocketHTTPServer コンポーネントページ: 1 つの TLS ポート上で HTTP/1.1 や WebSocket と並行して HTTP/2 を有効化する方法を解説します。
オンラインヘルプ — HTTP/2 HTTP/2 コンポーネントのプロパティ、メソッド、イベントの完全なリファレンスです。
デモプロジェクト — Demos\20.HTTP_Protocol\01.HTTP2_Server_And_Client すぐに実行できるサンプルプロジェクトです。sgcWebSockets パッケージに同梱されています。下記からトライアルをダウンロードしてください。
ユーザーマニュアル (PDF) ライブラリ内のすべてのコンポーネントを網羅する包括的なマニュアルです。

HTTP/2 を使う準備はできていますか?

無料トライアルをダウンロードして、多重化された HTTP/2 のクライアントとサーバーの通信を Delphi アプリケーションに追加しましょう。