Keep Alive

Keep-Alive: ヘッダー (HTTP)

[35] HTTP/1.0 keep alive は、持続的接続を実現する機能です。 keep alive を使用することは接続オプション keep-alive によって示されます。 Keep-Alive: ヘッダーkeep alive の動作についてのオプションを記述するものです。

代替

[36] HTTP/1.0 keep alive を発展的に置き換えるものが HTTP/1.1 の標準機能である持続的接続です。現在では HTTP/1.0 keep alive を使う必要はほとんどないものと思われます。

仕様書

HTTP/1.0 Keep-Alive

[25] HTTP/1.1 では持続的接続が標準機能となっていますが、 HTTP/1.0 では明示的に示した時のみ有効とできるオプション機能でした。

[26] HTTP/1.0 Keep Alive に対応したいクライアントは、 要求Connection: keep-alive を含めることができます >>24

[31] そのような要求を受け取ったは、応答Connection: keep-alive を含めることができます >>30。その場合に応答を送り終わっても接続を閉じません。 またクライアントはこれを受信することで、持続的接続が有効であると判断できます。

[34] それ以後の要求応答でも、接続を切断したくなるまでは Connection: keep-alive を含めるようにします。

[32] HTTP/1.0 では Transfer-Encoding: chunked を使うことができないので、要求応答メッセージ本体の長さは Content-Length: ヘッダーに明示しなければなりません。

[27] しかし Connection: ヘッダーに対応していない HTTP/1.0 Connection: keep-alive つきの要求を受け取ると、 Connection: ヘッダーをそのまま転送するので、 Keep Alive に対応している場合にの間の接続が切断されないままとなってしまいます >>24

[28] 向けには Connection: ヘッダーのかわりに Proxy-Connection: ヘッダーを使うことも提案されましたが、 が多段になっている時にやはり同様の問題が生じました >>24

[29] このような事情から、 Proxy-Connection: ヘッダーは送らないことを、 Connection: keep-alive は注意して使うことが勧められています (encouraged) に対しては使うべき (ought to) ではありませんし、 に対して使う時は接続が切断されない状態になっていないか監視が必要です。 >>24

[33] RFC 2068 ではConnection: keep-alive を送信することは禁止されていました >>30 が、なぜか RFC 7230 では使うべきではないとされる >>24 または事実の文により除外される >>18 に留まっています。

[52] 一方で NTLM 認証と CONNECT 要求メソッドの組み合わせでの互換性の問題から Proxy-Connection: keep-alive を送信する必要があるようです。 (Proxy-Connection: を参照。)

[23] 持続的接続も参照。

接続オプション keep-alive

[19] 接続オプション keep-alive は、プロトコルの版HTTP/1.0 である HTTP接続において持続的接続機能を有効にすることを指定するものです。

[22] HTTP/1.0 メッセージConnection: ヘッダーclose が指定されておらず、 keep-alive が指定されていれば、 受信者接続を閉じずに次の要求応答の組に当該 HTTP接続を再利用できます >>18

[20] 持続的接続を参照。

[21] このオプションは HTTP/1.1 接続では使えません。 HTTP/1.1 メッセージで指定されていても、無視されます。

HTTP/1.1 では既定の状態で持続的接続が有効です。

Keep-Alive: ヘッダー

[43] Keep-Alive: ヘッダーは、 keep alive に関する追加のオプションを指定するものです。

[64] HTTP/1.0 のみで使われます。その他の HTTP では無視されます。

構文

[45] Keep-Alive: ヘッダーの値は、 零個以上の引数リスト (#) です >>42

  1. ?
    1. 引数
    2. *
      1. OWS
      2. ,
      3. OWS
      4. 引数

[46] 引数は、名前と値を = で連ねたものです >>42。 名前は字句、値は字句または引用文字列です。

  1. 字句
  2. =
  3. |
    1. 字句
    2. 引用文字列
[47] = の前後には BWS が挿入され得るものと解釈するべきと思われますが、 RFC 2068 時代は空白を構文に明示していませんでした。

[57] Firefox は長らくこれと異なる構文を使っていました (>>54)。

文脈

[44] Keep-Alive: ヘッダーは、要求応答Connection: ヘッダーkeep-alive 接続オプションが指定されている時に使うことができます >>42

[48] このヘッダーは省略可能で、引数を送る時だけ使います >>42

[49] Keep-Alive: ヘッダーを送る時は、 Connection: keep-alive も送らなければなりません >>42

[65] HTTP/2 では生成してはなりません >>62

処理

[50] Connection: keep-alive がなければ Keep-Alive: ヘッダーは無視しなければなりません >>42

[63] HTTP/1.0/HTTP/1.1 から HTTP/2 に変換する中間器は、 Connection:Keep-Alive が明示されているか否かに関わらず、 Keep-Alive: ヘッダーがあれば削除するべきです >>62

[66] Keep-Alive: ヘッダーを含む HTTP/2 メッセージ奇形です >>62

引数

[56] 次の引数があります。

歴史

RFC 2068

[10] RFC 2068 (HTTP/1.1) 19.7.1.1 The Keep-Alive Header

When the Keep-Alive connection-token has been transmitted with a request or a response, a Keep-Alive header field MAY also be included. The Keep-Alive header field takes the following form:

Keep-Alive connection-token が要求または応答で転送されるとき、 Keep-Alive 頭欄をも含めて構いませんKeep-Alive 頭欄は、次の書式を取ります。

  • Keep-Alive-header = "Keep-Alive" ":" 0# keepalive-param
  • keepalive-param = param-name "=" value

The Keep-Alive header itself is optional, and is used only if a parameter is being sent. HTTP/1.1 does not define any parameters.

Keep-Alive 頭自体は省略可能で、引数が送られるときのみ使用します。 HTTP/1.1 は引数を定義しません。

If the Keep-Alive header is sent, the corresponding connection token MUST be transmitted. The Keep-Alive header MUST be ignored if received without the connection token.

Keep-Alive 頭が送られる場合、対応する接続字句を転送しなければなりませんKeep-Alive 頭は、接続字句なしで受信した場合には無視しなければなりません

RFC 2616

[16] RFC 2616Keep-Alive: ヘッダーhop-by-hop header に分類していました >>15

RFC 4229

[12] RFC 4229RFC 2068 を出典に IANA登録簿に登録しています >>4, >>11

[13] 状態は「標準」とされています。

[14] これは RFC 723x 出版後も変わっていません。

RFC 7230

実装

[37] Apache 2.2 は (標準では?) Connection: keep-alive を送っても無視します。

[40] 持続的接続が有効に設定された ApacheConnection: keep-alive 付きの HTTP/1.0 要求または HTTP/1.1 要求を送ると、

Keep-Alive: timeout=7, max=5
Connection: Keep-Alive

... のようなヘッダーを含む HTTP/1.1 応答を送信します。

[41] 持続的接続が有効に設定された ApacheConnection: なしの HTTP/1.1 要求を送った時は、 Connection:Keep-Alive: のない HTTP/1.1 応答が返されます。

[38] nginxHTTP/1.1 要求を送るか Connection: keep-alive 付き HTTP/1.0 要求を送ると、 Connection: keep-alive 付き HTTP/1.1 応答を返し、接続を閉じません。

[39] ChromeFirefoxIEConnection: keep-alive 付き HTTP/1.1 要求を送信します。

[54] 以前は FirefoxKeep-Alive: ヘッダーを送信していましたが、 RFC とは異なる構文でした。が使っていなかったことから削除されています >>53

関連

[67] TCP keepaliveと直接の関係はありません。

メモ

[5] kinnekoの日記 - IE は KeepAlive をうまく処理できない? (2007-02-11 10:02:17 +09:00 版) <http://d.hatena.ne.jp/kinneko/20051214/p4> (名無しさん)

[6] 世界初オタク系SNS『オタバ』公式ブログ: 【Internet Explorer系ブラウザについて】 (2006-10-29 16:47:05 +09:00 版) <http://otaba.seesaa.net/article/10637205.html> (名無しさん)

[7] 最速インターフェース研究会 :: 最近IE6でWikipedia日本語版の表示が異常に遅いのはKeepAliveのせい ( 版) <http://la.ma.la/blog/diary_200702101610.htm>

[8] Apache HTTP Server Project ( ( 版)) <http://httpd.apache.org/docs/1.3/misc/known_client_problems.html#broken-keepalive>

[9] RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing ( ( 版)) <https://tools.ietf.org/html/rfc7230#appendix-A.1.2>

[58] draft-thomson-hybi-http-timeout-03 - Hypertext Transfer Protocol (HTTP) Keep-Alive Header ( ( 版)) <https://tools.ietf.org/html/draft-thomson-hybi-http-timeout-03>

[59] draft-ietf-http-ses-ext-01 - Persistent HTTP Connections ( ( 版)) <https://tools.ietf.org/html/draft-ietf-http-ses-ext-01>

[60] draft-fielding-http-spec-01 - Hypertext Transfer Protocol -- HTTP/1.0 ( ( 版)) <http://tools.ietf.org/html/draft-fielding-http-spec-01#section-4.3.1>

[61] RFC Errata Report ( ( 版)) <http://www.rfc-editor.org/errata_search.php?rfc=4229>