HTTPが全てを飲み込む(前編)~HTTPの2層構造と、HTTP Semanticsとは何か?

今回は「HTTPが全てを飲み込む(前編)~HTTPの2層構造と、HTTP Semanticsとは何か?」についてご紹介します。

関連ワード (ホップ、先頭、小文字等) についても参考にしながら、ぜひ本記事について議論していってくださいね。

本記事は、Publickey様で掲載されている内容を参考にしておりますので、より詳しく内容を知りたい方は、ページ下の元記事リンクより参照ください。


Webを構成する重要な要素の1つであるHTTPは、その最新仕様で2層構造となり、バージョンに関係なく使えるSemanticsと、特徴の異なる通信仕様を定めたHTTP/1.1、2、3に分割されました。

さらに現在では、HTTPの上にあらためてUDPやIP、イーサネットなどのプロトコルを実装する提案が行われており、まさにHTTPは通信の全てを飲み込む勢いで進化しつつあります。

こうしたHTTPの最新動向の解説が、大手CDNベンダのFastlyが2023年11月8日開催したイベント「Yamagoya 2023」で同社シニアプリンシパルエンジニアの奥一穂氏が行ったセッション「HTTPが全てを飲み込む」にて行われました。

本記事ではこのセッションをダイジェストで紹介していきます。記事は以下の3つに分かれています。

  • HTTPが全てを飲み込む(前編)~HTTPの2層構造と、HTTP Semanticsとは何か?
  • HTTPが全てを飲み込む(中編)~HTTPの上にIPやイーサネットが実装されて便利になること
  • HTTPが全てを飲み込む(後編)~アップロードのレジューム機能標準化など開発中の新機能

今お読みの記事は「HTTPが全てを飲み込む(前編)~HTTPの2層構造と、HTTP Semanticsとは何か?」です。

HTTPが全てを飲み込む

Fastly シニアプリンシパルエンジニア 奥一穂氏。

皆さん、こんにちは。今日は「HTTPが全てを飲み込む」というタイトルで、チェコ共和国のプラハから話をしたいと思ってます。

fig

なぜ私がプラハに来ているのかというと、IETFの総会に参加しているためです。

IETFは「Internet Engineering Task Force」といって、インターネットを管理しているIANA(Internet Assigned Numbers Authority)という団体の下部組織です。

インターネットで使われる通信プラットフォーム、TCPとかIPとかHTTPとか、そういったものを標準化している団体です。

この団体の118回目の総会が先週末から始まっています。まずハッカソンを2日間やって、通信プロトコルの実装や相互運用試験をやりました。

その後今週金曜日まで会議をやって、既存の仕様のメンテナンスであったり新しいものの開発であったり、そういうことをやっています。

fig

今日はそういった中で、HTTPを中心に今何が起きているのか、という話をさせていただきたいと思います。

HTTP Semanticsとは何か?

まず、HTTP Semanticsとは何か、について改めて整理したいと思います。

従来のHTTP/1.1に対して、2015年にHTTP/2をRFC7540という形で定義したときは、HTTP/1.1との差分を定義する形でした。

そして2022年の6月に新しいRFCが出まして、この中でHTTPの意味論、つまりSemanticsと、通信手段であるHTTP/1.1、2、3を分離しました。

具体的にSemanticsとは何か。これはRFC 9110のドキュメントの中で、「aspects of the protocl that are shared by all versions」つまり、プロトコルのバージョンに依存しない特性のことである、それを「Semantics」と呼ぶと定義されています。

fig

ではここで、4択クイズです。次のものはHTTP Semanticsに含まれるでしょうか?

まず「HTTメソッド」。これはSemanticsでしょうか、それとも各バージョン依存の機能でしょうか。

fig

難しいと思った人は、フィフティフィフティを言ってくれてもいいんですよ(笑)。

はい、そうですね、HTTPメソッドはどのHTTPバージョンでも使える、ですからSemanticsに含まれる機能です。

fig

では次、「ステータスコード」。これはSemanticsでしょうかそれとも各バージョンの機能でしょうか?

fig

もちろんこれもSemanticsに含まれます。HTTPステータスコードはどのバージョンでも使えます。

fig

では次、「Content-Type」はどうでしょう。

fig

もちろんどのバージョンでも使えますね、Semanticsに含まれています。

fig

では次、「Cache-Control」はSemanticsにに含まれているでしょうか? それともバージョン依存でしょうか。

fig

もちろんCache-ControlもSemanticsに含まれています。

fig

HTTP Cache-Controlは正確に言うと、HTTP Semanticsの上に乗っている機能といったら良いのかもしれないですね。

fig

では「Connection:close」、これはSemanticsに含まれているでしょうか?

fig

はい。これは含まれていません。Connection:closeというのは、HTTP/1.1専用のヘッダで、HTTP/1.1接続の終了を意味します。

fig

HTTP/2とHTTP/3では、GOAWAYフレームという別の方式を使って、接続の終了を宣言します。

では次、「Transfer-Encoding:chunked」。これはSemanticsに含まれるでしょうか?

fig

これも含まれません。

fig

では最後に、Content-Lengthはどうでしょう?

fig

Content-Lengthは、Semanticsに含まれています。Content-Lengthヘッダはボディのサイズを表します。HTTP/2でも3でも同じ機能を持ちます。

fig

もし、Content-Lengthが実際に受信したデータのサイズと違えば、それはボディが壊れているということです。受信者はボディが壊れてる以上HTTPメッセージを破棄すべきですが、ただ実際には先頭からストリーミングで処理していたりとかそういったことがあるかもしれないから、破棄できないこともありますね。

HTTP/1.1においては、Content-Lengthヘッダはたまたま違う目的のためにも使われます。それは次のHTTPメッセージの開始位置を特定するためにも使われる、ということです。

ただ、そういった特性があるからといって、Content-Lengthヘッダはバージョン依存なわけではなくて、あくまでもどのバージョンでもボディのサイズを表します。ですからContent-Lengthは、Semanticsに含まれています。

表を見てみましょう。

fig

ほとんどのヘッダはSemanticsです。一方で、keep-aliveであるとか、upgrade、transfer-encoding、こういったものはHTTP/1.1専用で、upgradeはHTTP/2以降では廃止され、またkeep-aliveやtransfer-encodingはHTTP/2や3では、フレームとFINという別の方式に切り替わっています。

Semanticsは維持されるが、通信プロトコルは変化する

でもここで「ほとんど」というのはちょっと曖昧ですよね。どういうことなんでしょうか?

これを考えるためにはまず、プロキシの動作に注目してみましょう。

こちらは私どもが使ってるh2oというHTTPプロキシの動作を表している概念図です。

fig

これはクライアントからHTTPリクエストを受け取ると、それがHTTP/1.1であれHTTP/2であれHTTP/3であれ、まず内部的なHTTP Semanticsの表現に変換し、そして次にこれをサーバーに送るときにHTTP/1.1、2、3のいずれかの方式でエンコードして送り出すという形になります。

HTTP/3で入ってきたリクエストがHTTP 1.1で出ていくかもしれません。

このようにSemanticsは維持されますが、通信プロトコルは変化します。ただ1つ例外があって、HTTP/1.1のヘッダ名における大文字小文字だけは、われわれは維持するようにしています。

なぜかというと、昔のアプリケーションで、HTTP/1.1で例えばContent-LengthヘッダのCは大文字じゃないと動かない。そういったアプリケーションがどうしてもあるので、互換性維持のために大文字小文字情報は維持するようにしています。

ですがHTTP/2と3ではヘッダは常に小文字で転送する規格になっていますので、このことを踏まえると、お客様のアプリケーションも全部小文字でも受け、動くようにしていくべきだ、と言えるかと思います。

ホップとエンドツーエンド

そしてFasltyの中でHTTPを中継しているのはh2oだけではありません。

例えばクライアントから入ってきたHTTP/3クエストを最初にh2oが受けて、それを別のh2oに転送され、次にvarnishに転送され、それがまたh2oに転送されて、またvarnishに転送され、最後にオリジンに届く、そういった複数のホップをポンポン飛んでいくということも実際に起こりますし、またその中で使われるHTTPのバージョンがそれぞれ違うこともあります。

fig

この1つ1つ飛んでいくことをホップ(hop)といい、それに対してリクエストを最初に発したクライアントと、リクエストを最終的に受け取ってレスポンスを作るオリジン、この2つの間の通信のことをエンドツーエンド(end-to-end)という呼び方をします。

fig

この図を見ていただければわかるように、HTTPのバージョンはホップごとに決まるものです。

また一部のHTTP/1.1.専用のヘッダでこれもホップごとの変化になるわけです。なぜならHTTPのバージョンがホップごとに決まるからです。

それに対して、メソッド、ステータス、多くのヘッダは、エンドツーエンドでHTTPのバージョンに関係なく使われるものとなっています。

HTTP Semanticsのまとめ

ということで、先ほどの表に戻ってくると、この「ほとんどのヘッダ」とは、実はエンドツーエンドで使えるヘッダのことである、ということが分かります。

それに対して、keep-alive、upgrade、transfer-encoding、これらはHTTP 1.1のホップバイホップの機能である。そういうふうに理解を整理すると良いでしょう。

fig

HTTP Semanticsのまとめです。

fig

HTTP SemanticsはHTTPバージョンに依存しない機能です。Semanticsはエンドツーエンドであり、ホップをまたいで使います。ただし、もちろんプロキシはリクエストを書き換えることはあります。

これに対してHTTP/1.1にはホップバイホップヘッダがあって、それでさまざまな制御を行っています。HTTP/2、3においては、ホップバイホップヘッダがない代わりに、フレームというものを使ってさまざまな制御を行っています。

新しいHTTPアプリケーションは、HTTP Semanticsの機能のみを使って書くべきです。そうすることで今後、HTTP/4や5が出てきたとしても互換性が確保されるからです。

≫中編に続く:HTTPの上にIPやイーサネットが実装されて便利になること

COMMENTS


Recommended

TITLE
CATEGORY
DATE
5Gの現状と今後–次世代モバイル通信規格の利用状況と進化を追う
IT関連
2022-03-05 19:12
セーフィーのウェアラブルカメラSafie Pocket2を千葉県八千代市消防本部が試験導入、訓練形式の人命救助実証試験
IT関連
2022-03-10 02:01
敷島製パン、基幹システムをクラウド移行–マルチクラウドの利用など見据え
IT関連
2023-05-14 10:37
海賊、麻薬、汚染、違法漁業など海上監視に最適化された産業ドローン用AI特化のTekeverが約26億円調達
IT関連
2022-02-08 01:57
AI与信管理サービスのアラームボックス、リコージャパンと協業開始
IT関連
2022-12-17 10:41
画像認識AIで路面凍結を発見、降雪時の視界不良も測定 新潟で実証実験
ロボット・AI
2021-02-16 22:46
Amazon上のFBA店を大量に買い漁るThrasioがさらに約790億円調達
ネットサービス
2021-02-17 07:09
「アナ雪」のCG技術やGMのシートベルト開発研究で60年前のディアトロフ峠事件の謎に迫る
その他
2021-02-01 22:10
中国の配車サービスDidiが新型コロナワクチン接種支援で10.4億円の基金を設立
モビリティ
2021-01-24 07:43
WebAssemblyの「WASI Preview 2」で、WebAssemblyコンポーネントの組み合わせによるアプリケーション開発を実現へ
WebAssembly
2023-02-09 11:40
無線ライブ配信に対応したミラーレス一眼、パナソニック「GH5 II」登場 撮影の時間制限なし
くらテク
2021-05-27 18:59
米運輸省が政府GPSを置き換えられるか11社を評価、全ユースケースに対応できたのは1社だけ
セキュリティ
2021-01-18 17:31
日本初のフリマアプリ「FRIL」創業者、今度は「家計簿アプリ」で起業 「日本一になれなかった悔しさ」ばねに (1/3 ページ)
くわしく
2021-07-17 14:53
主要6カ国の中小企業の中で44%がサイバー攻撃を経験–マカフィー調査
IT関連
2024-01-25 11:35