Timeout
KeepAlive
Section titled “KeepAlive”HTTPの効率化における仕組み。
1つのTCP接続を使いまわして、複数のHTTPリクエスト/レスポンスをやり取りする仕組み。
Timeoutの時間内であればであれば、使いまわすことができる。
1つの接続を使い回す条件は、送信元IP, 送信元ポート, 宛先IP, 宛先ポートが同じこと。
通常のTCP接続確率の手順
Section titled “通常のTCP接続確率の手順”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 |
| モバイル3G | 300ms |
KeepAliveが無効だと、1つのRequestごとに毎回新規接続として、この接続確立が行われる。
| 項目 | KeepAlive |
|---|---|
| HTTP1.0 | オプション |
| HTTP1.1 | デフォルト |
| HTTP2.0 | KeepAliveはなくなり、常時接続 |
| HTTP3.0 | connectionIDとなる |
- HTTP2.0からはKeepAliveという概念ではなく、ブラウザを開いている間、常時接続となる
- 並列にRequestを投げ返却できるものから返却する
- アイドルタイムアウトは数分から数十分となる
- HTTP3.0では、QUIC(UDPベース)となりconnectionIDが同じであれば、接続を使いまわせる
- タイムアウトはClientとServerが違いにTimeout時間を送り、早く切れる方が採用される
headersTimeout
Section titled “headersTimeout”ClientがHTTPヘッダー全体を送信するまでの時間の最大待機時間をいう。
短くする理由は、Slowloris攻撃を防ぐため。
大量のヘッダーが入ったRequestを多く投げられた場合に、サーバー側のリソースが枯渇する可能性があるため。