Webship ブログに戻る

Webship エンジニアリング

Webship:世界で最もRFC互換性のあるウェブサーバー

WebshipはRFCの要件をHTTP/1.1、HTTP/2、HTTP/3、QUIC、TLS、キャッシュ、リバースプロキシ、WebTransport、ACME、および新しいQUERYメソッドにわたる明示的な動作に変換します。完全な52本のRFC標準マップを確認してください。

ウェブは正確な取り決めによって成り立っています。Content-Length フィールドは、どの中継点でも同じ意味でなければなりません。キャッシュは、検証が必要なレスポンスを再利用してはいけません。不正な HTTP/3 フィールドセクションは、正しい範囲で失敗しなければなりません。安全なメソッドは、リバースプロキシを通過した後も安全でなければなりません。

Webship 1.3.1 は一つのルールを中心に作られています:バイトが意味を保つときだけ、速度が重要です。

だからこそ、私たちはWebshipを世界で最もRFC互換性の高い汎用ウェブサーバーとして説明しています。これはすべてのRFCのすべてのオプション機能が存在するという主張ではなく、境界が明確に見える工学的な主張です。下のマップには、Webshipのアクティブなサーバーの挙動や、それが所有するプロトコルの基盤に影響を与える52のRFCが示されています。現在の標準が最初に掲載されており、置き換えられた文書は互換性の系譜として特定されています。ドラフト仕様はRFCとして再ラベルされません。

互換性は行動であり、バッジではない

Webshipは、運用サーバーが最も曖昧になる場所で基準を適用します:

  • HTTP/1.1 フレーミングは、矛盾する長さ、無効な転送コーディング、過大なリクエストターゲット、不正なチャンク、およびリクエスト・スマグリングの形状を拒否します。
  • HTTP/2 と HTTP/3 は禁止された接続フィールドを拒否し、擬似フィールドを検証し、圧縮フィールドセクションの境界を設定し、ストリームのエラーを接続エラーから分離して保持します。
  • 静的ファイルは、HEAD のセマンティクス、バリデータ、前提条件の順序、バイト範囲、リダイレクト、およびコンテンツタイプを保持します。
  • リバースプロキシは、フレーミング、キャンセル、トレーラー、アップグレード、安全な再試行、および転送先の識別を保持しつつ、ホップごとのフィールドを除去します。
  • キャッシュはキャッシングを単なるキーと値のショートカットとして扱うのではなく、年齢、新鮮さ、再検証、Vary、無効化、および古い使用ルールを計算します。
  • TLS、QUIC、ACME、アーリーデータ、およびWebTransportは、有界状態と明示的な失敗方針を使用します。

高速パスでも同じルールが適用されます。Webshipは「正しい」パスと異なるベンチマークパスを定義していません。

HTTP のセマンティクス、フレーミング、キャッシュ、およびプロキシ

  • RFC 3986 — ユニフォームリソース識別子 (URI): 一般的構文。Webshipは、キャッシュの無効化の判断を行う前に、ドット区切りを含む相対的なLocationおよびContent-Location参照を正規化します。
  • RFC 6455 — WebSocket プロトコル。リバースプロキシのアップグレードは、WebSocket キー、Accept 値、サブプロトコル、拡張、およびトンネルの遷移を検証します。
  • RFC 6585 — 追加のHTTPステータスコード。オーバーサイズのリクエストフィールドには、HTTPレスポンスがまだ可能な場合、定義された431レスポンスが使用されます。
  • RFC 6797 — HTTP Strict Transport Security。Strict-Transport-Security は安全なトランスポート上でのみ送信され、トランスポートに依存しないキャッシュエントリから平文の HTTP に漏れることはありません。
  • RFC 7235 — HTTP/1.1 認証。認証スキームトークンは保護された MCP コントロールサーフェスを含め、大文字小文字を区別せずに解析されます。その一般的な HTTP セマンティクスは現在 RFC 9110 にあります。
  • RFC 7239 — Forwarded HTTP 拡張。オペレーターは、標準ベースの Forwarded フィールド、従来の X-Forwarded フィールド、両方、またはどちらも選択できます。信頼できない受信アイデンティティフィールドは最初に削除されます。
  • RFC 7540 — HTTP/2。これはHTTP/2互換性の系列として保持されています。現在使用されているHTTP/2の仕様はその後継であるRFC 9113です。
  • RFC 7541 — HPACK: HTTP/2のヘッダー圧縮。Webshipが所有するHTTP/2スタックは、HPACKワイヤーフォーマットとハフマン符号化を維持しながら、デコーダ状態とエンコーダテーブルの境界を管理します。
  • RFC 7838 — HTTP代替サービス。Alt-Svcは、URLで表されるオリジンを変更せずにHTTP/3エンドポイントを広告します。
  • RFC 8441 — HTTP/2でのWebSocketsのブートストラップ。Webshipは下流のextended-CONNECTネゴシエーション基盤をサポートしています。HTTP/1.1アップストリームがHTTP/2 extended CONNECTを実装していると装うことはありません。サポートされていないアップストリームの組み合わせは明示的に失敗します。
  • RFC 8470 — HTTPでのEarly Dataの使用。Webshipが処理しない早期リクエストは、安全でないリプレイの前提で処理されるのではなく、425 Too Earlyを受け取ります。
  • RFC 8941 — HTTPの構造化ヘッダーフィールドの値。HTTPの優先度値は構造化フィールド辞書の解析を使用する。不正なオプションフィールドは全体として無視される。
  • RFC 9110 — HTTPセマンティクス。メソッド、ステータスコード、フィールド、バリデーター、前提条件、リダイレクト、コンテンツメタデータ、HEAD、CONNECT、OPTIONS、およびレンジセマンティクスは、プロトコルバージョン間で1つの現在の契約を共有します。
  • RFC 9111 — HTTPキャッシング。Webshipは、修正済みAge、明示的な鮮度、Vary、only-if-cached、must-revalidate、proxy-revalidate、安全な古いキャッシュの使用、および有効なURIと関連するURIの無効化を実装しています。
  • RFC 9112 — HTTP/1.1。リクエストライン、フィールド、ボディ長、転送符号化、チャンク、トレーラー、永続性、およびクローズ区切りのルールは、アプリケーションディスパッチの前に適用されます。
  • RFC 9113 — HTTP/2。擬似フィールドの順序、権限、禁止されている接続フィールド、TE制限、ストリームライフサイクル、フロー制御、GOAWAY、およびエラー範囲は、Webship所有のH2パスによって処理されます。
  • RFC 9114 — HTTP/3。Webshipは、そのHTTP/3サーバーで使用されるリクエスト、コントロールストリーム、SETTINGS、クリティカルストリーム、キャンセル、およびストリーム対接続のエラーパスを所有します。
  • RFC 9204 — QPACK: HTTP/3用フィールド圧縮。動的テーブルの容量は通知された制限によって制約され、命令ストリームは容量がゼロでも解析可能なままであり、無効な状態は必要なQPACKエラーとなる。
  • RFC 9218 — HTTPのための拡張可能な優先付けスキーム。緊急性と漸進的配信は、優先度のパラメータが未定の場合にも拡張可能な形で、HTTP/3のスケジューリングを案内する。
  • RFC 9220 — HTTP/3でのWebSocketsのブートストラップ。Webshipは、現代のトンネル化プロトコルで使用されるHTTP/3拡張CONNECT SETTINGSの基盤を実装しています;これはすべての可能なCONNECTプロトコルが受け入れられることを意味するわけではありません。
  • RFC 9297 — HTTP データグラムとカプセルプロトコル。WebTransport セッションは、境界付きカプセルデコーディングと HTTP データグラムの関連付けを使用し、未知のカプセルはパーサーの失敗ではなく拡張ポイントとして処理されます。
  • RFC 9421 — HTTPメッセージ署名。オプションのEd25519レスポンスプロヴェナンスは、TLSやアプリケーション認証を置き換えることなく、Webshipのリリースおよび構成のIDをカバーできます。
  • RFC 10008 — HTTP QUERY メソッド。Webship は QUERY を安全かつ冪等として扱い、プロキシを通す際にその本文を保持し、キャッシュ識別に本文および表現メタデータを含め、ヒューリスティックな鮮度判定を禁止し、条件付きおよび範囲指定の動作をサポートし、QUERY が使用されたという理由だけでキャッシュを無効化することはありません。

QUICのトランスポートと輻輳制御

TLS、証明書、自動証明書管理

WebTransport:標準化されていることについて正確に

HTTP/3 上の WebTransport は、53 番目の RFC としては数えられません。Webship 1.3.1 の時点では、そのワイヤーマッピングは draft-ietf-webtrans-http3-16 のままです。Webship は標準化された HTTP/3、拡張 CONNECT、QUIC DATAGRAM、HTTP Datagram、および上記の Capsule レイヤーの上にそのドラフトを実装しています。また、WebTransport ストリームがリセットされるときに信頼できるセッション識別プレフィックスを保持するために必要な、交渉された RESET_STREAM_AT 拡張も実装しています。

その区別は重要です。ドラフトをRFCと呼ぶことでは、標準の互換性は向上しません。それは、ドラフトを明示的に追跡し、通常のHTTPパスから分離し、すべての拡張を交渉し、すべてのセッションリソースを制限し、キャンセルおよび障害の挙動をテストすることで向上します。

なぜこの幅広さが生産において重要なのか

標準のバグはめったに単独では発生しません。不正な HSTS の処理はキャッシュの境界を越えることがあります。不正な QPACK 命令は無関係なリクエストを終了させることがあります。安全でない early-data の仮定は操作を再実行させる可能性があります。リクエストボディを省略した QUERY キャッシュキーは別のクエリの結果を返すことがあります。トレーラーを削除したりキャンセル処理を誤ったプロキシは、アプリケーションプロトコルを静かに変更する可能性があります。

Webshipのアーキテクチャは、これらを関連する問題として扱います。パーサーの制限、セキュリティ検査、キャッシュ、リバースプロキシ、トランスポート状態、計測は明示的な契約を共有します。その結果、各モードに異なる正確性の定義を与えることなく、HTTP/1.1、HTTP/2、HTTP/3、静的配信、リバースプロキシ、ストリーミング、WebTransportの間を移動できる1つのサーバーが実現します。

主張を確認する

最上級の表現を鵜呑みにしないでください。まず[Webship 1.3.1 のドキュメント](/docs/1.3.1)を読み、設定やプロトコルの境界を確認し、公開されている動作を再現してください。その後、[Webship をダウンロード](/downloads)して、システムにとって重要なエッジケースをテストしてください。