TCPコネクションの可視化 — 3ウェイハンドシェイク・データ転送・切断
TCPは「確実に・順番どおり届ける」ための仕組みです。いきなりデータを送るのではなく、まず 3回のやり取り(3ウェイハンドシェイク)で接続を確立し、データには通し番号(シーケンス番号)を付け、受け取ったらACK(確認応答)を返します。「進む」を押して、接続の確立からデータ転送、切断までを1ステップずつ追ってください。各段でクライアント/サーバーの状態(CLOSED→ESTABLISHED…)も変化します。
いま何が起きているか
TCPとは — 信頼性のある通信
TCP(Transmission Control Protocol)は、第4層(トランスポート層)のプロトコルで、データを確実に・順番どおり相手へ届けることを保証します。そのために、①送る前に接続を確立し、②データに通し番号を付け、③受け取ったら確認応答(ACK)を返し、④届かなければ再送する、という仕組みを持ちます。動画配信やゲームなど「多少欠けても速さ優先」の場面では、確認応答をしない軽量な UDP が使われます。
3ウェイハンドシェイク(接続の確立)
通信を始める前に、両者が「準備OK」を確認し合う手続きです。3回のやり取りで完了します。
| 順番 | 向き | フラグ | 意味 |
|---|---|---|---|
| ① | クライアント → サーバー | SYN | 「接続したい」+最初のシーケンス番号を通知 |
| ② | サーバー → クライアント | SYN + ACK | 「私もOK(SYN)」+「①を受け取った(ACK)」 |
| ③ | クライアント → サーバー | ACK | 「②を受け取った」→ ここで接続確立(ESTABLISHED) |
なぜ3回なのか? お互いが「相手にちゃんと届く(送受信できる)」ことを確認するには、最低でも「行き(①)・帰り(②)・行きの確認(③)」の3回が必要だからです。2回では、サーバーからクライアントへの経路が生きているか確認できません。
シーケンス番号とACK番号 — 確実に届ける仕掛け
TCPは送るデータの1バイトごとにシーケンス番号(通し番号)を振ります。受信側は「◯◯番まで正しく受け取った、次は△△番から」というACK番号を返します。これにより、順番の入れ替わりを直したり、欠けた部分を検知して再送させたりできます。上の可視化の seq と ack がこれです。一定時間ACKが返らないと、送信側はそのデータを再送します(タイムアウト再送)。
切断(4ウェイハンドシェイク)
接続を閉じるときは、両方向をそれぞれ閉じるため、FIN と ACK を双方向でやり取りします(計4回)。片方がFINを送っても、もう片方に送り残しがあるかもしれないので、すぐには全部閉じず、片方向ずつ閉じていくのがポイントです。最後にクライアントは、遅れて届くパケットに備えて一定時間 TIME-WAIT で待ってから完全に閉じます。
TCPの状態遷移(頻出)
接続の進行に合わせて、両者の「状態」が移り変わります。上の可視化のバッジがこれです。
| クライアント側 | サーバー側 | |
|---|---|---|
| 待ち受け | CLOSED | LISTEN |
| 確立中 | SYN-SENT | SYN-RCVD |
| 確立 | ESTABLISHED | ESTABLISHED |
| 切断中 | FIN-WAIT → TIME-WAIT | CLOSE-WAIT → LAST-ACK |
| 切断完了 | CLOSED | CLOSED |
基本情報技術者試験ではこう出る
「TCPとUDPの違い(信頼性 vs 高速・軽量)」「3ウェイハンドシェイクの手順(SYN→SYN/ACK→ACK)」「TCPは第何層か(→第4層)」「コネクション型(TCP)とコネクションレス型(UDP)」が定番です。フラグ(SYN・ACK・FIN)の役割や、確認応答・再送による信頼性確保のしくみも問われます。ポート番号でアプリを区別する点は IPアドレスとMACアドレスの可視化 も参考になります。
よくある質問
Q. UDPにはハンドシェイクがないの?
A. ありません。UDPは接続の確立も確認応答もせず、いきなり送りっぱなしにします。そのぶん速く・軽いので、音声・動画・オンラインゲーム・DNS などで使われます。「多少欠けても、遅れるよりマシ」な用途向けです。
Q. なぜ切断は4回で、確立は3回なの?
A. 確立では、サーバーの「同意(SYN)」と「確認(ACK)」を1つのパケットにまとめて送れるので3回で済みます。切断では、片方が終わっても相手にまだ送るデータがあるかもしれず、FINとACKを分けて送るため4回になります。
Q. 「ポートが待ち受け(LISTEN)」ってどういう状態?
A. サーバーが特定のポート番号(例:Webなら443)で「接続が来たら受ける」と待っている状態です。クライアントからのSYNが届くと、そのポートでハンドシェイクが始まります。
関連:IPアドレスとMACアドレスの可視化 / OSI参照モデルの可視化 / SSL/TLSの可視化(TCP確立の“上”で動く暗号化)/ 可視化一覧