ネットワーク通信の信頼性を支えるTCP(Transmission Control Protocol)において、接続を確立するための基本的なプロセスが「スリーウェイハンドシェイク」です。
サイバーセキュリティの解析やネットワークトラブルシューティングにおいて、このプロセスをパケットレベルで詳細に把握することは不可欠なスキルと言えます。
本記事では、オープンソースのパケット解析ツールである「Wireshark」を使用し、実際にTCPスリーウェイハンドシェイクをキャプチャしてその内部構造を詳しく確認する手順を解説します。
初心者の方から実務での活用を目指すエンジニアの方まで、パケットの挙動を視覚的に理解するためのガイドとして本稿をご活用ください。
TCPスリーウェイハンドシェイクの基礎知識
TCPスリーウェイハンドシェイクとは、クライアントとサーバーがデータをやり取りする前に、互いの通信準備が整っているかを確認する手順を指します。
このプロセスは「SYN(シン)」、「SYN-ACK(シン・アック)」、「ACK(アック)」という3つのステップで構成されています。
信頼性の高い通信を実現するために、シーケンス番号(Sequence Number)や確認応答番号(Acknowledgment Number)の同期が行われることが特徴です。
ネットワーク上でのデータ転送が正常に行われない場合、このハンドシェイクの段階で何らかの異常が発生しているケースが少なくありません。
そのため、Wiresharkを用いてパケットを一つずつ確認し、どの段階で通信が途絶えているかを特定することが重要になります。
スリーウェイハンドシェイクの3段階
第1段階は、クライアントからサーバーに対して送信される「SYN」パケットです。
これは「接続を開始したい」というリクエストを意味し、クライアント側で生成された初期シーケンス番号が送られます。
第2段階は、サーバーがリクエストを受け取り、クライアントに返信を行う「SYN-ACK」パケットです。
サーバーはクライアントの要求を承諾したことを示すとともに、サーバー側の初期シーケンス番号も同時に通知します。
第3段階は、クライアントがサーバーの返信を受け取ったことを報告する「ACK」パケットです。
この3つのパケットが正しく交換されることで、TCPコネクションが「ESTABLISHED(確立)」の状態になります。
Wiresharkでのキャプチャ準備と設定
Wiresharkを起動したら、まずはパケットをキャプチャする対象のネットワークインターフェースを選択する必要があります。
Wi-Fiを使用している場合は「Wi-Fi」インターフェースを、有線接続の場合は「Ethernet」などを選択してください。
キャプチャを開始する前に、不要なパケットを排除して目的の通信だけを見やすくするための設定を行うことが推奨されます。
特に、インターネット上には膨大なパケットが流れているため、フィルタリング機能を活用することが効率的な解析の鍵となります。
キャプチャフィルタと表示フィルタの違い
Wiresharkには「キャプチャフィルタ」と「表示フィルタ」の2種類が存在します。
キャプチャフィルタは、取り込むパケット自体を制限するもので、PCの負荷を軽減する効果があります。
表示フィルタは、キャプチャした全データの中から特定の条件に合致するものだけを画面に表示させる機能です。
今回は解析の柔軟性を高めるため、キャプチャ後に表示フィルタを利用する方法を推奨します。
表示フィルタの入力欄にtcpと入力するだけで、TCPに関連するパケットのみを抽出することができます。
実際にハンドシェイクをキャプチャする手順
それでは、具体的にスリーウェイハンドシェイクをキャプチャする流れを説明します。
まず、Wiresharkのキャプチャを開始ボタンをクリックして、パケットの収集を始めてください。
次に、Webブラウザを開くか、コマンドプロンプトやターミナルで特定のサーバーにアクセスを試みます。
今回は、確実にハンドシェイクを確認するために、以下のコマンドを使用して特定のURLへリクエストを送ってみましょう。
curl http://www.example.com
リクエストが完了したら、Wiresharkのキャプチャを停止ボタン(赤い四角のアイコン)を押して停止させます。
これで、特定の通信セッションに関するデータがWireshark上に蓄積されました。
目的のパケットを特定するための表示フィルタ
膨大なリストの中から目的のスリーウェイハンドシェイクを見つけるのは困難です。
そこで、表示フィルタ欄に「tcp.flags.syn == 1」と入力して実行してください。
これにより、接続の開始点である「SYN」フラグが立っているパケットだけが抽出されます。
自身がアクセスしたサーバーのIPアドレス(Destination)を探し、そのパケットを右クリックしてください。
コンテキストメニューから「Follow(追跡)」を選択し、さらに「TCP Stream」をクリックします。
この操作により、特定のコネクションに関わる一連のパケットだけが整理され、ハンドシェイクの3つのパケットが連続して表示されるようになります。
パケット構造の詳細確認
Wiresharkの画面中段にある「Packet Details」パネルを使用して、TCPヘッダーの構造を確認していきます。
スリーウェイハンドシェイクの正体は、TCPヘッダー内にある「Flags」フィールドのビットがどのように設定されているかにあります。
それぞれのパケットがどのような役割を果たしているのか、詳細な構造を見ていきましょう。
1本目のパケット:SYNの解析
最初に送信されるパケットを展開し、Transmission Control Protocolの項目を確認します。
Flagsセクションを開くと、「Syn」ビットが1(Set)になっていることが分かります。
また、この時「Acknowledgment Number」が0である点に注目してください。
この段階ではまだ相手からの返答がないため、確認応答番号は設定されていません。
さらに「Sequence Number」には、クライアントが決定したランダムな数値(初期シーケンス番号)が入っています。
Wireshark上では解析しやすいように「0」と相対表示される設定が一般的ですが、実際には巨大な32ビットの数値が格納されています。
2本目のパケット:SYN-ACKの解析
次に、サーバーから返ってきた2本目のパケットを選択します。
このパケットのFlagsセクションでは、「Acknowledgment」と「Syn」の両方のビットが1になっています。
サーバーは「あなたの接続要求(SYN)を受け取った」という合図と、「こちらの接続準備も整った(SYN)」という合図を同時に送っているのです。
ここで重要なのが「Acknowledgment Number」の値です。
この値は、先ほどのクライアントが送った「初期シーケンス番号 + 1」の数値になっています。
この「+1」によって、特定のパケットに対する受領確認が行われたことが証明されます。
3本目のパケット:ACKの解析
最後は、クライアントからサーバーへ送られるパケットです。
Flagsセクションを確認すると、「Acknowledgment」ビットのみが1になっています。
このパケットをもって、双方向の通信チャネルが確立されたことになります。
以降のデータ転送では、このACKフラグが常に1の状態でやり取りが行われます。
スリーウェイハンドシェイクが完了した瞬間、通信状態は「ESTABLISHED」となり、実際のHTTPリクエストなどのアプリケーションデータが流れる準備が整います。
TCPヘッダーの主要フィールド一覧
Wiresharkで確認できるTCPパケットには、ハンドシェイク以外にも重要な情報が多く含まれています。
以下の表に、解析時に特に注目すべきフィールドをまとめました。
| フィールド名 | 役割 |
|---|---|
| Source Port | 送信元のポート番号。クライアント側は通常動的なポートが割り振られます。 |
| Destination Port | 送信先のポート番号。Web通信であれば80や443が一般的です。 |
| Sequence Number | データの順序を制御するための番号。パケットの欠落検知に使用されます。 |
| Acknowledgment Number | 次に受信することを期待しているデータのシーケンス番号。 |
| Flags | 通信の状態(SYN, ACK, FIN, RSTなど)を制御するビット群。 |
| Window Size | 一度に受信できるデータ量。フロー制御において重要な役割を担います。 |
| Checksum | ヘッダーやデータが破損していないかを確認するためのエラー検知用数値。 |
セキュリティ解析における活用例
スリーウェイハンドシェイクを理解することは、セキュリティの脅威を検知する上でも非常に役立ちます。
例えば、ネットワーク攻撃の一種である「SYN Flood攻撃」は、この仕組みを悪用したものです。
攻撃者は大量のSYNパケットをサーバーに送りつけますが、その後のACKパケットを送信しません。
サーバー側は完了しない接続を待ち続け、リソースが枯渇してダウンしてしまいます。
Wiresharkでパケットを監視し、大量のSYNパケットに対してACKが返ってこない異常なパターンを見つけられれば、攻撃の初期段階で気づくことが可能です。
また、ポートスキャンの挙動を解析する際にもハンドシェイクのプロセスが手がかりになります。
特定のポートに対してSYNを送り、すぐにRST(リセット)パケットが返ってくる場合は、そのポートが閉じていることを示唆します。
トラブルシューティングでの確認ポイント
「接続がタイムアウトする」という問題が発生した場合、Wiresharkでどのパケットまで到達しているかを確認します。
クライアントからSYNは出ているが、サーバーからのSYN-ACKが一切返ってこない場合、ファイアウォールで遮断されているか、サーバーがダウンしている可能性が高いと言えます。
逆にSYN-ACKは返っているが、最後のACKがサーバーに届いていない場合は、ネットワークの経路上の問題や、クライアント側のルーティングに不備があるかもしれません。
このように、「どのパケットが欠けているか」を特定できることがWiresharkを使用する最大のメリットです。
高度な解析オプション:TCP Options
スリーウェイハンドシェイクのパケットには「TCP Options」というフィールドが含まれることがあります。
ここでは、MSS(Maximum Segment Size)やウィンドウ・スケール(Window Scale)といった高度なパラメータが交渉されます。
MSSは、一度に送信できるTCPデータの最大サイズを相手に通知するものです。
これを確認することで、ネットワーク内のMTU(Maximum Transmission Unit)設定が最適かどうかを判断できます。
また、SACK(Selective Acknowledgment)の許可設定もここで行われます。
SACKが有効であれば、複数のパケットが欠落した際に、欠けている部分だけを効率的に再送することが可能になります。
パケット解析をより深く行う際は、これらオプションフィールドの中身まで目を通すようにしましょう。
まとめ
Wiresharkを使用したTCPスリーウェイハンドシェイクの解析は、ネットワークの仕組みを学ぶ上で最も基本的かつ重要なプロセスです。
SYN、SYN-ACK、ACKという3つのステップが正しく行われているかを視覚的に確認することで、理論上の知識が実務に即したスキルへと変わります。
パケットヘッダー内のFlagsフィールドやシーケンス番号の変化を注意深く観察する習慣をつけましょう。
本記事で紹介した手順を参考に、日常的なトラブルシューティングやセキュリティ診断にWiresharkをぜひ活用してください。
正確なパケット解析ができれば、目に見えないネットワークの不具合も必ず解明できるはずです。
