[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 を使う必要はほとんどないものと思われます。
[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
を含めるようにします。
[27] しかし Connection:
ヘッダーに対応していない HTTP/1.0
串が Connection: keep-alive
つきの要求を受け取ると、
Connection:
ヘッダーをそのまま転送するので、 鯖が Keep Alive
に対応している場合に串と鯖の間の接続が切断されないままとなってしまいます
>>24。
[28] 串向けには Connection:
ヘッダーのかわりに
Proxy-Connection:
ヘッダーを使うことも提案されましたが、
串が多段になっている時にやはり同様の問題が生じました >>24。
[29] このような事情から、 Proxy-Connection:
ヘッダーは送らないことを、 Connection: keep-alive
は注意して使うことが勧められています。
串に対しては使うべきではありませんし、
鯖に対して使う時は接続が切断されない状態になっていないか監視が必要です。 >>24
Connection: keep-alive
を送信することは禁止されていました >>30 が、なぜか RFC 7230 では使うべきではないとされる >>24 または事実の文により除外される >>18 に留まっています。[52] 一方で NTLM
認証と CONNECT
要求メソッドの組み合わせでの互換性の問題から
Proxy-Connection: keep-alive
を送信する必要があるようです。
(Proxy-Connection:
を参照。)
keep-alive
[19] 接続オプション keep-alive
は、プロトコルの版が HTTP/1.0 である
HTTP接続において持続的接続機能を有効にすることを指定するものです。
[22] HTTP/1.0 メッセージの Connection:
ヘッダーに close
が指定されておらず、
keep-alive
が指定されていれば、
受信者は接続を閉じずに次の要求と応答の組に当該
HTTP接続を再利用できます >>18。
[21] このオプションは HTTP/1.1 接続では使えません。 HTTP/1.1 メッセージで指定されていても、無視されます。
Keep-Alive:
ヘッダー[43] Keep-Alive:
ヘッダーは、 keep alive
に関する追加のオプションを指定するものです。
[64] HTTP/1.0 のみで使われます。その他の HTTP では無視されます。
[45] Keep-Alive:
ヘッダーの値は、
零個以上の引数のリスト (#
) です >>42。
[44] Keep-Alive:
ヘッダーは、要求や応答の
Connection:
ヘッダーに
keep-alive
接続オプションが指定されている時に使うことができます
>>42。
[48] このヘッダーは省略可能で、引数を送る時だけ使います >>42。
[49] Keep-Alive:
ヘッダーを送る時は、
Connection: keep-alive
も送らなければなりません >>42。
[50] Connection: keep-alive
がなければ
Keep-Alive:
ヘッダーは無視しなければなりません
>>42。
[63] HTTP/1.0/HTTP/1.1 から HTTP/2 に変換する中間器は、
Connection:
に Keep-Alive
が明示されているか否かに関わらず、 Keep-Alive:
ヘッダーがあれば削除するべきです >>62。
[16] RFC 2616 は Keep-Alive:
ヘッダーを
hop-by-hop header に分類していました >>15。
[37] Apache 2.2 は (標準では?) Connection: keep-alive
を送っても無視します。
[40] 持続的接続が有効に設定された Apache に
Connection: keep-alive
付きの HTTP/1.0 要求または
HTTP/1.1 要求を送ると、
Keep-Alive: timeout=7, max=5 Connection: Keep-Alive
... のようなヘッダーを含む HTTP/1.1 応答を送信します。
[41] 持続的接続が有効に設定された Apache に
Connection:
なしの HTTP/1.1
要求を送った時は、 Connection:
や
Keep-Alive:
のない HTTP/1.1 応答が返されます。
[38] nginx は HTTP/1.1 要求を送るか Connection: keep-alive
付き HTTP/1.0 要求を送ると、 Connection: keep-alive
付き HTTP/1.1 応答を返し、接続を閉じません。
[39] Chrome や Firefox や IE は Connection: keep-alive
付き HTTP/1.1 要求を送信します。
[54] 以前は Firefox も Keep-Alive:
ヘッダーを送信していましたが、
RFC とは異なる構文でした。鯖が使っていなかったことから削除されています >>53。
Keep-Alive: 300
[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>
Transfer-Encoding: chunked
を使うことができないので、要求や応答のメッセージ本体の長さはContent-Length:
ヘッダーに明示しなければなりません。