Diary

Diary

日々学んだことをアウトプットする場として初めてみました

HTTP/2, HTTP/3概論

HTTP/2, HTTP/3概論

HTTP/1しか知らない、いやHTTP/1すらよくわからない僕ですが、勉強して自分が気になった点についてまとめてみます

HTTP/1

まずはHTTP/1から

基本的な技術

  • HTTPS
    • TLSを利用したSecureなHTTP通信
      • Transport Layer Security
  • TCP
    • 3 way ハンドシェイクによる確実な通信
  • TLS
    • TLS1.2以下では、フルハンドシェイクによる通信があり、最低四回のやりとりが必要

つまり、TCP + TLSでの通信においてのシーケンス図は下のようになる

  • かなり略しているので、詳しくはrfc8446など
  • TCP
    • SYN: 相手先の確認用
    • ACK: 応答確認
  • TLS
    • STCPと同じようにハンドシェイクが必要

f:id:kokoichi206:20210623223509p:plain

問題点

  • 一回接続するたびに接続が切れるので、何回もハンドシェイクをしないといけない
  • TCPTLSでハンドシェイクが被っていて、オーバーヘッドが大きい

改善策

  • Keep-Alive
    • TCP接続を使い回す
  • 同時リクエス
    • 同時に複数のリクエストを送る
  • HTTP/2

HTTP/2

  • HTTP/1のデメリットを補うために開発された(by Google

特徴

  • バイナリ形式のプロトコル
    • フレーム化によりメッセージを分割できる
  • 多重化
    • 単一のTCP接続で複数のリクエストが可能
  • 優先度制御とフロー制御
    • TCP接続を持続させることにより、自ら制御する必要が出てきた
  • ヘッダー圧縮
  • サーバープッシュ
    • サーバーからレスポンスを送信できる

HTTP/3

おまけ

検証ツールを開き、NetworkタブのNameの欄を右クリックし、Protocolを選択(下はspotifyでの例)

[`p:plain]

するとProtocolの欄が追加される

f:id:kokoichi206:20210623225158p:plain

h2はHTTP/2による通信、h3-*はHTTP/3による通信が行われていることを示す。

  • 本文中のシーケンス図は以下のようにmermaidを用いて作成した
sequenceDiagram
participant 1 as client
participant 2 as server

Note over 1, 2: TCP Connection

1->>+2: SYN(シン)
2->>1: SYN + ACK(アック)
1->>+2: ACK

Note over 1, 2: TLS Connection

1->>+2: ClientHellow
2->>1: ServerHellow, ServerHelloDone
1->>+2: KeyExchange, Finished
2->>1: Finished

Note over 1, 2: ハンドシェイク終了

1->>+2: HTTP リクエス