ネットワーク監視・トラブルシュート

TCPハンドシェイク失敗 てぃーしーぴーはんどしぇいくしっぱい

TCP3ウェイハンドシェイクSYN接続タイムアウトファイアウォールコネクション確立
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年代以降 — クラウド・マイクロサービス化により経路が複雑化し、ハンドシェイク失敗の原因追跡がより難しくなっている

原因の切り分け方と確認ツール

ハンドシェイク失敗の調査は、「どこまでパケットが届いているか」を順番に確認する作業です。

クライアント PC / ブラウザ サーバー Webサーバーなど ネットワーク FW / ルーター / SW ①SYN ①SYN ②SYN-ACK ②SYN-ACK ▼ 失敗パターンと調査コマンド パターンA: タイムアウト(無応答) SYNが届かない / SYN-ACKが返らない パターンB: 即時拒否(RST) ポート未開放 / FWがRSTを送信 確認コマンド(クライアント側) • telnet [サーバーIP] [ポート番号] • curl -v http://[サーバーIP] • tcpdump -i eth0 "tcp and host [IP]" • netstat -an | grep SYN 確認コマンド(サーバー側) • ss -tnp | grep LISTEN • netstat -s | grep "SYNs" • iptables -L -n -v(FW確認) • ss -s(ソケット統計)

よくある原因トップ5と対処法

#原因症状の特徴対処法
1ファイアウォールがSYNをブロックタイムアウト・無応答FWルール(インバウンド)を確認・修正
2サーバーがそのポートでListenしていない即座にRSTが返るサービス起動確認、ポート番号確認
3戻りルート(SYN-ACKの経路)が壊れているタイムアウト、サーバーログには接続記録がある非対称ルーティングの確認、ルーティングテーブル見直し
4サーバー過負荷でSYNキューが溢れている断続的・負荷依存のタイムアウトSYNキュー拡張、スケールアウト検討
5NATテーブルの枯渇・セッション不足高負荷時のみ発生するタイムアウトNATセッション数上限確認、タイムアウト値調整

関連する規格・RFC

規格・RFC番号内容
RFC 793TCP(Transmission Control Protocol)の基本仕様。3ウェイハンドシェイクの定義を含む
RFC 9293RFC 793 を更新した最新のTCP仕様(2022年)。ハンドシェイク・状態遷移が詳述されている
RFC 4987SYN Flood攻撃とその対策(SYN Cookieなど)の解説
RFC 1122ホスト側のTCP/IP実装要件。タイムアウト・再送挙動の基準を定める

関連用語