Transmission Control Protocol
TCPセグメント構造

TCPセグメント（英: TCP segment）はTCPにおける送受信単位である。
TCPは上位から受け取ったデータを分割し、それにTCPヘッダを付与してTCPセグメントを作成する。TCPセグメントはさらに Internet Protocol (IP) データグラムにカプセル化される。TCPセグメントは「データを相手と交換するためにTCPが使う情報の束」である。
なお、非公式に「TCPパケット」という用語が使われることがあるが、最近の用法では TCP PDU (Protocol Data Unit) は「セグメント」、IP PDU は「データグラム」、データリンク層のPDUは「フレーム」と呼ぶのが一般的である。
プロセスはTCPを呼び出し、データを格納したバッファを引数で渡すことでデータを送信する。TCPはそれらのバッファ内のデータをセグメント群にパッケージし、インターネット・モジュール（例えばIP）を呼び出すことで宛先のTCPへ各セグメントを送信する。
TCPセグメントは、セグメント・ヘッダとデータ部分から成る。TCPヘッダは10の必須フィールドとオプションの拡張フィールドを含む（テーブルではオプション部分をオレンジで示している）。
データ部はヘッダ部の後に続いている。その内容はアプリケーションに渡すべきデータである。データ部の長さはTCPセグメントのヘッダには記されておらず、IPヘッダにあるIPデータグラム長からIPヘッダとTCPヘッダの長さを差し引いて計算できる。
| オフセット> オクテット | オクテット> ビット | 0 | 0>  1 | 0>  2 | 0>  3 | 0>  4 | 0>  5 | 0>  6 | 0>  7 | 1>  8 | 1>  9 | 1> 10 | 1> 11 | 1> 12 | 1> 13 | 1> 14 | 1> 15 | 2> 16 | 2> 17 | 2> 18 | 2> 19 | 2> 20 | 2> 21 | 2> 22 | 2> 23 | 3> 24 | 3> 25 | 3> 26 | 3> 27 | 3> 28 | 3> 29 | 3> 30 | 3> 31 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 0 |   0 | 送信元ポート | 送信元ポート | 送信元ポート | 送信元ポート | 送信元ポート | 送信元ポート | 送信元ポート | 送信元ポート | 送信元ポート | 送信元ポート | 送信元ポート | 送信元ポート | 送信元ポート | 送信元ポート | 送信元ポート | 送信元ポート | 送信先ポート | 送信先ポート | 送信先ポート | 送信先ポート | 送信先ポート | 送信先ポート | 送信先ポート | 送信先ポート | 送信先ポート | 送信先ポート | 送信先ポート | 送信先ポート | 送信先ポート | 送信先ポート | 送信先ポート | 送信先ポート |
| 4 |  32 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 | シーケンス番号 |
| 8 |  64 | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） | 確認応答番号（ACK がセットされている場合） |
| 12 |  96 | ヘッダ長 | ヘッダ長 | ヘッダ長 | ヘッダ長 | 予約 0 0 0 | 予約 0 0 0 | 予約 0 0 0 | N S | C W R | E C E | U R G | A C K | P S H | R S T | S Y N | F I N | ウィンドウサイズ | ウィンドウサイズ | ウィンドウサイズ | ウィンドウサイズ | ウィンドウサイズ | ウィンドウサイズ | ウィンドウサイズ | ウィンドウサイズ | ウィンドウサイズ | ウィンドウサイズ | ウィンドウサイズ | ウィンドウサイズ | ウィンドウサイズ | ウィンドウサイズ | ウィンドウサイズ | ウィンドウサイズ |
| 16 | 128 | チェックサム | チェックサム | チェックサム | チェックサム | チェックサム | チェックサム | チェックサム | チェックサム | チェックサム | チェックサム | チェックサム | チェックサム | チェックサム | チェックサム | チェックサム | チェックサム | 緊急ポインタ（URGがセットされている場合） | 緊急ポインタ（URGがセットされている場合） | 緊急ポインタ（URGがセットされている場合） | 緊急ポインタ（URGがセットされている場合） | 緊急ポインタ（URGがセットされている場合） | 緊急ポインタ（URGがセットされている場合） | 緊急ポインタ（URGがセットされている場合） | 緊急ポインタ（URGがセットされている場合） | 緊急ポインタ（URGがセットされている場合） | 緊急ポインタ（URGがセットされている場合） | 緊急ポインタ（URGがセットされている場合） | 緊急ポインタ（URGがセットされている場合） | 緊急ポインタ（URGがセットされている場合） | 緊急ポインタ（URGがセットされている場合） | 緊急ポインタ（URGがセットされている場合） | 緊急ポインタ（URGがセットされている場合） |
| 20 ... | 160 ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... | オプション（ヘッダ長が5より大きければ、必要に応じて最後まで0でパディングする） ... |
送信元ポート（16ビット） – 送信側のポート番号
送信先ポート（16ビット） – 受信側のポート番号
シーケンス番号（32ビット） – 2つの役割がある。
SYNフラグがセットされている場合 (1)、初期シーケンス番号である。実際の先頭データバイトのシーケンス番号と対応する確認応答の確認応答番号は、このシーケンス番号に1を加えた値になる。
SYNフラグがセットされていない場合 (0)、このセッションにおけるこのパケットの先頭データバイトの累積シーケンス番号である。
確認応答番号（32ビット） – ACKフラグがセットされている場合、受信側が期待する次のシーケンス番号を格納している。（もしあれば）それまでの全バイト列の受信を確認済みであることを示す。最初に互いにACKを送る際は、相手側の初期シーケンス番号を確認するだけで、データは含めない。
ヘッダ長（4ビット） – TCPヘッダのサイズを32ビットワード単位で表す。ヘッダの最小サイズは5ワードで、最大サイズは15ワードである。すなわち、ヘッダ部は20バイトから60バイトまでの大きさであり、21バイトめからの40バイトはオプションとなる。TCPセグメント内の実際にデータが始まる位置を示すことにもなるため、データオフセットとも呼ぶ。
予約（3ビット） – 将来の利用のために予約されたビット列であり、常に 0 をセットする。
フラグあるいは制御ビット列（9ビット） – 9個の1ビットのフラグがある。
NS（1ビット） – ECN-nonce 輻輳保護（RFC 3540 でヘッダに追加）
CWR（1ビット） – 輻輳制御ウィンドウ縮小 (Congestion Window Reduced)。ECEフラグがセットされたTCPセグメントを受信した際、輻輳制御機構で応答するときにセットする。（RFC 3168 でヘッダに追加）
ECE （1ビット） – ECN-Echo を示す。
SYNフラグがセットされている場合 (1)、ECN（英語版）を利用可能であることを示す。
SYNフラグがセットされていない場合 (0)、通常送受信時にIPヘッダに Congestion Experienced フラグがセットされたパケットを受信したことを示す。（RFC 3168 でヘッダに追加）
URG（1ビット） – 緊急ポインタ・フィールドが有効であることを示す。
ACK（1ビット） – 確認応答番号フィールドが有効であることを示す。最初のSYNパケットを除く以降の全パケットでこのフラグをセットする。
PSH（1ビット） – プッシュ機能。バッファに蓄えたデータをアプリケーションにプッシュする（押しやる）ことを依頼する。
RST（1ビット） – コネクションをリセットする。
SYN（1ビット） – シーケンス番号の同期。通信する両方で最初のパケットだけ、このフラグをセットする。他のフラグはこのフラグの値によって意味が変化したり、このフラグの値によって有効/無効が決まる。
FIN（1ビット） – 送信終了を示す。
ウィンドウサイズ（16ビット） – 受信ウィンドウの大きさ。このセグメントの送信側がその時点（確認応答番号フィールドにあるシーケンス番号以降）で受信可能なバイト数を指定する。詳しくはフロー制御の節とウィンドウスケーリングの節を参照。
チェックサム（16ビット） – ヘッダおよびデータの誤り検出用の16ビットチェックサム。後述の#誤り検出と#チェックサムの計算も参照。
緊急ポインタ（16ビット） – URGフラグがセットされている場合、最新の緊急データバイトのシーケンス番号からのオフセットを示す。
オプション（0から320ビットまで可変で、32ビット単位で変化する） – ヘッダ長フィールドによって、このフィールドの長さが決まる。個々のオプションは、オプション種別（1バイト）、オプション長（1バイト）、オプションデータ（可変）から成る。オプション種別フィールドはオプションの種類を示し、オプションとしては必ず存在するフィールドである。オプションの種類によって扱い方が違い、後続の2つのフィールドの有無も異なる。存在する場合、オプション長フィールドはそのオプションの全長が格納されており、オプションデータ・フィールドにはオプションに関わる値が格納されている。例えば、オプション種別が 0x01 の場合、No-Op オプションであることを意味し、オプション長やオプションデータは存在しない。オプション種別が0の場合、End Of Options オプションであることを意味し、この場合も1バイトだけである。オプション種別が 0x02 の場合、最大セグメントサイズ (MSS) オプションであることを意味し、その後ろに1バイトのMSSフィールド長を指定するフィールドがある（値は 0x04）。この長さはオプションの全長であるため、オプション種別フィールドとオプション長フィールドのぶんも含んでいる。従って、MSS値は通常2バイトで表され、オプション長は4（バイト）となる。例えば、MSS値が 0x05B4 なら、MSSオプション全体の値は (0x02 0x04 0x05B4) となる。
パディング – TCPヘッダが32ビット境界で終わるようにするために使われる。パディングは常に0である。
一部のオプションはSYNがセットされているときだけ送信される。それらは以下で [SYN] で示している。各行の先頭は「オプション種別[, オプション長, オプション値]（全ビット数）」の形式で示す。
0（8ビット） - オプションリストの終了
1（8ビット） - 何もしない（NOP、パディング）。オプション・フィールドを32ビット境界に揃えるのに使う。
2,4,SS（32ビット） - 最大セグメント長（最大セグメントサイズ を参照） [SYN]
3,3,S（24ビット） - ウィンドウスケール（詳しくはウィンドウスケーリング参照）[SYN]
4,2（16ビット） - 選択確認応答が可能。[SYN] （選択確認応答を参照）
5,N,BBBB,EEEE,...（可変長、N は 10, 18, 26, 34 のいずれか） - 選択確認応答 (SACK)。最初の2バイトの後に選択確認応答される1から4ブロックのリストを32ビットの開始/終了ポインタで示す。
8,10,TTTT,EEEE（80ビット） - タイムスタンプと前のタイムスタンプのエコー（TCPタイムスタンプを参照）
14,3,S（24ビット） - チェックサム方式変更要求。[SYN]
15,N,...（可変長） - チェックサム方式が変更されて、そのチェックサムが16ビットより長い場合にこれでチェックサム値を示す。
他のオプションは既に使われていないもの、実験的なもの、標準になっていないものなどである。