Skip to content

Instantly share code, notes, and snippets.

@pipopotamasu
Last active September 6, 2021 04:49
Show Gist options
  • Save pipopotamasu/90c2c7231a392cfdc0d36d81227e2992 to your computer and use it in GitHub Desktop.
Save pipopotamasu/90c2c7231a392cfdc0d36d81227e2992 to your computer and use it in GitHub Desktop.

HTTP3

HTTP3とは?

HTTPの新しいメジャーバージョン。 QUICと呼ばれる通信プロトコルが取り入れられ作られている。 ちなみにQUICは今年の5月27日にIETFのRFCに正式採択され標準仕様となった。

HTTP3ではどんなメリットが享受できるのか?

  • 接続時間(ハンドシェークにかかる時間)が短縮される
    • HTTP2まではTCPとTLSのハンドシェークが必要であった
    • HTTP3ではTLSのみのハンドシェークになる(後述するが、HTTP3はTCPではなくUDPが採用されているため。TCPはハンドシェークがあり、UDPはない)。
  • パケットロスした時に速度低下が小さい
    • HTTP2まではパケットロスした場合のパケット再送時は後続のパケットが送れない
    • HTTP3ではUDPを用いているためパケットロスによるパケット再送時でも並列して送ることができる
      • この辺りのパケットロス時のデータ再送周りの手続きはHTTP3独自っぽい?
  • ネットワークが変わっても通信が途切れない
    • 例えば会社のネットワークからスマホのネットワークに切り替えた時など
    • HTTP2だとクライアントのIPアドレスが変化した場合、一度TCPコネクションを切断し再接続する
    • HTTP3の場合はIPアドレスではなくQUIC(後述)のコネクションIDをとってそれで判断しているため通信の切断がおきない

どのような仕組みなのか?

復習用

TCPとUDP

どちらもトランスポート層のプロトコル。クライアント-サーバー間の通信チャネルの提供、通信管理を行うためのもの。

[TCP]

  • コネクション型
    • 通信開始前に3wayハンドシェイクで事前準備をする
  • 信頼性高
    • パケットロスしても再送してくれる
  • 通信効率低
    • 信頼性をあげる諸々の情報が入っているのでTCPヘッダーのサイズが大きい
    • 通信開始前にハンドシェイクが必要なのでその分接続時間がかかる

[UDP]

  • 非コネクション型
    • 事前準備なし
  • 信頼性低
    • パケットロスしてもそのまま
  • 通信効率高
    • TCPヘッダーより情報が少ないのでヘッダーサイズが小さい
    • ハンドシェイクがいらないのでUDPと比べ接続時間が短縮される

QUICについて

HTTP3に用いられている新しいトランスポート層のプロトコル。 TCP接続のように信頼性を担保しつつ、高速化すること目的に作られた。

[特徴]

  • TCPではなくUDPがネットワーク接続に用いられている
  • ネットワーク接続時にコネクションIDを生成し、それ単位に接続管理をする
    • TCPのようにIP/ポートにコネクションが依存しないため、 IP/ポートが変わっても接続を維持できる
  • TLS(ネットワーク上で送受信されるデータの暗号化プロトコル)1.3が必須

まとめると...

「UDPにより速度を向上させ、TLS1.3のハンドシェークを利用することでUDPの欠点である信頼性を向上させた」

どうやったらHTTP3が使えるか?

クライアント側の準備

HTTP3に対応しているWebブラウザを使う。 だいたいのモダンブラウザで対応している。

サーバー側の準備

  • TLS1.3が利用できる状態にする(cloudfrontとか見ると普通に1.3を利用するオプションがある )
  • UDPの443番ポートを解放する
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment