TCPの3ウェイハンドシェイクは、クライアントのSYN、サーバーのSYN/ACK、クライアントのACKで、双方が送受信可能であることと初期シーケンス番号を確認する手続きです。
本文では3パケットの向きとSEQ/ACKを図解し、Wiresharkでの見方、SYNタイムアウト、RST応答、FWの許可・破棄、通信終了時との違いを分けます。
TCPの3ウェイハンドシェイクとは?通信開始前の接続確立
TCPの3ウェイハンドシェイクは、SYN、SYN/ACK、ACKの3往復で双方の送受信可否と初期シーケンス番号を確認し、TCP接続を確立する手続きです。この後にTLSやHTTPなどのアプリケーション通信が始まります。
サーバーがSYN/ACKで応答かを確かめるには、DNSと経路を先に確認から始めます。Wireshark: tcp.flags.syn == 1で観測した値を期待値と比較します。
(出典:www.rfc-editor.orgの参照資料(公式・一次情報))
TCPとUDPは何が違う?
TCPとUDPの違い:TCPの3ウェイハンドシェイクは、SYN、SYN/ACK、ACKの三段階で双方の初期シーケンス番号と通信可能性を確認し、接続を確立する手順です。
一方だけを見るのではなく、「サーバーがSYN/ACKで応答」と「クライアントがACKを返しESTABLISHEDへ進む」を同じ通信フロー上へ置きます。クライアント側でSYN送信を確認の前後で何が変わり、何が維持されるかを追うと役割の違いが明確になります。
| 確認軸 | 実務で押さえる内容 |
|---|---|
| ポイント1 | クライアントがSYNと初期シーケンス番号を送る |
| ポイント2 | サーバーがSYN/ACKで応答 |
| ポイント3 | クライアントがACKを返しESTABLISHEDへ進む |
| ポイント4 | ACK番号は受信したシーケンス番号にデータ長等を加えて示す |
| ポイント5 | MSSやWindow ScaleなどのオプションをSYNで交換 |
(出典:www.wireshark.orgの参照資料(公式・一次情報))
パケット図で見るSYN→SYN/ACK→ACKはどんな流れ?
TCP接続は、クライアントがSYNを送り、サーバーがSYN/ACKで受信可能と返し、クライアントがACKを返す3つのpacket交換で確立します。各packetのSequence NumberとAcknowledgment Numberを追えば、要求が届かないのか、応答が戻らないのか、最後のACKで止まったのかを区別できます。
SYN / Seq=x
SYN, ACK / Seq=y / Ack=x+1
ACK / Ack=y+1
ClientのSYNに対しServerがSYN/ACKを返し、ClientがACKを返すと接続が成立します。SYNの再送だけが続く場合は戻り経路やFW、SYNにRSTが返る場合は待受portやapplicationの状態を確認します。
Wiresharkでは tcp.flags.syn == 1、tcp.flags.ack、tcp.stream を使って同一通信を絞ります。SYN再送だけなら経路・ACL・待受、SYN/ACK後にACKが見えなければ復路・端末側FW、3ウェイ完了後ならTLSやアプリ層へ確認範囲を移します。
1回目|クライアントがSYNを送信するには?
クライアントは送信元の一時ポートからサーバーの待受ポートへ、SYN=1と初期シーケンス番号を含むセグメントを送ります。SYNが端末から出ていなければ、名前解決、アプリ操作、ローカルFW、経路を確認します。
1回目 SYNでは何を確認する?
サーバー側でSYN受信とSYN/ACK送信を確認を先に実施します。Linux: ss -tn state syn-sentで現状を取得し、「ACK番号は受信したシーケンス番号にデータ長等を加えて示す」を満たすか照合します。
2回目|サーバーがSYN/ACKを返信するには?
サーバーが対象ポートで接続を受け付けられると、自身の初期シーケンス番号をSYNで示し、クライアントのSEQ+1をACKで確認応答します。SYNだけが再送される場合は、到達前の破棄、サーバー停止、復路不備を切り分けます。
クライアント側でSYN/ACK受信とACK送信を確認で対象を固定します。Linux: tcpdump -nn host IP and port PORTの結果から、「MSSやWindow ScaleなどのオプションをSYNで交換」になっているかを判定します。
- STEP 01DNSと経路を先に確認
- STEP 02クライアント側でSYN送信を確認
- STEP 03サーバー側でSYN受信とSYN/ACK送信を確認
- STEP 04クライアント側でSYN/ACK受信とACK送信を確認
- STEP 05確立後のTLS・アプリ応答を別段階として確認
3回目|クライアントがACKを返して接続が成立するには?
クライアントはSYN/ACKを受信すると、サーバーのSEQ+1をACK番号として返します。サーバーがこのACKを受け取るとESTABLISHEDへ進みます。SYN/ACKまで見えて最後のACKが届かないときは、クライアント側のFW、非対称経路、セッション処理を見ます。
3回目 ACKでは何を確認する?
再送やRSTの位置から失敗箇所を推測できるかを確かめるには、確立後のTLS・アプリ応答を別段階として確認から始めます。Windows: 試験-NetConnection -Portで観測した値を期待値と比較します。
シーケンス番号と確認応答番号はどう見る?
具体的にはWireshark: tcp.flags.syn == 1を使い、「再送やRSTの位置から失敗箇所を推測できる」を確認します。値が一致しないときは、その場で設定を変えず、どの入力から期待値を作ったかを設計書・構成図・台帳へ戻って確認します。
| 確認項目・コマンド | 判断する内容 |
|---|---|
| Wireshark: tcp.flags.syn == 1 | クライアントがSYNと初期シーケンス番号を送る |
| Wireshark: tcp.stream eq N | サーバーがSYN/ACKで応答 |
| Linux: ss -tn state syn-sent | クライアントがACKを返しESTABLISHEDへ進む |
| Linux: tcpdump -nn host IP and port PORT | ACK番号は受信したシーケンス番号にデータ長等を加えて示す |
| Windows: 試験-NetConnection -Port | MSSやWindow ScaleなどのオプションをSYNで交換 |
取得した結果は対象・時刻・期待値と一緒に保存します。
TCPフラグをWiresharkで確認するには?
具体的にはWireshark: tcp.stream eq Nを使い、「クライアントがSYNと初期シーケンス番号を送る」を確認します。
TCPフラグはどう見る?
具体的にはLinux: ss -tn state syn-sentを使い、「サーバーがSYN/ACKで応答」を確認します。
- Ping成功をTCP接続成功とみなす:Ping成功をTCP接続成功とみなすの対象、担当範囲、確認に使う証拠を記録する
- SYN再送だけでサーバー停止と断定:SYN再送だけでサーバー停止と断定を自分一人でできる範囲とレビューが必要な範囲へ分ける
- RSTとtimeoutを同じ原因にする:RSTとtimeoutを同じ原因にするの変更前後を同じ条件で比較し、結果を保存する
- NAT前後の5タプルを混同:NAT前後の5タプルを混同が求人のどの工程で使われるかを成果物と対応させる
- ハンドシェイク後のTLS失敗をTCP障害と呼ぶ:ハンドシェイク後のTLS失敗をTCP障害と呼ぶの影響確認、仮説、取得log、復旧結果を順番に残す
SYNタイムアウトが起きる代表的な原因では何を確認する?
SYNのみ再送されるなら途中dropや応答不能、SYN/ACK後にRSTなら待受・FW・OS動作、3ウェイ完了後に失敗するならTLSやアプリ層を重点的に見ます。 そのうえでクライアント側でSYN/ACK受信とACK送信を確認へ進み、Linux: tcpdump -nn host IP and port PORTと「クライアントがACKを返しESTABLISHEDへ進む」の関係を構成図に記録します。結果が仮説と違えば一段前へ戻り、確認済みと未確認を分けて共有してください。
RSTが返る場合に疑うポート・アプリケーションとはどんな状態?
RSTは『宛先まで届いたが、その接続を受け付けない、または途中で破棄した』ときに現れます。SYN直後のRSTなら対象ポートでプロセスが待ち受けていない可能性が高く、接続確立後のRSTならアプリケーション終了、タイムアウト、FWのセッション破棄を疑います。
送信元・宛先の両方で同時刻のパケットと socket 状態を確認し、Linuxなら ss -lntp、Windowsなら Get-NetTCPConnection、FWならdeny・resetログを照合します。RSTを返したIPとMACを特定してから、その機器の設定へ進むのが切り分けの順序です。
ファイアウォールとポート開放が3ウェイハンドシェイクへ与えるにはどんな影響がある?
FWがSYNを破棄するとクライアントはSYNを再送し、タイムアウトします。宛先に到達したもののプロセスが待ち受けていないとRSTが返る場合があります。stateful FWでは、SYNの許可だけでなく戻りパケットが同じセッションとして認識されるかも確認します。
通信終了時の4ウェイハンドシェイクとは何が違う?
TCPの各方向は独立して終了できるため、通常は一方のFINとACK、反対方向のFINとACKのやり取りで閉じます。接続確立時の3パケットとは目的が異なり、RSTによる即時終了とも分けて読みます。
SYN・SYN/ACK・ACKのどこで止まるかをどう確認する?
「TCP 3ウェイハンドシェイク」を理解するときは、用語を覚えるだけでなく、構成のどこで判断され、何を観測すれば正否を確かめられるかまで整理します。
最後に押さえるポイントは「再送やRSTの位置から失敗箇所を推測できる」と「クライアントがSYNと初期シーケンス番号を送る」です。実務ではクライアント側でSYN送信を確認から始め、Wireshark: tcp.stream eq Nを証跡として残すと、別の担当者も同じ判断を再現できます。
関連する仕組みをどの順序で確認する?
- ポート番号とは?TCP・UDPとの関係と代表的な番号一覧
- CiscoのミラーポートとWiresharkで通信障害を切り分ける方法
- ネットワークのポリシーテストとは?FW・ACLの試験手順
TCPの3ウェイハンドシェイクを現場で確認するときの完了条件
TCPの3ウェイハンドシェイクの確認は、コマンドが一度成功した時点では終わりません。対象と前提を固定し、正常時との差を観測し、復旧後に既存通信への影響まで確認します。
| 段階 | 確認内容 | 残す証跡 |
|---|---|---|
| 前提 | 送信元・宛先IP、プロトコル、ポート、セッション状態、戻り通信 | 対象、構成図、OS・機種、直前変更 |
| 正常系 | 期待する通信・状態と判定値 | socket状態、パケットキャプチャ、FWログ、アプリ応答 |
| 異常系 | 一度に一条件だけ変え、症状と観測点を照合 | 失敗出力、時刻、仮説、次の確認 |
| 復旧 | 原因を戻し、同じ試験と代表的な既存通信を再確認 | 変更前後、復旧判定、残存リスク |
インフラエンジニアが案件で考えること
実案件で「TCPの3ウェイハンドシェイクとは?SYN・ACKを図解」を確認するとき、最初に現行構成と正常時の状態を保存します。TCPの3ウェイハンドシェイクとは?通信開始前の接続確立、パケット図で見るSYN→SYN/ACK→ACKの流れ、1回目|クライアントがSYNを送信する、2回目|サーバーがSYN/ACKを返信するを同じ時刻・同じ条件で取得し、変更や障害の前後を比べます。
TCPの確認結果は時刻と対象を付けて残します。3回目|クライアントがACKを返して接続が成立する、シーケンス番号と確認応答番号の見方、TCPフラグをWiresharkで確認する方法を変更前後で比べ、増減の理由を確認します。
パケットを見るときはフラグだけでなく送信元・宛先、シーケンス、ACK、再送間隔、TTL、ウィンドウを同じstreamで追います。正常通信と失敗通信を並べると差が明確になります。
案件では、正常時の情報がなければ障害時の差分を判断できません。作業前にWireshark: tcp.flags.syn == 1とWireshark: tcp.stream eq Nを取得し、変更後も同じ条件で比較します。
また、Ping成功をTCP接続成功とみなすとSYN再送だけでサーバー停止と断定をレビュー観点へ入れます。担当者の経験だけに頼らず、クライアント側でSYN/ACK受信とACK送信を確認から確立後のTLS・アプリ応答を別段階として確認までを手順と試験項目へ落とし、異常時に止める条件と判断者を明確にします。
成果物には、構成図、対象一覧、取得ログ、差分、試験結果、残課題をひも付けます。TCP 3ウェイハンドシェイクの知識を『知っている』状態から、第三者が安全に再現できる設計・構築スキルへ変えるためです。
| 段階 | 確認すること | 残す証跡 |
|---|---|---|
| 作業前 | DNSと経路を先に確認 | Wireshark: tcp.flags.syn == 1 |
| 作業中 | サーバー側でSYN受信とSYN/ACK送信を確認 | Linux: ss -tn state syn-sent |
| 作業後 | 確立後のTLS・アプリ応答を別段階として確認 | Windows: 試験-NetConnection -Port |
| 異常時 | Ping成功をTCP接続成功とみなす | 時刻・影響範囲・切り戻し判断 |
同じ条件でbefore/afterを比較できる状態にします。
まとめ
3ウェイハンドシェイクはSYN→SYN/ACK→ACKでTCP接続を確立します。障害時はキャプチャを両端または中継点で取得し、SYNが出ない、SYN/ACKが戻らない、最後のACKが届かない、RSTが返るのどこで止まるかを分けます。
