【入門編】 HTTPのKeep-AliveタイムアウトとTCP接続の切断タイミング – ネットワーク基礎とWebセキュリティ実践ガイド

こんにちは!技術メディアの案内人を務めるセキュリティスペシャリストのトモです。

普段、私たちが何気なくスマートフォンやパソコンでWebサイトを見ているとき、その裏側では目にも留まらぬ速さで「データのキャッチボール」が行われています。

ネットワークの世界に初めて足を踏み入れた皆さんの中には、「HTTP」や「TCP」といった言葉を聞いて、「なんだか難しそうだな…」と感じている方も多いのではないでしょうか。でも、大丈夫です!一歩ずつ紐解いていけば、実は私たちの日常にある「あるやり取り」とそっくりなことが分かります。

今回は、Webサイトの表示速度やサーバーの健康状態を左右する超重要テーマ「HTTPのKeep-Alive(キープアライブ)タイムアウトとTCP接続の切断タイミング」について、現実世界の例え話を交えながら、優しく、そしてディープに解説していきます。

さあ、一緒にネットワークの裏側の世界を覗いてみましょう!

—

1. Webの通信は「電話」と「会話」の2つのルールでできている

まず、前提となるネットワークの仕組みをすっきり整理しておきましょう。
インターネットでWebページが表示されるとき、裏側では「TCP」と「HTTP」という2つのルール(プロトコル)が協力して働いています。

これを分かりやすく例えるなら、「電話をかける仕組み」と「そこで交わされる会話」の関係です。

  • TCP(Transmission Control Protocol)
  • 「電話をかける仕組み」です。相手の番号を押し、「もしもし?」「はい、聞こえますよ」「よろしく!」とお互いに繋がったことを確認するプロセス(3ウェイ・ハンドシェイク)を担当します。
  • HTTP(Hypertext Transfer Protocol)
  • 電話が繋がった後に交わされる「実際の会話(注文)」です。「この写真のデータをください」「はい、どうぞ!」という、Webページを表示するための具体的なリクエストとレスポンスのやり取りを担当します。

普段、私たちがWebページを1つ開くだけでも、実は画像やデザインのデータ(CSS)、動きを制御するプログラム(JavaScript)など、数十個から数百個もの細かなファイルをダウンロードしています。

ここで、昔の古いルール(HTTP/1.0の初期)を考えてみましょう。
昔は、「ファイルを1個もらうたびに、いちいち電話を切って、またかけ直す」という、ものすごく非効率なことをしていました。

  • 「もしもし(TCP接続)」
  • 「トップページの文字データをください(HTTP要求)」
  • 「はいどうぞ(HTTP返信)」
  • 「じゃあ切りますね(TCP切断)」
  • (1秒後)
  • 「もしもし(TCP再接続)」
  • 「次はロゴの画像データをください(HTTP要求)」
  • 「はいどうぞ(HTTP返信)」
  • 「じゃあ切りますね(TCP切断)」

…どう考えても面倒ですし、電話をかけ直す時間がもったいないですよね。

—

2. そこで登場したのが「Keep-Alive(受話器を置かないで!)」

この無駄をなくすために登場したのが、今回の主役である「Keep-Alive(キープアライブ)」です。

Keep-Aliveを一言で言うなら、「用事が全部終わるまで、受話器を耳に当てたまま(接続を維持したまま)にしておこう!」という約束事です。

【Keep-Aliveがある世界】

クライアント(あなた)             サーバー(Webサイト)
      |                               |
      |------ 電話をかける (TCP) ------>|  ※「もしもし、繋がった?」
      |                               |
      |<-----「はーい、どうぞ!」------|  ※受話器は置かない!
      |                               |
      |---「この画像もください」----->|  ※同じ電話のまま次の注文
      |<---「はい、画像データです」---|
      |                               |
      |            (中略)           |
      |                               |
      |------「もう用事は無いよ」----->|
      |<-----「了解、切るね」---------|  ※ここで初めて受話器を置く

この仕組みのおかげで、何度も電話をかけ直す(TCPの接続手続きを行う)必要がなくなり、Webサイトの表示速度が劇的にアップしました。めでたし、めでたし。

……と言いたいところですが、ここで新たな問題が発生します。

—

3. 「繋ぎっぱなし」がサーバーを苦しめる? タイムアウトの必要性

もし、Webサイト側(サーバー)が、あなたからの「もう用事はないよ」という連絡をずっと待ち続けて、受話器を持ったままだったらどうなるでしょうか。

さらに、そのWebサイトに何千人、何万人もの人が同時にアクセスしてきたら……?

サーバーも人間と同じで、同時に持てる受話器の数(処理できる接続数)には限界があります。
用事が済んだのに誰も電話を切ってくれないと、サーバーの受話器(メモリやCPUなどのリソース)がすべて塞がってしまい、新しくやってきた他のお客さんからの電話を取ることができなくなってしまいます。

そこで作られた「思いやりルール」こそが、「Keep-Aliveタイムアウト(接続維持の期限切れ)」です。

タイムアウトの正体

サーバー側で「最後の会話から〇秒間、何も話しかけてこなかったら、こちらから強制的に受話器を置きます(TCP接続を切ります)ね」という制限時間を設けるのです。

この「〇秒間」という猶予時間こそが、「Keep-Aliveタイムアウト値」になります。

—

4. 実際のWebサーバーでの設定例を見てみよう!

では、現場のエンジニアたちは、このタイムアウト値をどのようにコントロールしているのでしょうか。
現在、世界中で広く使われている2つのWebサーバー、Nginx(エンジンエックス)とApache(アパッチ)の設定例を見てみましょう。

難しく見えますが、設定する場所と意味さえ分かれば簡単ですよ!

① Nginxでの設定例

Nginxでは、主に nginx.conf という設定ファイルの中で keepalive_timeout という項目を使って調整します。

# Nginxの設定ファイル(nginx.conf)の例

http {
    # --- Keep-Aliveの設定 ---
    
    # クライアントが最後にリクエストを送ってから、接続を維持する秒数です。
    # ここでは「65秒間」何も通信がなければ、Nginx側からTCP接続を切断します。
    keepalive_timeout 65;

    # 1つのTCP接続の中で、最大何回までリクエストを受け付けるかを制限します。
    # これにより、1つの接続を無限に使い回されるのを防ぎます。
    keepalive_requests 100;
}

② Apacheでの設定例

Apacheでは、httpd.conf や httpd-default.conf などの設定ファイルで調整します。

# Apacheの設定ファイルの例

# Keep-Alive機能自体を有効にするかどうか(On で有効)
KeepAlive On

# 1つのTCP接続の中で、最大何回までリクエストを受け付けるか
MaxKeepAliveRequests 100

# クライアントからの次のリクエストを待つ秒数(タイムアウト値)です。
# Apacheではデフォルトで「5秒」に設定されていることが多いです。
KeepAliveTimeout 5

—

5. 現場の泥臭い知見:タイムアウト値はどう決めるのが正解?

「じゃあ、タイムアウト値は何秒にするのが一番いいの?」
これは、インフラエンジニアが常に頭を悩ませるポイントです。正解は、Webサイトの性格によって変わります。

メリットとデメリットの天秤を、一歩ずつ整理してみましょう。

| 設定値の長さ | メリット | デメリット | 向いているサイト |
| :— | :— | :— | :— |
| 長めにする
(例:60秒〜120秒) | 次のページへの移動(画面遷移)が多いサイトで、常にサクサク高速に表示できる。 | サーバーのメモリや接続枠がすぐにいっぱいになり、アクセス集中時にサーバーがダウンしやすくなる。 | 利用者が少なく、リッチな体験をさせたい社内システムや会員制ツール |
| 短めにする
(例:2秒〜5秒) | サーバーの受話器(リソース)がすぐに空くため、大量の同時アクセスに強くなる。 | スマホの電波状況が悪い場所などで、ページをめくるたびに電話の掛け直しが発生し、少し動作がもたついた印象になる。 | 不特定多数が同時に押し寄せるニュースサイトやECサイト、SNS |

現代のベストプラクティス(おすすめの目安)

現在のインターネット環境(特にモバイル回線の普及や、HTTP/2、HTTP/3といった新しい通信規格の登場)を考慮すると、「2秒〜5秒」、長くても「15秒程度」に設定するのが現代の主流であり、安全な設計とされています。

昔のように「60秒」といった長い設定のままにしておくと、悪意のある攻撃者から「接続だけを大量に維持してサーバーをパンクさせる攻撃(Slow HTTP Denial of Service攻撃)」の標的にされるリスクも高まってしまうため、セキュリティの観点からも「必要最小限の短さに留める」のが鉄則です。

—

まとめ:パケットの気持ちに寄り添ってインフラを学ぼう!

最後におさらいをしましょう。

1. Keep-Aliveは、電話を繋ぎっぱなしにして、Webサイトを高速に表示するための優しさ。
2. でも、繋ぎっぱなしにしすぎると、サーバーの受話器が足りなくなってパンクしてしまう。
3. だから、タイムアウト(制限時間)を設けて、使わなくなった接続はスマートに片付ける。
4. 現代のWebでは、安全と速度のバランスを取って「2秒〜15秒」程度に設定するのがおすすめ。

一見、冷たい英語のパラメーターや数字に見える設定値も、その背景には「ユーザーに快適に使ってほしい」「でもサーバーも壊さずに守りたい」という、歴代のエンジニアたちの温かい試行錯誤が詰まっています。

インフラやネットワークの世界は、こうした「トレードオフ(あっちを立てれば、こっちが立たず)」のバランス調整の連続です。だからこそ、仕組みを理解してぴったりの設定を見つけたときの快感は、何物にも代えがたい面白さがあります。

焦らず一歩ずつ、パケットがネットワークを駆け抜ける姿をイメージしながら、楽しんで学んでいきましょう!

また次回の記事でお会いしましょう。皆様の快適なインフラライフを応援しています!

コメント

タイトルとURLをコピーしました