TCPハンドシェイク失敗 てぃーしーぴーはんどしぇいくしっぱい
簡単に言うとこんな感じ!
電話をかけたのに相手が出ない・途中で切れる、みたいな状態だよ!ネット通信は「つないでいい?」「いいよ!」「了解!」の3ステップで始まるんだけど、それがどこかで失敗している状態なんだ。結果、ページが開かなかったり「接続できません」が出たりするってこと!
TCPハンドシェイク失敗とは
インターネットや社内ネットワークでデータをやり取りする際、TCP(Transmission Control Protocol) というルールが使われています。TCPでは通信を始める前に「3ウェイハンドシェイク」と呼ばれる3段階の確認手続きを行い、両者が「つながった」と合意してから初めてデータを送受信します。
TCPハンドシェイク失敗とは、この3段階の確認手続きが正常に完了しないことです。原因はさまざまで、ファイアウォールによるパケットのブロック、サーバーの過負荷、ネットワーク経路上の障害、設定ミスなどが挙げられます。利用者からは「サイトが開かない」「アプリが接続エラーを返す」「タイムアウトが頻発する」として体感されます。
システム発注・運用の現場では、障害切り分けの第一歩として「ハンドシェイクが通っているかどうか」を確認するのが鉄則です。ハンドシェイクが失敗している段階では、アプリケーションの問題ではなくネットワーク・インフラ層に原因がある可能性が高いため、調査の方向性を絞り込む重要な手がかりになります。
3ウェイハンドシェイクの仕組みと失敗パターン
正常な3ウェイハンドシェイクは以下の流れで進みます。
| ステップ | 送信元 | 内容 | フラグ |
|---|---|---|---|
| ① SYN | クライアント → サーバー | 「接続していい?」 | SYN |
| ② SYN-ACK | サーバー → クライアント | 「いいよ、準備できた!」 | SYN + ACK |
| ③ ACK | クライアント → サーバー | 「了解、つなぐよ!」 | ACK |
この3ステップがすべて完了して、はじめてTCPコネクションが確立(ESTABLISHED)状態になります。
失敗パターンの分類
失敗が発生するステップによって、原因の場所が違います。
| 失敗パターン | 症状 | 主な原因 |
|---|---|---|
| SYNが届かない | タイムアウト(クライアント側) | ルーティング不備、FWがSYNをブロック |
| SYN-ACKが返らない | タイムアウト(クライアント側) | サーバー停止・過負荷、FWがSYN-ACKをブロック |
| SYN-ACKが届かない | タイムアウト(クライアント側) | 戻りルート障害、非対称ルーティング |
| ACKが届かない | サーバー側がSYN_RCVD止まり | クライアント側FW・NATの問題 |
| RSTが返る | 即座に「接続拒否」エラー | サーバーがポートを開いていない、FWがRSTを送信 |
覚え方:「電話の3声」
SYNは「電話かけた」、SYN-ACKは「もしもし!」、ACKは「よかった、つながった!」
この3声(みこえ)のどこで止まるかで、問題の場所が分かります。
歴史と背景
- 1970年代初頭 — ARPANETでの通信実験を通じ、信頼性のある双方向通信の必要性が認識される
- 1974年 — Vint Cerf と Bob Kahn が TCP の概念を論文で発表
- 1981年 — RFC 793 により TCP が正式に標準化。3ウェイハンドシェイクの仕様がここで定義された
- 1990年代 — インターネット商用化が進み、FW・NATの普及とともに「ハンドシェイクが通らない」障害が日常的に発生するように
- 2000年代 — SYN Flood攻撃(大量のSYNを送りつけてサーバーを枯渇させるDDoS)が問題化。SYN Cookie などの対策技術が広まる
- 2010年代以降 — クラウド・マイクロサービス化により経路が複雑化し、ハンドシェイク失敗の原因追跡がより難しくなっている
原因の切り分け方と確認ツール
ハンドシェイク失敗の調査は、「どこまでパケットが届いているか」を順番に確認する作業です。
よくある原因トップ5と対処法
| # | 原因 | 症状の特徴 | 対処法 |
|---|---|---|---|
| 1 | ファイアウォールがSYNをブロック | タイムアウト・無応答 | FWルール(インバウンド)を確認・修正 |
| 2 | サーバーがそのポートでListenしていない | 即座にRSTが返る | サービス起動確認、ポート番号確認 |
| 3 | 戻りルート(SYN-ACKの経路)が壊れている | タイムアウト、サーバーログには接続記録がある | 非対称ルーティングの確認、ルーティングテーブル見直し |
| 4 | サーバー過負荷でSYNキューが溢れている | 断続的・負荷依存のタイムアウト | SYNキュー拡張、スケールアウト検討 |
| 5 | NATテーブルの枯渇・セッション不足 | 高負荷時のみ発生するタイムアウト | NATセッション数上限確認、タイムアウト値調整 |
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| RFC 793 | TCP(Transmission Control Protocol)の基本仕様。3ウェイハンドシェイクの定義を含む |
| RFC 9293 | RFC 793 を更新した最新のTCP仕様(2022年)。ハンドシェイク・状態遷移が詳述されている |
| RFC 4987 | SYN Flood攻撃とその対策(SYN Cookieなど)の解説 |
| RFC 1122 | ホスト側のTCP/IP実装要件。タイムアウト・再送挙動の基準を定める |
関連用語
- TCP(Transmission Control Protocol) — 信頼性のある通信を実現するトランスポート層プロトコル
- 3ウェイハンドシェイク — SYN・SYN-ACK・ACKの3ステップでTCPコネクションを確立する手順
- SYN Flood攻撃 — 大量のSYNパケットを送りつけてサーバーのSYNキューを枯渇させるDDoS手法
- ファイアウォール — 許可・拒否ルールに基づいてパケットを通過させるセキュリティ機器
- ポートスキャン — 対象ホストの開放ポートを調べる調査・診断手法
- タイムアウト — 一定時間応答がない場合に通信を打ち切る仕組み
- NATテーブル — IPアドレス変換の対応関係を管理するテーブル。枯渇するとハンドシェイクが失敗することも
- パケットキャプチャ — tcpdumpやWiresharkなどでネットワーク上のパケットを記録・解析する手法