TCP KeepAlive と HTTP KeepAlive は全然違うぞ
背景
社内でKeepAliveについて会話している時、いろんなレイヤーのひとが集まっていたことから前提の認識合わせに時間がかかった。
ネットワークのひとがTCP KeepAliveの機能でHTTPセッションも延長できると思い込んだりして混乱したので整理してみた。
TCPのKeepAliveとHTTPのKeep-Aliveの違い
表形式で整理すると以下の通り。
ネットワークの効率維持という観点では同じだが動きはまったく異なる。
特徴 | TCP KeepAlive | HTTP Keep-Alive |
---|---|---|
目的 | 接続の生存確認 | 複数のHTTPリクエストを1つのTCP接続で処理する |
レイヤー | トランスポート層 | アプリケーション層 |
動作 | 一定時間アイドル状態が続くと、TCPがパケットを送信して応答を待つ | クライアントとサーバーが同じTCP接続を使い続ける |
設定 | オペレーティングシステムの設定で調整可能 | HTTPヘッダーでConnection: keep-aliveを指定 |
パフォーマンスへの影響 | ネットワークの負荷を軽減するが、遅延が発生する可能性がある | 新規TCP接続のオーバーヘッドを減少させ、パフォーマンスを向上させる |
使用されるプロトコル | TCP | HTTP/1.1 以降 |
【図解】TCP Keep-Alive/http Keep-Aliveの仕組みと違い ~Client/Serverの挙動とメリット,設定~には実際の通信を例にわかりやすく書かれていました。
具体例が知りたい場合は参照してみてください。
参考
F5
F5のウェブサイトでも説明はされているが、機能についての説明のみで目的や実現することが明確ではなかった。
TCPでは、TCP KeepAliveという機能が用意されています。サーバ側でこの機能を利用すると、通信不可能となったクライアントとのコネクションで使用していたリソースを、自動的に解放します。クライアント側でこの機能を利用すると、サーバのフェイル オーバ等によってIPアドレスが変更された場合、そのことがクライアント側に通知され、自動的に再接続を行うことが可能になります。
https://www.f5.com/ja_jp/glossary/keepalive
HTTPではクライアントとサーバとのTCP接続を明示的に維持するため、KeepAlive機能が用意されています。これはTCP接続の総数を減らし、TCPのコネクション リソースの消費を抑えるために使用されます。Webページの表示では、メインのHTMLファイルだけではなく、そのページに必要な画像やCSS、Javascript等のファイルも転送する必要があります。通常であればこれらのファイル転送を行うには、毎回異なるTCP接続が必要になりますが、KeepAliveを有効にすると、一連のファイル転送を1つのTCP接続で処理できるようになります。この機能はHTTP/1.0ではオプションでしたが、HTTP/1.1からはデフォルトで有効になっています。
https://www.f5.com/ja_jp/glossary/keepalive
TCP Keep-Alive
TCP Keep-Aliveは奥が深い。
Discussion