TCP通信をパケットで確認する|Wiresharkで3ウェイハンドシェイク・Seq・Ackを読み解く

ネットワーク中級編 34/全50記事

この記事は、 「ネットワーク中級編|構築・検証・障害切り分けを身につける」 の第34回です。

前回の「ARPをパケットで確認する」でLayer 2のアドレス解決を確認しました。 今回はその先で動作するTCPについて、接続開始からデータ転送、切断までをWiresharkで読み解きます。

TCP通信をパケットで確認する|Wiresharkで3ウェイハンドシェイク・Seq・Ackを読み解く

TCPを理解するうえで重要なのは、SYN・ACK・FINという用語を暗記することではありません。 実際のパケットを時系列で追い、「接続できたのか」「どこまでデータが届いたのか」 「再送が発生していないか」を判断できるようになることです。 この記事では、Wiresharkを使ってTCP通信の一連の流れを確認します。

対象レベル Level 2・中級
想定読了時間 約30分
身につく成果 TCP通信の状態をパケットから判断できる
前提知識 TCPの基本/Wiresharkの基本
演習環境 PC+Wireshark+TCP通信先

「サーバーへ接続できない」という障害が発生したとき、 pingだけではアプリケーションが利用するTCPポートまで接続できているか判断できません。

TCPパケットを確認すると、 クライアントからSYNが出ているか、サーバーからSYN/ACKが返っているか、 データ送受信後にACKが返っているかを確認できます。

つまり、単なる「通信できる/できない」ではなく、 TCP通信のどの段階で止まっているのかを絞り込めます。

この記事を読み終えるとできること

  • SYN・SYN/ACK・ACKをパケットから見分けられる
  • 3ウェイハンドシェイクを時系列で説明できる
  • Sequence NumberとAcknowledgment Numberを読み取れる
  • TCPデータ転送とACKの関係を説明できる
  • FINとRSTの違いをパケットから判断できる
  • 再送やZero Windowから障害原因を考えられる

TCPをパケットで確認すると何が分かるのか

今回の結論

TCPパケットを時系列で追うと、接続確立・データ転送・確認応答・再送・切断の どの段階で通信が止まっているのかを判断できます。

TCPは、Web、SSH、メール、ファイル転送、データベース通信など、 多くのアプリケーション通信の土台として使われます。

TCPでは、いきなりアプリケーションデータを送るのではなく、 基本的に最初に通信相手との接続状態を作ります。

TCP通信の大きな流れ

💻 クライアント
TCP接続を開始する側
① SYN
② SYN / ACK
③ ACK
④ データ
⑤ ACK/応答データ
⑥ FIN / ACKで切断
🗄️ サーバー
TCP接続を受け付ける側

たとえば、クライアントからサーバーのTCP/443へアクセスできない場合、 パケットを見ることで次のように切り分けられます。

パケットの状態 読み取れること
SYN自体が出ていない アプリケーション、名前解決、経路選択、ローカル端末側などを確認する
SYNだけを繰り返している サーバーまで届いていない、または応答が戻っていない可能性がある
SYNに対してRSTが返る 通信先へは到達しているが、対象ポートが待ち受けていない可能性などを考える
3ウェイハンドシェイクが完了 少なくともTCP接続確立までは成功している
データ送信後に再送が多発 パケットロス、経路品質、MTU、受信側処理などを調査する

「TCP/443へ接続できない」と「HTTPSの処理で失敗している」は別の問題です。

まず3ウェイハンドシェイクが成立しているか確認すると、 ネットワーク側と、その上のTLS・HTTP・アプリケーション側を分けて調査できます。

今回の検証構成

今回は、PCからWebサーバーのTCP/443へ接続する通信を例にします。 実際に利用するIPアドレスは自分の環境へ読み替えてください。

検証用ネットワーク

💻 検証PC
192.168.10.10
TCPクライアント
TCP SYN
TCP SYN / ACK
TCP ACK
TCP/443でデータ通信
🌐 Webサーバー
TCP/443
HTTPS

ブラウザはHTTP/3などTCP以外の通信方式を使用する場合があるため、 TCP通信を確実に発生させたい検証では、curlなどでHTTP/1.1を明示すると確認しやすくなります。

curl.exe --http1.1 https://example.com/ -o NUL

パケットキャプチャーは、自分が管理する端末・検証環境、 または取得許可を得たネットワークで実施してください。

業務ネットワークのキャプチャーにはIPアドレス、ホスト名、 セッション情報、場合によっては認証情報や業務データが含まれます。

WiresharkでTCP通信を取得する

  1. 通信に使用しているインターフェースを確認する EthernetまたはWi-Fiなど、実際の通信が流れるインターフェースを選択します。
  2. Wiresharkでキャプチャーを開始する 対象インターフェースをダブルクリックして取得を開始します。
  3. TCP通信を発生させる ブラウザ、curl、SSHなどを使ってTCP通信を発生させます。
  4. 表示フィルターへtcpを入力する 最初はTCPだけに絞り、対象通信を探します。
  5. 対象ポートやIPアドレスでさらに絞り込む TCP/443なら tcp.port == 443 などを利用します。
  6. 対象セッションだけを表示する 対象パケットを選び、TCP Stream単位で絞り込みます。

最初に使う表示フィルター

tcp

TCP/443だけを表示する場合は次のようにします。

tcp.port == 443

特定のIPアドレスとのTCP通信だけを表示する場合は、次のようにできます。

ip.addr == 203.0.113.20 && tcp

キャプチャーフィルターと表示フィルターは別物です。

この記事では、取得後に表示対象を絞り込める Wiresharkの「表示フィルター」を中心に使用します。

3ウェイハンドシェイクを確認する

TCP通信で最初に確認したいのが、3ウェイハンドシェイクです。

正常なTCP接続では、基本的に次の3パケットが確認できます。

No. Source Destination Flags Seq Ack 意味
1 192.168.10.10 203.0.113.20 [SYN] 0 0 接続要求
2 203.0.113.20 192.168.10.10 [SYN, ACK] 0 1 接続要求を受信し、自分側も同期
3 192.168.10.10 203.0.113.20 [ACK] 1 1 サーバーのSYNを確認

1.クライアント → サーバー:SYN

クライアントは、TCP接続を開始するためにSYNフラグを設定したセグメントを送信します。

Transmission Control Protocol
    Source Port: 53124
    Destination Port: 443
    Sequence Number: 0    (relative sequence number)
    Acknowledgment Number: 0
    Flags: 0x002 (SYN)
        Syn: Set
        Acknowledgment: Not set

ここで確認するポイントは次のとおりです。

  • 送信元ポートはクライアント側の一時ポート
  • 宛先ポートはサーバー側の待ち受けポート
  • SYNフラグが設定されている
  • 最初のシーケンス番号を相手へ通知する

2.サーバー → クライアント:SYN / ACK

サーバーが接続要求を受け付けると、 SYNとACKの両方を設定したセグメントを返します。

Transmission Control Protocol
    Source Port: 443
    Destination Port: 53124
    Sequence Number: 0    (relative sequence number)
    Acknowledgment Number: 1
    Flags: 0x012 (SYN, ACK)
        Acknowledgment: Set
        Syn: Set

Ack=1は、クライアントが送信したSYNを受け取り、 次のシーケンス番号を待っていることを表します。

3.クライアント → サーバー:ACK

最後にクライアントがACKを返します。

Transmission Control Protocol
    Source Port: 53124
    Destination Port: 443
    Sequence Number: 1
    Acknowledgment Number: 1
    Flags: 0x010 (ACK)

ここまで完了すると、TCP接続は確立状態になります。

障害切り分けで最初に見る3パケット

SYN → SYN/ACK → ACK が揃っているか確認してください。 これだけで「TCP接続確立前の問題なのか、接続確立後の問題なのか」を大きく分けられます。

Sequence NumberとAck Numberを理解する

TCPパケット解析で最も混乱しやすいのが、 Sequence NumberとAcknowledgment Numberです。

基本ルール

Ack Numberは「ここまで受け取った」という番号ではなく、 基本的に「次はこのSequence Numberから送ってほしい」という値です。

500バイトのデータを送る例

クライアントがSequence Number 1から500バイトのTCPデータを送ったとします。

SeqとAckの関係

クライアント
Seq = 1
Len = 500
Seq=1, Len=500
Ack=501
サーバー
500バイトを受信
次は501を待つ

受信側は、Sequence Number 1から500バイト分を受信したため、 次に期待する番号は501です。

送信:
Seq = 1
Len = 500

受信側からのACK:
Ack = 501

SYNとFINもシーケンス番号を1つ消費する

SYNとFINはアプリケーションデータを持たない場合でも、 TCPのシーケンス空間上ではそれぞれ1つ分を使用します。

そのため、最初のSYNがWireshark上で相対的に Seq=0 と表示されている場合、 SYN/ACK側のAcknowledgment Numberは通常 1 になります。

WiresharkではTCPのSequence Numberを読みやすくするため、 相対シーケンス番号で表示されることがあります。

実際のTCPヘッダー上では、接続開始時により大きな初期シーケンス番号が使用されています。

データ転送とACKを確認する

3ウェイハンドシェイクが終わると、 アプリケーションデータの送受信が始まります。

No. Direction Flags Seq Ack Len
4 Client → Server ACK 1 1 517
5 Server → Client ACK 1 518 0
6 Server → Client ACK 1 518 1240
7 Client → Server ACK 518 1241 0

この例では、クライアントが Seq=1から517バイト送っています。

サーバーは次に受け取りたい番号として Ack=518を返しています。

ACKは必ず1パケットごととは限らない

TCPでは、受信したすべてのデータセグメントに対して 必ず即座に個別ACKを返すとは限りません。

複数のデータ受信をまとめて確認応答するDelayed ACKなどの動作もあるため、 「データ1個にACK1個が存在しないから異常」と判断しないようにしてください。

TCP解析では「番号がつながっているか」を見る

Seq、Len、Ackを時系列で見ると、 どのデータまで相手が受信できたかを追跡できます。

FIN・ACKによるTCP切断を確認する

TCP通信が終了するときは、FINを使って接続を閉じます。

典型的には次のような流れが確認できます。

TCP正常終了のイメージ

クライアント
① FIN, ACK
② ACK
③ FIN, ACK
④ ACK
サーバー

ただし、実際にはACKとFINがまとめて送信されることもあり、 必ず4パケットになるとは限りません。

FINとRSTの違い

項目 FIN RST
意味 通常の接続終了 接続のリセット
終了方法 相手と確認しながら終了 セッションを急に終了させる
障害調査 正常終了でも見える 原因確認が必要なことが多い

RSTが見えたからといって、必ずネットワーク障害とは限りません。

アプリケーション自身が接続を終了した場合、 待ち受けポートが存在しない場合、 ファイアウォールなどが明示的に拒否した場合など、 複数の原因が考えられます。

実務で使えるWiresharkフィルター

TCP通信を調査するときに使用頻度の高い表示フィルターを整理します。

目的 表示フィルター
すべてのTCP tcp
TCP/443 tcp.port == 443
特定IPとのTCP ip.addr == 203.0.113.20 && tcp
SYNを含むパケット tcp.flags.syn == 1
RST tcp.flags.reset == 1
FIN tcp.flags.fin == 1
TCP再送 tcp.analysis.retransmission
Fast Retransmission tcp.analysis.fast_retransmission
Duplicate ACK tcp.analysis.duplicate_ack
Zero Window tcp.analysis.zero_window

1つのTCPセッションだけを見る

Webサイトへアクセスすると複数のTCPセッションが同時に発生することがあります。 その場合は対象パケットを右クリックし、 Follow → TCP Streamを利用すると対象セッションを追いやすくなります。

Wiresharkが対象ストリームへフィルターを設定すると、 次のような形式で表示できます。

tcp.stream eq 3

TCP解析では、最初から大量のパケットを目視するのではなく、 IPアドレス → ポート番号 → TCP Stream の順に絞ると効率的です。

TCP障害をパケットで切り分ける

TCP障害では、エラーメッセージだけを見るのではなく、 「どのパケットまで確認できたか」を整理します。

CASE 1 SYNを繰り返している
Client → Server  [SYN]


Client → Server  [TCP Retransmission] [SYN]
Client → Server  [TCP Retransmission] [SYN]

クライアントは接続要求を送っていますが、 SYN/ACKまたはRSTを確認できていません。

主な確認候補

  • 宛先IPアドレスが正しいか
  • ルーティングが正しいか
  • 途中のACLやファイアウォールで破棄されていないか
  • サーバーが起動しているか
  • 戻り経路があるか
  • キャプチャーポイントより先で応答が失われていないか
CASE 2 SYNに対してRST / ACKが返る
Client → Server  [SYN]


Server → Client  [RST, ACK]

少なくとも応答が返る経路は存在しています。 一方でTCP接続は受け付けられていません。

主な確認候補

  • サーバー側サービスが起動しているか
  • 接続先ポート番号が正しいか
  • 対象IPアドレスでサービスがListenしているか
  • 途中のセキュリティ機器がRejectを返していないか
CASE 3 3ウェイハンドシェイク後にRST
Client → Server  [SYN]


Server → Client  [SYN, ACK]
Client → Server  [ACK]
Client → Server  Application Data
Server → Client  [RST, ACK]

TCP接続自体は確立しています。 その後に送信した内容やアプリケーション処理を含めて確認します。

主な確認候補

  • TLSやアプリケーションプロトコルの不一致
  • アプリケーション側の異常終了
  • セッションタイムアウト
  • ファイアウォールやロードバランサーによるリセット
CASE 4 TCP Retransmissionが多発する

一度送ったデータが確認応答されず、 同じ範囲のデータを再度送信している可能性があります。

主な確認候補

  • 物理回線や無線区間でのパケットロス
  • インターフェースエラーやドロップ
  • 輻輳によるパケットロス
  • MTUやPMTUDに関連する問題
  • 片方向だけに問題がある経路
  • キャプチャー自体の取りこぼし

Wiresharkの「TCP Retransmission」は、 取得したパケットをもとにWiresharkが解析して表示する情報です。

キャプチャー側でパケットを取りこぼした場合にも、 実ネットワーク上の再送と似た見え方になることがあります。

CASE 5 Duplicate ACKが続く

同じAcknowledgment Numberが繰り返されている場合、 受信側が途中のデータを待っている可能性があります。

Sequence Numberの抜けと合わせて確認すると、 特定セグメントの欠落を推測できます。

CASE 6 TCP ZeroWindowが表示される

受信側がWindow Sizeを0として通知すると、 送信側は通常、新しいデータ送信を一時停止します。

主な確認候補

  • 受信アプリケーションの処理が追いついていない
  • 受信側OSのバッファが一時的に埋まっている
  • サーバーのCPU・メモリ・I/O負荷
  • アプリケーションの停止や処理遅延

Zero Windowの場合、ネットワーク回線だけではなく 受信側ホストやアプリケーションの状態も重要です。

障害調査の基本手順

  1. SYNが送信されているか確認する そもそもTCP接続要求が出ているかを確認します。
  2. SYN/ACKまたはRSTが返るか確認する 宛先側から何らかの応答があるかを確認します。
  3. 3ウェイハンドシェイクが完了しているか確認する TCP接続確立前と確立後で調査範囲を分けます。
  4. データとACKの流れを確認する Seq、Ack、Lenを見て、どこまで受信されているか確認します。
  5. 再送・Duplicate ACK・Zero Window・RSTを確認する TCP解析情報から異常の特徴を探します。
  6. キャプチャー位置と機器ログを照合する パケットだけで断定せず、FWログ、サーバーログ、IFカウンターなどと組み合わせます。

調査結果の報告例

【事象】
PC-AからWebサーバーのTCP/443へ接続できない。

【パケット確認結果】
PC-A(192.168.10.10)からWebサーバー宛てのSYN送信を確認。
同一SYNが再送されているが、SYN/ACKおよびRSTの応答は確認できない。

【判断】
クライアントからTCP接続要求は送信されている。
一方、TCP接続確立前の段階で応答を受信できていない。

【次の確認】
・途中FWのTCP/443許可状況
・サーバーまでのルーティング
・サーバー側の受信有無
・サーバーからクライアントへの戻り経路
・キャプチャーポイント以降のパケットロス

HTTPS通信では何が見えるのか

HTTPSでは、HTTPの内容はTLSによって暗号化されます。

しかし、TCPそのものまで見えなくなるわけではありません。

HTTPSをTCPで利用している場合でも、 Wiresharkでは次のようなTCP情報を確認できます。

  • 送信元・宛先IPアドレス
  • 送信元・宛先TCPポート
  • SYN・ACK・FIN・RST
  • Sequence Number
  • Acknowledgment Number
  • Window Size
  • 再送などのTCP解析情報
  • TCP上で交換されるTLSレコード

したがってHTTPS障害でも、 「TCP接続自体が成立しない」のか、 「TCP接続後のTLSやHTTP処理で失敗している」のかを切り分けられます。

パケットキャプチャーは暗号化通信でも役に立ちます。

ペイロードの中身が読めなくても、通信相手、接続状態、タイミング、 再送、切断位置などから多くの情報を得られます。

TCPパケット解析でよくある勘違い

勘違い1:SYNが出ていればサーバーまで届いている

クライアント側でSYNを取得できても、 そのパケットが途中のルーターやファイアウォールを越えて サーバーまで到達したとは限りません。

勘違い2:3ウェイハンドシェイク成功=Webサイト正常

分かるのはTCP接続が成立したことです。 TLS、HTTP、認証、Webアプリケーションなどは別途確認が必要です。

勘違い3:RST=必ずファイアウォール障害

RSTはOS、アプリケーション、ロードバランサー、 ファイアウォールなど複数の機器から送信される可能性があります。 送信元IPやキャプチャー位置も確認します。

勘違い4:Retransmissionがあれば必ず回線障害

実際のパケットロスだけでなく、 SPANやキャプチャー端末側での取りこぼしなどでも Wireshark上では再送に見えることがあります。

勘違い5:Ack Numberは最後に受信した番号

基本的には「次に受信したいSequence Number」を示します。 データ長とSeqを合わせて考えることが重要です。

理解度チェック

TCPパケットの読み方を理解できたか、5問で確認します。

問題1.3ウェイハンドシェイクの正しい順序はどれですか。

  1. ACK → SYN → SYN/ACK
  2. SYN → ACK → SYN/ACK
  3. SYN → SYN/ACK → ACK
  4. SYN/ACK → SYN → ACK
解答を見る
正解:C

クライアントがSYNを送り、サーバーがSYN/ACKを返し、 最後にクライアントがACKを返します。

問題2.Seq=100、Len=500のデータを正常に受信した場合、次に期待するAck Numberはいくつですか。

解答を見る
正解:600

Sequence Number 100から500バイト分を受信したため、 次に期待するSequence Numberは600です。

問題3.次のパケットが繰り返されている場合、何を疑いますか。

Client → Server [SYN]


Client → Server [TCP Retransmission] [SYN]
Client → Server [TCP Retransmission] [SYN]
解答を見る

SYNに対するSYN/ACKまたはRSTを受信できていません。 経路、FW、サーバー停止、戻り経路などを確認します。

問題4.3ウェイハンドシェイクが完了していれば、HTTPS通信全体が正常と言えますか。

解答を見る
正解:言えません。

TCP接続が成立したことは確認できますが、 その後のTLS、HTTP、認証、アプリケーション処理が正常とは限りません。

問題5.TCP ZeroWindowが示す状態として最も適切なものはどれですか。

  1. ルーターが経路を持っていない
  2. 受信側が現在受け取れるウィンドウを0として通知している
  3. TCPポートが閉じている
  4. DNS名前解決に失敗している
解答を見る
正解:B

受信側のバッファやアプリケーション処理が追いついていない場合などに、 Window Size 0が通知されることがあります。

実践演習:TCP通信をWiresharkで読み取ろう

実際にTCP通信を発生させ、 Wiresharkで接続開始から終了までを追跡します。

演習1.TCP通信を取得する

  1. Wiresharkを起動する
  2. 使用中のEthernetまたはWi-Fiを選択する
  3. キャプチャーを開始する
  4. TCP通信を発生させる
  5. tcpで表示を絞る
  6. 対象通信をTCP Stream単位で絞る
使用した通信先:
宛先IPアドレス:
宛先TCPポート:
TCP Stream番号:

演習2.3ウェイハンドシェイクを探す

対象ストリームの最初から、 SYN、SYN/ACK、ACKの3つを探してください。

SYN
送信元IP:
宛先IP:
Source Port:
Destination Port:
Seq:

SYN/ACK
Seq:
Ack:

ACK
Seq:
Ack:
確認ポイントを見る
  • SYNの宛先ポートが目的のサービスと一致しているか
  • SYNに対してSYN/ACKが返っているか
  • SYN/ACKのAckがSYNの次の番号になっているか
  • 最後のACKまで確認できるか

演習3.データとACKの番号を追う

TCP Lenが0より大きいパケットを1つ選び、 Sequence Numberとデータ長を確認してください。

送信パケットのSeq:
TCP Len:
次に期待するAck Number:
実際に返ったAck Number:
計算方法を見る

基本的には、 Seq + TCP Len = 次に期待するAck と考えて確認できます。

演習4.異常系フィルターを確認する

次のフィルターを1つずつ入力してください。

tcp.analysis.retransmission

tcp.analysis.fast_retransmission

tcp.analysis.duplicate_ack

tcp.analysis.zero_window

tcp.flags.reset == 1

何も表示されないこと自体は異常ではありません。 正常通信では、これらがほとんど表示されない場合もあります。

Retransmission:あり/なし
Duplicate ACK:あり/なし
Zero Window:あり/なし
RST:あり/なし

気になったパケット:

演習5.調査結果を報告文にする

最後に、取得したTCP通信について3~5行程度で報告してください。

【通信先】

【TCP接続状態】

【データ転送状態】

【異常の有無】
報告例を見る

PCからWebサーバーTCP/443への通信を確認しました。 SYN → SYN/ACK → ACKの3ウェイハンドシェイクが成立しており、 TCP接続は正常に確立しています。 その後も双方向のデータ送信とACKを確認し、 対象ストリームでは継続的なRetransmissionやRSTは確認されませんでした。

自分の言葉で説明する課題

利用者から「Webサーバーへつながらない」と連絡がありました。 Wiresharkを確認すると、クライアントからSYNは送信されていますが、 SYN/ACKもRSTも返っていません。

この時点で分かることと、次に確認する項目を説明してください。

分かること:

次に確認すること:
説明例を見る

クライアントからTCP接続要求であるSYNは送信されていますが、 TCP接続確立に必要な応答を受信できていません。

この時点では「サーバーが悪い」と断定できません。 宛先IP、ルーティング、途中のACL・ファイアウォール、 サーバー側でSYNを受信しているか、戻り経路があるかを順番に確認します。

まとめ

  • TCP通信は、まずSYN → SYN/ACK → ACKで接続を確立する
  • 3ウェイハンドシェイクを確認すると、TCP接続前後で障害範囲を分けられる
  • Sequence Numberは送信データの位置を管理する
  • Ack Numberは基本的に「次に受け取りたいSequence Number」を表す
  • SYNとFINはシーケンス番号を1つ使用する
  • FINは通常の終了、RSTは接続のリセットに使われる
  • RetransmissionやDuplicate ACKはパケットロス調査の手掛かりになる
  • Zero Windowではネットワークだけでなく受信側ホストやアプリケーションも確認する
  • HTTPSでもTCPの接続状態や再送、切断状態は確認できる
  • パケットだけで断定せず、機器ログやIFカウンターと組み合わせて判断する

TCPパケット解析で重要なのは、フラグ名を暗記することではなく、 「どこまで通信が成功しているか」を時系列で説明できることです。

次の記事:DNS通信をパケットで確認する

今回は、TCPの接続確立、Sequence Number、ACK、 データ転送、切断、再送の見方を確認しました。

次の記事ではDNS通信をWiresharkで取得し、 QueryとResponse、名前解決先、DNSレコード、 応答コードなどをパケットから読み解きます。

「DNSサーバーへ問い合わせていない」 「問い合わせは出ているが応答がない」 「応答はあるが名前解決結果が想定と違う」 といった障害の切り分けにつなげます。

ネットワーク中級編 34/全50記事

中級編では、構築・検証・パケット解析・障害切り分けを通して、 「設定できる」だけでなく「なぜ通信できるのか、なぜ通信できないのか」を 根拠とともに説明できる状態を目指します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次