TCPのフラグとは?種類と役割も!(SYN ACK FIN RST PSH URG:ヘッダ:制御ビット:コネクション制御など)
ネットワーク通信を学ぶうえで、TCPのフラグは避けて通れない重要な概念のひとつです。Webページの閲覧やファイル転送、メールの送受信など、私たちが日常的に利用するインターネットの多くはTCP(Transmission Control Protocol)によって支えられています。そのTCPが信頼性の高い通信を実現できる理由のひとつが、ヘッダ内の制御ビット、すなわちTCPフラグの仕組みにあります。
SYN・ACK・FIN・RST・PSH・URGといったフラグは、コネクションの確立から切断まで、通信の流れを細かく制御する役割を担っています。ネットワークエンジニアはもちろん、バックエンド開発者やセキュリティを学ぶ方にとっても、TCPフラグの理解は通信の本質を把握するための第一歩となるでしょう。
本記事では、TCPフラグの概要・種類・役割から、スリーウェイハンドシェイクやコネクション制御の仕組みまで、体系的にわかりやすく解説していきます。
TCPフラグとは何か?その役割と重要性
それではまず、TCPフラグの基本概念とその重要性について解説していきます。
TCPフラグとは、TCPヘッダ内に格納された制御ビットのことです。TCPはIPの上位に位置するトランスポート層のプロトコルであり、コネクション型通信として信頼性の高いデータ転送を実現します。その信頼性を支えるメカニズムの中核にあるのが、フラグによる通信状態の制御です。

TCPヘッダは20バイト(オプションを含む場合はそれ以上)で構成されており、その中に複数のフラグビットが含まれています。各フラグは1ビットで表現され、値が「1」のとき有効(セット状態)、「0」のとき無効となります。
TCPヘッダの構造と制御ビットの位置
TCPヘッダには以下の情報が含まれています。フラグがどこに位置するかを把握しておくと、パケットキャプチャの際にも理解が深まるでしょう。
| フィールド名 | ビット数 | 説明 |
|---|---|---|
| 送信元ポート番号 | 16bit | 送信側のポート番号 |
| 宛先ポート番号 | 16bit | 受信側のポート番号 |
| シーケンス番号 | 32bit | データの順序管理に使用 |
| 確認応答番号 | 32bit | 次に期待するバイト位置 |
| データオフセット | 4bit | ヘッダの長さ |
| 予約領域 | 3bit | 将来の使用のために予約 |
| 制御ビット(フラグ) | 9bit | URG・ACK・PSH・RST・SYN・FINなど |
| ウィンドウサイズ | 16bit | 受信バッファサイズの通知 |
| チェックサム | 16bit | エラー検出用 |
| 緊急ポインタ | 16bit | URGフラグが有効な場合に使用 |
制御ビットはヘッダの13バイト目付近に位置し、通信の状態を制御する心臓部とも言える領域です。
TCPが信頼性を確保できる理由
TCPはUDPと異なり、コネクション指向型の通信プロトコルです。データを送信する前にコネクションを確立し、送信後は確認応答(ACK)を受け取ることでデータが正しく届いたかを確認します。
この仕組みにより、パケットの欠損・順序の乱れ・重複といった問題に対処できます。そしてその一連の処理を制御しているのが、まさにTCPフラグなのです。
フラグを理解することで見えてくるもの
TCPフラグを理解すると、Wiresharkなどのパケットキャプチャツールで通信の流れを読み解けるようになります。また、ファイアウォールのルール設計やIDS(侵入検知システム)の挙動理解にも直結するため、ネットワークセキュリティの観点からも非常に重要な知識と言えるでしょう。
TCPフラグの種類と各役割を詳しく解説
続いては、各TCPフラグの種類と具体的な役割を確認していきます。
TCPには主に6つの代表的なフラグが存在します。それぞれが異なるタイミング・目的で使用されるため、ひとつずつ丁寧に押さえておきましょう。
SYNフラグ(コネクション確立要求)
SYN(Synchronize)フラグは、TCPコネクションの確立を要求する際に使用します。通信を開始したいクライアントが最初に送るセグメントにセットされ、「通信を始めたい」という意思表示の役割を果たします。
SYNフラグがセットされたパケットには、初期シーケンス番号(ISN)が含まれており、以降のデータ転送における順序管理の基点となります。SYNはコネクション確立時にのみ使用され、通常のデータ転送中にセットされることはありません。
ACKフラグ(確認応答)
ACK(Acknowledgment)フラグは、受信したデータや制御情報に対する確認応答を示します。TCPの信頼性を支える最も基本的なフラグのひとつで、コネクション確立後のほぼすべてのセグメントでセットされます。
ACKフラグがセットされると、ヘッダ内の「確認応答番号」フィールドが有効になり、「次にこのバイトを期待する」という情報を相手に伝えます。これにより、送信側はどこまでのデータが届いたかを把握できるでしょう。
FIN・RST・PSH・URGフラグの役割
残りの4つのフラグも、それぞれ重要な役割を持っています。以下の表にまとめます。
| フラグ名 | 略称の意味 | 主な役割 | 使用タイミング |
|---|---|---|---|
| FIN | Finish | コネクションの正常終了要求 | データ送信完了後 |
| RST | Reset | コネクションの強制切断 | 異常発生・不正なセグメント受信時 |
| PSH | Push | データを即座にアプリ層へ渡す | バッファリングを回避したい場合 |
| URG | Urgent | 緊急データの存在を通知 | 割り込み処理が必要な場合 |
FINフラグは「もうデータを送り終わった」という通知であり、コネクションの片方向終了を意味します。RSTは異常時の強制切断であり、セキュリティ上の文脈でも頻繁に登場するフラグです。PSHはバッファに蓄積せず即座にデータをアプリケーション層へ渡す指示を行い、URGは緊急ポインタと組み合わせて特定データを優先処理させます。
スリーウェイハンドシェイクとコネクション制御の仕組み
続いては、TCPフラグが実際にどのように使われるか、スリーウェイハンドシェイクを中心にコネクション制御の仕組みを確認していきます。
TCPのコネクション確立において最も重要なプロセスが、スリーウェイハンドシェイク(3-way handshake)です。その名のとおり、3回のやり取りでコネクションを確立する仕組みです。
スリーウェイハンドシェイクの流れ
スリーウェイハンドシェイクは以下のステップで進みます。
| ステップ | 送信方向 | 使用フラグ | 内容 |
|---|---|---|---|
| 第1ステップ | クライアント → サーバ | SYN | コネクション確立要求 |
| 第2ステップ | サーバ → クライアント | SYN + ACK | 確立要求の受理と応答 |
| 第3ステップ | クライアント → サーバ | ACK | 応答の確認・コネクション確立完了 |
第1ステップでクライアントがSYNを送り、第2ステップでサーバがSYN+ACKを返し、第3ステップでクライアントがACKを送り返すと、双方向の通信路が確立されます。このシンプルながら堅牢な設計が、TCPの信頼性の基盤と言えるでしょう。
Pythonでスリーウェイハンドシェイクを疑似的に体験する
Pythonのscapyライブラリを使うと、TCPパケットを自作してフラグの挙動を確認できます。以下は学習目的での疑似的なSYNパケット送信の例です。
# scapyを使ったSYNパケットの作成(学習用サンプル)
from scapy.all import IP, TCP, send
送信先IPとポートの設定(ドラゴンフルーツサーバへの接続イメージ)
target_ip = "192.168.1.100"
target_port = 8080
IPレイヤとTCPレイヤを積み重ねてSYNパケットを作成
ip_layer = IP(dst=target_ip)
tcp_layer = TCP(dport=target_port, flags="S", seq=1000)
SYNパケットを組み立て
syn_packet = ip_layer / tcp_layer
パケット情報を表示
syn_packet.show()
出力結果:
###[ IP ]###
dst = 192.168.1.100
###[ TCP ]###
dport = 8080
flags = S ← SYNフラグがセットされている
seq = 1000
flags=”S” がSYNフラグに対応しており、”SA” とすることでSYN+ACKを表現できます。このようにフラグをコード上で確認することで、理解がより深まるでしょう。
コネクション切断のフォーウェイハンドシェイク
コネクションの切断には、フォーウェイハンドシェイク(4-way handshake)が使われます。FINフラグとACKフラグが組み合わさって、双方向のコネクションを順番に閉じていきます。
| ステップ | 送信方向 | 使用フラグ | 内容 |
|---|---|---|---|
| 第1ステップ | クライアント → サーバ | FIN | 切断要求 |
| 第2ステップ | サーバ → クライアント | ACK | 切断要求の確認 |
| 第3ステップ | サーバ → クライアント | FIN | サーバ側からの切断要求 |
| 第4ステップ | クライアント → サーバ | ACK | 切断完了の確認 |
切断はコネクション確立よりもステップが多い点に注目です。これはTCPが半二重(half-duplex)的な切断を行い、片方向ずつ丁寧にクローズするためです。
TCPフラグとセキュリティ・実践的な活用
続いては、TCPフラグがセキュリティやネットワーク分析においてどのように活用されるかを確認していきます。
TCPフラグはコネクション制御だけでなく、ネットワーク攻撃の手法やセキュリティ診断にも深く関わっています。フラグの組み合わせによってパケットの意図を読み解くことができるため、セキュリティエンジニアにとっても必須の知識です。
SYNフラッド攻撃とRSTフラグの悪用
SYNフラグを大量に送り続け、サーバのリソースを枯渇させる攻撃をSYNフラッド攻撃(SYN Flood)と呼びます。スリーウェイハンドシェイクの途中でACKを返さないことで、サーバが「半開き状態(half-open connection)」のセッションを大量に抱え込んでしまう仕組みです。
また、RSTフラグは正規のコネクションを強制切断するために悪用されることもあります。セッションハイジャックの文脈でRSTインジェクションという手法が知られており、ファイアウォールやIDSで検出対象となるパターンのひとつです。
Wiresharkでのフラグ確認方法
Wiresharkを使うと、リアルタイムでパケットを捕捉し、TCPフラグを視覚的に確認できます。フィルタリングの例を見ておきましょう。
# SYNパケットのみ表示するフィルタ
tcp.flags.syn == 1 and tcp.flags.ack == 0
FINパケットのみ表示するフィルタ
tcp.flags.fin == 1
RSTパケットのみ表示するフィルタ
tcp.flags.reset == 1
SYN+ACKのみ表示するフィルタ(サーバの応答確認に便利)
tcp.flags.syn == 1 and tcp.flags.ack == 1
出力結果:
各条件に一致するパケットのみがキャプチャリストに表示される
TCPヘッダ内のFlagsフィールドで各ビットの状態を確認可能
Wiresharkのパケット詳細ペインでは、TCPヘッダの「Flags」フィールドを展開するとフラグのオン・オフ状態を一目で確認できます。ネットワークトラブルシューティングの際に非常に役立つでしょう。
ポートスキャンとフラグの関係(nmapの例)
nmapなどのポートスキャンツールは、TCPフラグを意図的に操作してホストの状態を調査します。代表的な手法を以下に示します。
# SYNスキャン(ステルススキャン)
# コネクションを完全確立せずにポートの開閉を確認
nmap -sS 192.168.1.100
FINスキャン(FINフラグのみ送信してレスポンスを確認)
nmap -sF 192.168.1.100
NULLスキャン(フラグを一切セットしないパケットを送信)
nmap -sN 192.168.1.100
出力結果:
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
各ポートのオープン・クローズ状態がフラグの応答で判定される
SYNスキャンではSYNを送りSYN+ACKが返ってきたポートを「open」と判断し、完全なコネクションを確立しないためログに残りにくい特性があります。こうした仕組みを理解することは、防御側のセキュリティ設計においても欠かせません。
まとめ
本記事では、「TCPのフラグとは?種類と役割も!(SYN ACK FIN RST PSH URG:ヘッダ:制御ビット:コネクション制御など)」というテーマで、TCPフラグの基礎から実践的な活用までを幅広く解説しました。
TCPフラグはヘッダ内の制御ビットとして、コネクションの確立・データ転送・切断・異常処理といった通信の全フェーズを制御する重要な要素です。SYN・ACK・FIN・RST・PSH・URGそれぞれが固有の役割を持ち、組み合わせによってさまざまな通信状態を表現します。
スリーウェイハンドシェイクやフォーウェイハンドシェイクの流れ、Wiresharkでの確認方法、セキュリティへの影響まで理解できると、ネットワークの見え方が大きく変わるでしょう。ぜひパケットキャプチャなどの実践を通じて、TCPフラグへの理解をさらに深めていってください。