【入門編】 TCPフラグ制御(SYN, ACK, FIN, RST, PSH, URG)の役割 – ネットワーク基礎とWebセキュリティ実践ガイド

ネットワークの世界へ足を踏み入れたばかりの皆さん、こんにちは!
インフラの現場を駆け巡るネットワークセキュリティスペシャリストの私です。

日々の業務や学習の中で、サーバーとクライアントがどのように通信しているのか、その裏側の仕組みに興味を持ったことはありませんか?「Webサイトが表示されない」「パケットキャプチャ(Wiresharkなど)を開いてみたけれど、アルファベットの暗号みたいなものが並んでいて頭がクラクラする……」そんな経験、誰しも最初はありますよね。

大丈夫、一歩ずつ理解していきましょう!

今回は、TCP/IP通信の心臓部であり、パケットの「機嫌」や「意思表示」を司るTCPフラグ制御(SYN、ACK、FIN、RST、PSH、URG)にスポットを当てます。難解なビット数や小難しい仕様書の言葉はいったん脇に置いて、私たちが普段使っている「郵便配達」や「電話のやり取り」に例えながら、そのリアルな挙動を紐解いていきましょう。

—

1. TCPフラグってなに? パケットが持つ「感情の札」

私たちが誰かと会話をするとき、言葉だけでなく、うなずいたり、手を振って別れを告げたり、急な用事を思い出して話を遮ったりしますよね。

ネットワークの世界でも同じです。コンピューター同士がデータをやり取りする「TCP」という通信ルールでは、パケットの中に小さな「旗(フラグ)」を立てることで、相手に自分の状態や意図を伝えています。この旗が、今回主役となるTCPフラグです。

TCPヘッダーの中には、この旗を立てるためのスペース(フラグフィールド)が用意されており、主に次の6つのフラグが活躍します。

  • SYN (Synchronize): 「おしゃべりを始めましょう!」(接続要求)
  • ACK (Acknowledge): 「ちゃんと届いたよ!了解!」(確認応答)
  • FIN (Finish): 「もう用事は済んだから、回線を閉じますね」(切断要求)
  • RST (Reset): 「なんか変だぞ!一度全部ナシにして!」(強制切断)
  • PSH (Push): 「バッファに貯めないで、今すぐアプリに渡して!」(即時処理)
  • URG (Urgent): 「こいつは超特急の緊急データだ!」(緊急データ通知)

それでは、これらの旗が実際の通信でどのように掲げられるのか、ドラマチックなパケットの旅を覗いてみましょう。

—

2. コネクションの確立:お互いの安全を確認する「3ウェイハンドシェイク」

私たちが電話をかけるとき、いきなり本題に入りませんよね。「もしもし?」と呼びかけ、相手が「はい、もしもし?」と返し、こちらが「あ、〇〇ですけど」と名乗って初めて会話が始まります。

TCPもこれと全く同じ手順を踏みます。これが有名な3ウェイハンドシェイク(3回の握手)です。ここで SYN と ACK の旗が大活躍します。

1. 第1ステープ(クライアント $\rightarrow$ サーバー):
クライアントがサーバーに対して、「ねえ、通信を始めてもいいかい?」という願いを込めて、SYN フラグを立てたパケットを投げます。
2. 第2ステップ(サーバー $\rightarrow$ クライアント):
サーバーはそれを受け取ると、「いいよ!こっちからも通信の準備OKだよ!」と返事をするために、SYN と ACK の両方の旗を立ててパケットを送り返します。
3. 第3ステップ(クライアント $\rightarrow$ サーバー):
クライアントは最後に「了解!それじゃあデータを送り始めるね」と ACK フラグを立てて返答します。

これで無事に信頼性の高い「コネクション」が確立され、安全にデータが行き来できるようになります。

—

3. コネクションの終了とトラブル対応:FINとRSTの裏側

楽しかったおしゃべりも、終わりが来ます。そして時には、予期せぬトラブルで会話が突然ブツッと切れることもありますよね。

綺麗なお別れ:FIN(フィン)

通信を終わらせるときは、お互いに「もう話すことはないね」を確認し合います。
自分が「もう終わりね」と伝えるときは FIN フラグを立てたパケットを送り、相手が「了解、こちらも終わりです」と ACK を返して、綺麗に回線を閉じます。電話の最後に「じゃあね、ガチャリ」と受話器を置く優雅な作法です。

突然の強制終了:RST(リセット)

一方で、世の中には理不尽なこともあります。例えば、存在しないポート(窓口)に突然アクセスしてしまったときや、ルーターの故障などで通信の文脈がめちゃくちゃになってしまったときです。
そんなとき、サーバーやルーターは「話にならない!一度この会話は全部白紙だ!」とばかりに、RST フラグを立てたパケットを叩きつけます。これが飛んできたら、接続は問答無用で強制終了(ドロップ)されます。ファイアウォールが不正なアクセスをブロックするときによく見かけるお馴染みのフラグです。

—

4. リアルタイム性と緊急性:PSHとURGのディープな役割

普段、TCPは効率よくデータを運ぶために、ある程度パケットがたまるのを待ってからまとめて送る(バッファリングする)性質があります。しかし、オンラインゲームの操作や、SSHなどのリモートデスクトップ操作では、この「タメ」が命取りになりますよね。

ここで登場するのが PSH(プッシュ) フラグです。
「おいおい、そんなに溜め込んでないで、今手元にある分はすぐにアプリにパスしてくれよ!」と、バッファを強制的にフラッシュさせる指示を出します。

そして、さらに緊迫した状況で使われるのが URG(アージェント) フラグです。
「通常のデータの流れとは別に、このデータだけは最優先で処理してくれ!」という緊急割込みを知らせます。ただし、現在のモダンなWebセキュリティやアプリケーションでは、セキュリティ上の複雑さや実装の難しさから、URG フラグが使われる機会はかなり減っています(SSHやFTPの一部機能で名残がある程度です)。

—

5. 実務で役立つ!パケットをこの目で確かめてみよう

「理屈はわかったけれど、本当にそんなフラグが見られるの?」と思ったそこのあなた。実際にLinux環境で tcpdump コマンドや、Pythonのネットワークライブラリを使って、その挙動を覗いてみましょう。

以下のPython(Scapyライブラリ)のサンプルコードを見てください。これは、特定のサーバーに対して SYN フラグを送り、3ウェイハンドシェイクの第一歩を自らシミュレートするスクリプトのイメージです。

from scapy.all import IP, TCP, send

# 宛先IPアドレスとポート番号を設定します(実務や検証時は自環境のテストサーバーで行ってください)
target_ip = "192.168.1.100"
target_port = 80

# IPヘッダーとTCPヘッダーを組み立て、SYNフラグ('S')を明示的に立てます
# パケットの設計図をコードで描いているイメージですね!
syn_packet = IP(dst=target_ip) / TCP(dport=target_port, flags="S", seq=1000)

print(f"[*] {target_ip}:{target_port へ SYNパケットを送信します...")

# パケットをネットワークの荒野へ送り出します
send(syn_packet, verbose=0)

print("[+] 送信完了! 相手からの SYN-ACK が返ってくるかパケットキャプチャで確認してみましょう。")

このように、ネットワークの裏側では、コード1行、パケット1ビット単位で、目に見えないドラマが繰り広げられているのです。インフラのトラブルシューティングでWiresharkを開いたとき、「あ、今 RST が返ってきてるから、あそこのファイアウォールで弾かれてるな」とパパッと原因が分かったら、カッコいいですよね!

—

まとめ

今回は、TCPフラグ制御(SYN、ACK、FIN、RST、PSH、URG)の役割について、身近な例えを交えながら解説しました。

  • 接続は SYN と ACK で仲良く握手
  • 終了は紳士的な FIN か、乱暴な RST
  • 効率化や緊急対応には PSH や URG がアクセルを踏む

これらTCPフラグのキャラクターを頭の片隅に置いておくだけで、ネットワークのトラブルシューティングやセキュリティログの解析が、驚くほどクリアに見えてくるはずです。

パケットがネットワークの海をどのように泳ぎ、どんな旗を掲げているのか。ぜひ、今度ご自身の環境でパケットキャプチャを開いて、その目で確かめてみてくださいね。
それでは、また次回の技術解説でお会いしましょう!

コメント

タイトルとURLをコピーしました