はじめに
TCPは、データの順序や受信状況を管理し、受信側やネットワークの状態に合わせて通信を制御します。その処理に必要なポート番号、シーケンス番号、確認応答番号、制御フラグなどを格納する部分がTCPヘッダーです。
TCPヘッダーは固定20バイトの部分と、必要に応じて追加されるオプションから構成されます。この記事では、全体構造、各フィールド、制御フラグ、代表的なオプションの役割を解説します。
この記事で分かること
- TCPヘッダーの基本構造
- 各フィールドと制御フラグの役割
- MSS、Window Scale、SACK、Timestampの役割
- TCPの機能とヘッダーフィールドの関係
TCPヘッダーとは
TCPヘッダーは、TCPがデータを送受信するための制御情報を格納する部分です。TCPセグメントの先頭に付き、その後ろにアプリケーションから受け取ったデータが続きます。
固定部分は20バイトです。オプションを使用すると最大40バイトが追加されるため、TCPヘッダー全体は20~60バイトになります。TCPを含むトランスポート層の役割は、トランスポート層とは?役割とTCP・UDPの違いを分かりやすく解説で解説しています。
TCPヘッダーの全体構成

TCPヘッダーは32ビット、つまり4バイトを1行として表現されます。固定部分は5行で20バイトです。オプションを使用するときは、ヘッダー全体が32ビットの整数倍になるようにパディングで末尾を調整します。
データオフセットには、TCPヘッダーが32ビット単位で何個分あるかを格納します。固定部分だけなら値は5となり、5×4バイトでデータが20バイト目の後から始まることを示します。
| フィールド | ビット数 | 主な役割 |
|---|---|---|
| 送信元ポート番号 | 16 | 送信側のアプリケーションや通信を識別する |
| 宛先ポート番号 | 16 | 受信側でデータを渡すアプリケーションを識別する |
| シーケンス番号 | 32 | 送信するバイト列の位置を示す |
| 確認応答番号 | 32 | 次に受信したいシーケンス番号を示す |
| データオフセット | 4 | TCPヘッダーの長さを示す |
| 予約 | 3 | 将来の利用に備えた領域 |
| 制御フラグ | 9 | 接続、確認応答、終了、輻輳通知などを示す |
| ウインドウ | 16 | 受信側が受け入れられるデータ量を通知する |
| チェックサム | 16 | ヘッダーとデータの誤りを検出する |
| 緊急ポインタ | 16 | URGが有効な場合に緊急データ直後の位置を示す |
| オプションとパディング | 可変 | TCPの追加機能に必要な情報を格納する |
各フィールドの役割
送信元ポート番号と宛先ポート番号
送信元ポート番号と宛先ポート番号は、それぞれ16ビットで0~65535の値を取ります。宛先ポート番号は受信側のサービスを示し、送信元ポート番号は応答先の通信や送信側の処理を区別するために使われます。
ポート番号の範囲や、IPアドレスと組み合わせて通信を識別する仕組みは、ポート番号とは?3つの範囲と通信を識別する仕組みを解説を参照してください。
シーケンス番号と確認応答番号
シーケンス番号は、TCPが送るバイト列の位置を示す32ビットの番号です。通常は、そのTCPセグメントに含まれる先頭データの位置を表します。SYNとFINもシーケンス番号空間を1つ消費します。
確認応答番号は、次に受信したいシーケンス番号を示します。ACKフラグが1のときに有効で、この番号の直前までを連続して受信したことを伝えます。順序制御や再送の仕組みは、TCPの機能とは?信頼性・フロー制御・輻輳制御の仕組みを解説で解説しています。
データオフセットと予約ビット
データオフセットは4ビットで、TCPヘッダーの長さを32ビット単位で示します。有効な値は5~15であるため、TCPヘッダーは20~60バイトになります。
現在の予約領域は3ビットです。対応する拡張仕様がない場合、送信側は0を設定し、受信側は値を無視します。以前は予約領域だった隣の1ビットには、RFC 9768によってAEフラグが割り当てられています。
ウインドウ、チェックサム、緊急ポインタ
ウインドウは、確認応答番号で示した位置から、受信側がさらに受け入れられるデータ量を通知します。Window Scaleオプションを使うと、16ビットの値より大きな受信ウインドウを表現できます。
チェックサムは、TCPヘッダー、データ、IPアドレスなどを含む疑似ヘッダーを対象に計算します。TCPではチェックサムが必須です。疑似ヘッダーと1の補数演算の流れは、UDPヘッダーとは?4つのフィールドとIPv4・IPv6のチェックサムを解説で解説しています。
緊急ポインタはURGフラグが1のときに有効で、シーケンス番号を基準に緊急データの直後の位置を示します。
TCPの制御フラグ
制御フラグは各1ビットで、接続状態やヘッダー内の情報が有効かどうかを示します。
| フラグ | 名称 | 役割 |
|---|---|---|
| AE | Accurate ECN | AccECNの対応確認に使われ、接続後はCWR・ECEとともにACEフィールドを構成する |
| CWR | Congestion Window Reduced | Classic ECNで、送信側が輻輳通知へ対応したことを伝える |
| ECE | ECN-Echo | Classic ECNで、ECNの対応確認や輻輳通知に使う |
| URG | Urgent | 緊急ポインタが有効であることを示す |
| ACK | Acknowledgment | 確認応答番号が有効であることを示す |
| PSH | Push | 受信データをアプリケーションへ渡す処理を促す |
| RST | Reset | 接続をリセットする |
| SYN | Synchronize | 接続確立時にシーケンス番号を同期する |
| FIN | Finish | 送信側から送るデータがなくなったことを示す |
AEは、2026年にRFC 9768で割り当てられたフラグです。Classic ECNではCWRとECEを個別に使い、AccECNをネゴシエーションした接続ではAE・CWR・ECEを3ビットのACEフィールドとして扱います。
SYN、ACK、FIN、RSTは接続状態の管理にも使われますが、フラグだけで通信状態のすべてが決まるわけではありません。TCPは、シーケンス番号、確認応答番号、タイマー、これまでの通信状態も組み合わせて処理します。
TCPオプション
TCPオプションは、固定部分だけでは表現できない追加情報を格納します。
| オプション | Kind | 主な役割 |
|---|---|---|
| MSS | 2 | 受信できるTCPデータ部分の最大長を通知する |
| Window Scale | 3 | 大きな受信ウインドウを表現できるようにする |
| SACK Permitted | 4 | 接続確立後にSACKを使用できることを通知する |
| SACK | 5 | 受信済みの連続したデータ範囲を伝える |
| Timestamp | 8 | RTTの計測と古いセグメントの判定に使う |
MSS、Window Scale、SACK Permittedは、SYNを含むセグメントで通知します。Timestampも接続確立時に利用可否を確認し、合意後のセグメントで使用します。SACKは、累積ACKだけでは分からない受信済み範囲を送信側へ伝えます。
オプション間の位置調整にはNo-Operationを使えます。オプション列を明示的に終える場合はEnd of Option Listを使い、データオフセットが示すヘッダー末尾まで残る領域は0で埋めます。
ヘッダーフィールドとTCPの機能の関係
TCPの機能は、1つのフィールドだけで実現されるものではありません。接続確立ではSYNとACK、データの順序管理ではシーケンス番号と確認応答番号、フロー制御ではウインドウが使われます。チェックサムは誤りを検出し、ECN関連のフラグはネットワークからの輻輳通知を送信側へ返すために使われます。
まとめ
TCPヘッダーは、TCPが接続状態とデータの送受信を管理するための制御情報を格納します。
- 固定部分は20バイトで、オプションを含むと最大60バイトになる
- ポート番号は送信側と受信側のアプリケーションを識別する
- シーケンス番号と確認応答番号はデータの位置と受信状況を示す
- 現在は予約3ビットと、AEを含む9つの制御フラグが割り当てられている
- ウインドウは受信可能量を通知し、チェックサムは誤りを検出する
- オプションはMSS、Window Scale、SACK、Timestampなどの追加情報を格納する
各フィールドは通信状態やタイマーと組み合わされ、TCPの信頼性、フロー制御、輻輳制御を支えています。


コメント