HTTPの持続的接続

From Wikipedia, the free encyclopedia

HTTPの持続的接続(HTTPのじぞくてきせつぞく、英語: persistent connection)は、単一のTCP接続を維持したまま、複数のHTTPリクエストおよびレスポンスを連続して送受信する接続管理方式である。HTTP/1.1では持続的接続が既定の動作であり、明示的に接続終了が指示されない限り、同一接続を再利用できる。[1]

持続的接続の導入により、各リクエストごとにTCP接続を新設・切断する必要が減るため、接続確立のための往復遅延やTCPのオーバーヘッドを抑えられる。HTTP/1.1仕様では、この方式によりネットワーク混雑の軽減、後続リクエストの遅延削減、ならびに接続上でのHTTPパイプライニングの利用が可能になると説明している。[2]

初期のHTTP実装では、1個の資源を取得するたびにTCP接続を確立し、レスポンス送信後に接続を閉じる動作が一般的であった。HTTP/1.1ではこの方式が改められ、接続は既定で持続的となった。受信者は、もっとも最近受信したメッセージのHTTPバージョンと Connection ヘッダーに基づいて、その接続が持続的かどうかを判断する。[1]

接続を維持したまま複数のリクエストを処理できることは、1つのHTML文書に加えて画像・スタイルシート・スクリプトなど複数の資源を短時間に取得するWeb利用と相性がよい。HTTP/1.1策定時の仕様文書でも、同一サーバに対して短時間に複数の要求が集中する状況を、持続的接続の導入理由として挙げている。[3]

歴史

HTTP/1.0の標準仕様であるRFC 1945は、持続的接続を既定動作として定義していない。のちに一部実装では、Connection: Keep-Alive などを用いた試験的な持続的接続が導入されたが、HTTP/1.0プロキシとの相互運用性に問題があった。[4][5][6]

HTTP/1.1では、こうした問題を踏まえて持続的接続が標準化され、接続を維持しない場合に Connection: close を用いて非持続を示す方式が採用された。[5][7]

動作

HTTP/1.1においては、クライアントは Connection: close を送信または受信するまで、同一接続上で追加のリクエストを送信できる。サーバもまた、レスポンス送信後に接続を閉じる意図がある場合には Connection: close を送信する。[1][7]

持続的接続を正しく維持するためには、各メッセージの長さが接続の終了以外の方法で確定できなければならない。RFC 9112は、持続的接続上のすべてのメッセージが自己定義的な長さを持つ必要があるとし、サーバはレスポンス送信後にリクエスト本文をすべて読み切るか接続を閉じなければならず、クライアントも接続を再利用するならレスポンス本文を最後まで読み取らなければならないとしている。[8]

また、HTTP/1.1では、持続的接続上でレスポンスを待たずに複数のリクエストを送るHTTPパイプライニングが関連機能として定義されていた。[2]

利点

持続的接続の主な利点として、HTTP/1.1仕様は次の点を挙げている。[2]

  • TCP接続の確立回数が減るため、ネットワーク混雑を抑えられる。
  • 後続リクエストでは接続確立のハンドシェイクが不要となるため、遅延が減少する。
  • 単一接続を効率よく利用でき、HTTPパイプライニングの基盤となる。

注意点

持続的接続は永続的に保持されるものではなく、アイドル状態が続いた接続はサーバや中継装置によって閉じられることがある。さらに、接続は意図の有無にかかわらずいつでも閉じられうるため、実装は非同期な接続終了からの回復を考慮する必要がある。[8]

HTTP/1.0系の試験的な Keep-Alive は、古いプロキシとの組み合わせで誤動作を起こすことがあり、RFC 2068およびRFC 2616ではその相互運用上の問題が説明されている。[4][5]

関連項目

脚注

参考文献

外部リンク

Related Articles

Wikiwand AI