HTTPパーシステントコネクション(HTTPキープアライブ、またはHTTPコネクション再利用とも呼ばれるとレスポンスのペアごとに新しい接続を開くのではなく、単一のTCP接続を使用して複数のHTTPリクエストとレスポンスを送受信するという考え方です。より新しいHTTP/2プロトコルは、この考え方をさらに発展させ、単一の接続上で複数の同時リクエストとレスポンスを多重化できるようにしています。
HTTP 1.0では、サーバーは応答を送信した後、必ず接続を閉じる必要があります。 [ 1 ]
少なくとも1995年後半以降、[ 2 ] HTTP/1.0を使用する人気製品(ブラウザ、ウェブサーバーなど)の開発者は、複数のリクエスト/レスポンスで接続を再利用できるようにするために、「keep-alive」と呼ばれる非公式の拡張機能(プロトコルへの)を追加し始めました。[ 3 ] [ 4 ]
クライアントがキープアライブをサポートしている場合、リクエストに次のヘッダーが追加されます。
接続: キープアライブ
サーバーがこのリクエストを受信してレスポンスを生成する際、キープアライブをサポートしている場合は、上記と同じヘッダーをレスポンスにも追加します。これにより、接続は切断されずに維持されます。クライアントが別のリクエストを送信する際も、同じ接続が使用されます。
これは、クライアントまたはサーバーのいずれかが会話の終了を判断するまで続きます。この場合、クライアントまたはサーバーは"Connection:"最後に送信したメッセージからヘッダーを削除するか、より良い方法として「close」というキーワードを追加します。
接続: 閉じる
その後、指定された規則に従って接続が閉じられます。
1997年以降、HTTP/1.1仕様のさまざまなバージョンでは、この非公式拡張機能の使用が認められ、HTTP/1.0(キープアライブ)とHTTP/1.1クライアント/サーバー間の相互運用性に関するいくつかの注意書きが含まれていました。[ 5 ]
HTTP 1.1 では、特に宣言しない限り、すべての接続は永続的であるとみなされます。[ 5 ] HTTP の永続的接続は、個別のキープアライブ メッセージを使用せず、単一の接続で複数のリクエストを許可するだけです。ただし、Apache httpd 1.3 および 2.0 のデフォルトの接続タイムアウトは 15 秒と短く[ 6 ] [ 7 ]、Apache httpd 2.2 以降ではわずか 5 秒です。[ 8 ] [ 9 ] タイムアウトが短いことの利点は、複数のサーバー プロセスやスレッドを長時間実行するためにリソースを消費することなく、Web ページの複数のコンポーネントを迅速に配信できることです。[ 10 ]
キープアライブでは、特にパイプライン処理の HTTP 操作中に、クライアントが 1 つのレスポンスの終了と次のレスポンスの開始を判断することが難しくなります。[ 11 ]Content-Lengthこれは、ストリーミングのために使用できない場合に深刻な問題となります。 [ 12 ]この問題を解決するために、HTTP 1.1 ではビットを定義するチャンク転送コーディングlast-chunkが導入されました。[ 13 ]このlast-chunkビットは各レスポンスの最後に設定され、クライアントが次のレスポンスの開始位置を知ることができるようになります。
RFC 7230、セクション 6.4によると、「クライアントは、特定のサーバーに対して同時に開いている接続の数を制限する必要がある」。以前のバージョンの HTTP/1.1 仕様では具体的な最大値が規定されていたが、RFC 7230 では「これは多くのアプリケーションにとって非現実的であることが判明した...代わりに、複数の接続を開く際には保守的にする」としている。これらのガイドラインは、HTTP の応答時間を改善し、輻輳を回避することを目的としている。HTTP パイプラインが正しく実装されていれば、追加の接続から得られるパフォーマンス上の利点はなく、追加の接続は輻輳の問題を引き起こす可能性がある。[ 14 ]
クライアントが必要なデータをすべて受信した後も接続を閉じない場合、サーバー上で接続を維持するために必要なリソースが他のクライアントに利用できなくなります。これはサーバーの可用性とサーバー上のリソースの可用性の両方に影響を与え、その影響の程度はサーバーのアーキテクチャと構成によって異なります。
また、サーバーが TCP 接続を閉じるのと同時にクライアントがサーバーにリクエストを送信すると、競合状態が発生する可能性があります。 [ 15 ]サーバーは、接続を閉じる直前に、クライアントに 408 リクエストタイムアウト ステータス コードを送信する必要があります。クライアントは、リクエストを送信した後で 408 ステータス コードを受信すると、サーバーへの新しい接続を開いてリクエストを再送信する可能性があります。[ 16 ]すべてのクライアントがリクエストを再送信するわけではなく、再送信するクライアントの多くは、リクエストに冪等な HTTP メソッドが含まれている場合にのみ再送信します。

Chrome、Edge、Firefox、Opera(4.0以降)[ 17 ]、Safariを含むすべての最新のウェブブラウザは、永続的な接続を使用します。
Firefoxでは、同時接続数をカスタマイズできます(サーバーごと、プロキシごと、合計)。永続接続は、115 秒(1.92 分)の非アクティブ状態が続くとタイムアウトしますが、これは設定で変更できます。[ 18 ]
Python のrequestsライブラリにはrequests.Session()、永続的な HTTP 接続を確立する機能があり、それによって基盤となる TCP 接続を再利用できるため、パフォーマンスが大幅に向上する可能性があります。[ 19 ]