LoginSignup
0
0
この記事誰得? 私しか得しないニッチな技術で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

HTTP深掘りしてみた[HTTP/1.1とかHTTP/2って何が違うの?]

Last updated at Posted at 2024-06-17

はじめに

今後なんらかの場面で絶対に聞かれるであろう

  • HTTP/3ってなんですか?
  • HTTP/3とHTTP/2は何が違うんですか?
  • HTTP/1.1と比較してHTTP/2って何がいいんですか?

といった質問に答えられるように、HTTPについて調べてみました。
特に参考にした文献は以下のとおりです。

以上は情報源として一定の信頼があるため、これらを参考にしました。

対象読者

  • サービスの開発などに慣れてきて、HTTPの恩恵を預かってはいるものの、中身をほとんど理解していない人

自分のレベルとしては、Nextjsで書いたサービスをCloudflareを用いてローカルでドメイン公開できる程度です。サービス開発の知識はある程度溜まっているものの、その下で動いているHTTPの仕組みについてはほとんど理解していません。

HTTP/3ってなんですか?

  • QUICというプロトコルをTCPの代わりにトランスポート層のプロトコルとして用いる
  • QUICはGoogleが開発したプロトコルで、UDP上で動作する
  • 2022年10月時点で26%のサイトがHTTP/3をサポートしている
  • HTTP/2は1つのTCPコネクションで動作するため、TCPによるパケットロス検知や順序制御が全てのストリームをブロックしてしまうという課題があった
  • QUICは複数のストリームをUDP上で走らせ、ストリームごとにパケットロス検知と順序制御を行うことで、全てのストリームをブロックすることなく通信を行うことができる

QUICについて

  • TCPはオプションとしてTLSを用いるが、QUICは最初のハンドシェイクの時点でTLSを組み込んでいる
  • 最初からTLSを組み込んでいるため、QUICTLSを用いるかどうかについて通信を行う必要がなく、通信のセットアップに必要なメッセージ数が少なくなる
  • 複数のストリームをUDP上で走らせ、ストリーム単位でパケットロス検知と順序制御を行うため、全てのストリームをブロックすることなく通信を行うことができる

HTTP/3とHTTP/2は何が違うんですか?

  • HTTP/3はトランスポート層のプロトコルとしてUDPをベースとしたQUICというプロトコルと用い、HTTP/2はTCPを用いる
  • HTTP/2は複数のストリームが1つのTCPコネクションで動作するため、1つのストリームで発生したパケットロス検知や順序制御によって全てのストリームがロックされる。一方で、QUICはそれぞれのストリームにパケットロス検知と順序制御機能を提供するため、影響範囲はそのストリームに限定される
  • TCPと異なり、QUICは最初のハンドシェイクでTLSを要求するため、セットアップに必要なメッセージの数が少ない

HTTP/1.1と比較してHTTP/2って何がいいんですか?

HTTP/1.1の課題

  • HTTP/1.1はリクエストを受けた順番でしかレスポンスを返すことができない
    • 下図に示すように、リクエスト1のレスポンスが遅い場合、リクエスト2,3のレスポンスも遅れる
    • 一応、並列化する方法もありそれはTCPコネクションを複数張ることだが、これは非常に遅い上に多くのブラウザは同時に複数のTCPコネクションを張ることを制限している(Chromeは6つまで)[参考:Using Multiple TCP Connections]
  • 似たようなヘッダーを繰り返し送信するため、オーバーヘッドが大きい

HTTP/2で提案された解決策

  • HTTP/2は1つのTCPコネクションで複数のストリームを扱うことができる
    • それぞれのストリームは独立しており、Request1,2,3はそれぞれのレスポンスを待つ必要がない
    • 1度に張るTCPコネクションが1本で済むというメリットもある
  • 似たようなヘッダーを圧縮し、オーバーヘッドを削減する
    • HTTP/2では、HPACKという圧縮形式を用いて以前のリクエストと重複するヘッダーを省略してリクエストを送信する[参考:ヘッダー圧縮]

HTTP/2特有の機能

  • ストリームの優先順位付け
    • HTTP/2からストリームの多重化が可能になったため、効率的にリクエストとレスポンスを処理するため、それぞれの処理の優先順位をつけられるようになった
    • ストリームの依存関係も明示的に指定可能となったため、ストリームAがストリームBに依存する場合、ストリームBを先に処理するというようなことも可能になった

おわりに

今回の調査を通じてインターネットを支える基盤技術の1つであるHTTPについて理解を深めることができ、通信インフラに関する解像度を高めることができました。
今回の調査の中でTCPUDPといったプロトコルにも興味が出てきたため、また今度勉強してみようと思います。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0