コンテンツにスキップ

Timeout

HTTPの効率化における仕組み。
1つのTCP接続を使いまわして、複数のHTTPリクエスト/レスポンスをやり取りする仕組み。
Timeoutの時間内であればであれば、使いまわすことができる。
1つの接続を使い回す条件は、送信元IP, 送信元ポート, 宛先IP, 宛先ポートが同じこと。

sequenceDiagram
    participant c as Client
    participant s as Server
    c->>s: 1. SYN(接続要求)
    s->>c: 2. SYN-ACK(承認/接続要求)
    c->>s: 3. ACK(承認)
    Note over c,s: 接続確立
    c->>s: 4. データ送信
    s->>c: 5. レスポンス

接続確立までに、最低3回のパケットの往復1.5RTT(Round Trip Time)

1RTTの時間

項目時間
東京-大阪10ms
東京-アメリカ150ms
モバイル3G300ms

KeepAliveが無効だと、1つのRequestごとに毎回新規接続として、この接続確立が行われる。

項目KeepAlive
HTTP1.0オプション
HTTP1.1デフォルト
HTTP2.0KeepAliveはなくなり、常時接続
HTTP3.0connectionIDとなる
  • HTTP2.0からはKeepAliveという概念ではなく、ブラウザを開いている間、常時接続となる
    • 並列にRequestを投げ返却できるものから返却する
    • アイドルタイムアウトは数分から数十分となる
  • HTTP3.0では、QUIC(UDPベース)となりconnectionIDが同じであれば、接続を使いまわせる
    • タイムアウトはClientとServerが違いにTimeout時間を送り、早く切れる方が採用される

ClientがHTTPヘッダー全体を送信するまでの時間の最大待機時間をいう。
短くする理由は、Slowloris攻撃を防ぐため。
大量のヘッダーが入ったRequestを多く投げられた場合に、サーバー側のリソースが枯渇する可能性があるため。