この記事は、 「ネットワーク中級編|構築・検証・障害切り分けを身につける」 の第34回です。
前回の「ARPをパケットで確認する」でLayer 2のアドレス解決を確認しました。 今回はその先で動作するTCPについて、接続開始からデータ転送、切断までをWiresharkで読み解きます。
TCP通信をパケットで確認する|Wiresharkで3ウェイハンドシェイク・Seq・Ackを読み解く
TCPを理解するうえで重要なのは、SYN・ACK・FINという用語を暗記することではありません。 実際のパケットを時系列で追い、「接続できたのか」「どこまでデータが届いたのか」 「再送が発生していないか」を判断できるようになることです。 この記事では、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接続を開始する側
TCP接続を受け付ける側
たとえば、クライアントからサーバーのTCP/443へアクセスできない場合、 パケットを見ることで次のように切り分けられます。
| パケットの状態 | 読み取れること |
|---|---|
| SYN自体が出ていない | アプリケーション、名前解決、経路選択、ローカル端末側などを確認する |
| SYNだけを繰り返している | サーバーまで届いていない、または応答が戻っていない可能性がある |
| SYNに対してRSTが返る | 通信先へは到達しているが、対象ポートが待ち受けていない可能性などを考える |
| 3ウェイハンドシェイクが完了 | 少なくともTCP接続確立までは成功している |
| データ送信後に再送が多発 | パケットロス、経路品質、MTU、受信側処理などを調査する |
「TCP/443へ接続できない」と「HTTPSの処理で失敗している」は別の問題です。
まず3ウェイハンドシェイクが成立しているか確認すると、 ネットワーク側と、その上のTLS・HTTP・アプリケーション側を分けて調査できます。
今回の検証構成
今回は、PCからWebサーバーのTCP/443へ接続する通信を例にします。 実際に利用するIPアドレスは自分の環境へ読み替えてください。
検証用ネットワーク
192.168.10.10
TCPクライアント
TCP/443
HTTPS
ブラウザはHTTP/3などTCP以外の通信方式を使用する場合があるため、 TCP通信を確実に発生させたい検証では、curlなどでHTTP/1.1を明示すると確認しやすくなります。
curl.exe --http1.1 https://example.com/ -o NUL
パケットキャプチャーは、自分が管理する端末・検証環境、 または取得許可を得たネットワークで実施してください。
業務ネットワークのキャプチャーにはIPアドレス、ホスト名、 セッション情報、場合によっては認証情報や業務データが含まれます。
WiresharkでTCP通信を取得する
- 通信に使用しているインターフェースを確認する EthernetまたはWi-Fiなど、実際の通信が流れるインターフェースを選択します。
- Wiresharkでキャプチャーを開始する 対象インターフェースをダブルクリックして取得を開始します。
- TCP通信を発生させる ブラウザ、curl、SSHなどを使ってTCP通信を発生させます。
- 表示フィルターへtcpを入力する 最初はTCPだけに絞り、対象通信を探します。
-
対象ポートやIPアドレスでさらに絞り込む
TCP/443なら
tcp.port == 443などを利用します。 - 対象セッションだけを表示する 対象パケットを選び、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接続確立前の問題なのか、接続確立後の問題なのか」を大きく分けられます。
TCPヘッダーの重要項目
TCPヘッダーには多くのフィールドがありますが、 中級編ではまず次の項目を読めるようにしましょう。
| フィールド | 役割 | 障害調査で見るポイント |
|---|---|---|
| Source Port | 送信元TCPポート | どのセッションかを識別する |
| Destination Port | 宛先TCPポート | 想定したサービスへ接続しているか |
| Sequence Number | 送信データの位置を管理する | データの連続性や再送を確認する |
| Acknowledgment Number | 次に受信したいシーケンス番号を通知する | どこまで正常受信されたか確認する |
| Flags | 接続・確認・切断などを制御する | SYN、ACK、FIN、RSTなどを見る |
| Window | 受信可能なデータ量を通知する | 受信側の処理詰まりを確認する |
| Options | MSS、Window Scale、SACKなどを通知する | 接続開始時のTCP能力を確認する |
よく見るTCPフラグ
SYN ACK FIN RST PSH
SYN
TCP接続開始時に使用します。 双方のシーケンス番号を同期するための重要なフラグです。
ACK
Acknowledgment Numberが有効であることを示します。 接続確立後の多くのTCPパケットで設定されます。
FIN
送信側が「これ以上送信するデータはない」と通知し、 TCP接続を正常終了するときに使います。
RST
TCP接続をリセットします。 ポート未待受けや異常なセッションなどで確認することがあります。
PSH
受信したデータをアプリケーションへ速やかに渡すことを促すためのフラグです。
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
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正常終了のイメージ
ただし、実際には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障害では、エラーメッセージだけを見るのではなく、 「どのパケットまで確認できたか」を整理します。
Client → Server [SYN]
Client → Server [TCP Retransmission] [SYN]
Client → Server [TCP Retransmission] [SYN]
クライアントは接続要求を送っていますが、 SYN/ACKまたはRSTを確認できていません。
主な確認候補
- 宛先IPアドレスが正しいか
- ルーティングが正しいか
- 途中のACLやファイアウォールで破棄されていないか
- サーバーが起動しているか
- 戻り経路があるか
- キャプチャーポイントより先で応答が失われていないか
Client → Server [SYN]
Server → Client [RST, ACK]
少なくとも応答が返る経路は存在しています。 一方でTCP接続は受け付けられていません。
主な確認候補
- サーバー側サービスが起動しているか
- 接続先ポート番号が正しいか
- 対象IPアドレスでサービスがListenしているか
- 途中のセキュリティ機器がRejectを返していないか
Client → Server [SYN]
Server → Client [SYN, ACK]
Client → Server [ACK]
Client → Server Application Data
Server → Client [RST, ACK]
TCP接続自体は確立しています。 その後に送信した内容やアプリケーション処理を含めて確認します。
主な確認候補
- TLSやアプリケーションプロトコルの不一致
- アプリケーション側の異常終了
- セッションタイムアウト
- ファイアウォールやロードバランサーによるリセット
一度送ったデータが確認応答されず、 同じ範囲のデータを再度送信している可能性があります。
主な確認候補
- 物理回線や無線区間でのパケットロス
- インターフェースエラーやドロップ
- 輻輳によるパケットロス
- MTUやPMTUDに関連する問題
- 片方向だけに問題がある経路
- キャプチャー自体の取りこぼし
Wiresharkの「TCP Retransmission」は、 取得したパケットをもとにWiresharkが解析して表示する情報です。
キャプチャー側でパケットを取りこぼした場合にも、 実ネットワーク上の再送と似た見え方になることがあります。
同じAcknowledgment Numberが繰り返されている場合、 受信側が途中のデータを待っている可能性があります。
Sequence Numberの抜けと合わせて確認すると、 特定セグメントの欠落を推測できます。
受信側がWindow Sizeを0として通知すると、 送信側は通常、新しいデータ送信を一時停止します。
主な確認候補
- 受信アプリケーションの処理が追いついていない
- 受信側OSのバッファが一時的に埋まっている
- サーバーのCPU・メモリ・I/O負荷
- アプリケーションの停止や処理遅延
Zero Windowの場合、ネットワーク回線だけではなく 受信側ホストやアプリケーションの状態も重要です。
障害調査の基本手順
- SYNが送信されているか確認する そもそもTCP接続要求が出ているかを確認します。
- SYN/ACKまたはRSTが返るか確認する 宛先側から何らかの応答があるかを確認します。
- 3ウェイハンドシェイクが完了しているか確認する TCP接続確立前と確立後で調査範囲を分けます。
- データとACKの流れを確認する Seq、Ack、Lenを見て、どこまで受信されているか確認します。
- 再送・Duplicate ACK・Zero Window・RSTを確認する TCP解析情報から異常の特徴を探します。
- キャプチャー位置と機器ログを照合する パケットだけで断定せず、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パケット解析でよくある勘違い
クライアント側でSYNを取得できても、 そのパケットが途中のルーターやファイアウォールを越えて サーバーまで到達したとは限りません。
分かるのはTCP接続が成立したことです。 TLS、HTTP、認証、Webアプリケーションなどは別途確認が必要です。
RSTはOS、アプリケーション、ロードバランサー、 ファイアウォールなど複数の機器から送信される可能性があります。 送信元IPやキャプチャー位置も確認します。
実際のパケットロスだけでなく、 SPANやキャプチャー端末側での取りこぼしなどでも Wireshark上では再送に見えることがあります。
基本的には「次に受信したいSequence Number」を示します。 データ長とSeqを合わせて考えることが重要です。
理解度チェック
TCPパケットの読み方を理解できたか、5問で確認します。
問題1.3ウェイハンドシェイクの正しい順序はどれですか。
- ACK → SYN → SYN/ACK
- SYN → ACK → SYN/ACK
- SYN → SYN/ACK → ACK
- SYN/ACK → SYN → ACK
解答を見る
クライアントがSYNを送り、サーバーがSYN/ACKを返し、 最後にクライアントがACKを返します。
問題2.Seq=100、Len=500のデータを正常に受信した場合、次に期待するAck Numberはいくつですか。
解答を見る
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が示す状態として最も適切なものはどれですか。
- ルーターが経路を持っていない
- 受信側が現在受け取れるウィンドウを0として通知している
- TCPポートが閉じている
- DNS名前解決に失敗している
解答を見る
受信側のバッファやアプリケーション処理が追いついていない場合などに、 Window Size 0が通知されることがあります。
実践演習:TCP通信をWiresharkで読み取ろう
実際にTCP通信を発生させ、 Wiresharkで接続開始から終了までを追跡します。
演習1.TCP通信を取得する
- Wiresharkを起動する
- 使用中のEthernetまたはWi-Fiを選択する
- キャプチャーを開始する
- TCP通信を発生させる
tcpで表示を絞る- 対象通信をTCP Stream単位で絞る
宛先IPアドレス:
宛先TCPポート:
TCP Stream番号:
演習2.3ウェイハンドシェイクを探す
対象ストリームの最初から、 SYN、SYN/ACK、ACKの3つを探してください。
送信元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とデータ長を確認してください。
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
何も表示されないこと自体は異常ではありません。 正常通信では、これらがほとんど表示されない場合もあります。
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パケット解析で重要なのは、フラグ名を暗記することではなく、 「どこまで通信が成功しているか」を時系列で説明できることです。
中級編では、構築・検証・パケット解析・障害切り分けを通して、 「設定できる」だけでなく「なぜ通信できるのか、なぜ通信できないのか」を 根拠とともに説明できる状態を目指します。

コメント