Transmission Control Protocol
TCPが提供する機能(#機能を参照)は以下の機構で提供される。
順序保証: 受信側でシーケンス番号を使って並べ替え
到達保証/再送: 確認応答のないセグメントは再送
誤りのないデータ転送: チェックサム
フロー制御: 受信側は常にどのくらいのデータを受け取れるかを知らせている(スライディングウィンドウで制御している)。受信側のバッファが一杯になると、次の確認応答ではウィンドウサイズを0とするので送信が停止し、バッファ内のデータを処理する余裕ができる。
例えば、MSS値が 0x05B4 なら、MSSオプション全体の値は (0x02 0x04 0x05B4) となる。
パディング – TCPヘッダが32ビット境界で終わるようにするために使われる。パディングは常に0である。
一部のオプションはSYNがセットされているときだけ送信される。それらは以下で で示している。各行の先頭は「オプション種別[, オプション長, オプション値](全ビット数)」の形式で示す。
0(8ビット) - オプションリストの終了 1(8ビット) - 何もしない(NOP、パディング)。オプション・フィールドを32ビット境界に揃えるのに使う。 2,4,SS(32ビット) - 最大セグメント長(最大セグメントサイズ を参照) 3,3,S(24ビット) - ウィンドウスケール(詳しくはウィンドウスケーリング参照) 4,2(16ビット) - 選択確認応答が可能。 (選択確認応答を参照) 5,N,BBBB,EEEE,...(可変長、N は 10, 18, 26, 34 のいずれか) - 選択確認応答 (SACK)。最初の2バイトの後に選択確認応答される1から4ブロックのリストを32ビットの開始/終了ポインタで示す。 8,10,TTTT,EEEE(80ビット) - タイムスタンプと前のタイムスタンプのエコー(TCPタイムスタンプを参照) 14,3,S(24ビット) - チェックサム方式変更要求。 15,N,...(可変長) - チェックサム方式が変更されて、そのチェックサムが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(バイト)となる。
もともとのTCPプロトコルで採用されている累積確認応答方式を使うと、パケットを喪失したときに非効率になる可能性がある。例えば、10,000バイトのデータを10個のTCPセグメントで送信し、その最初のパケットが喪失したとする。もともとの累積確認応答プロトコルでは、受信側は1,000から9,999までのバイトは受信成功、ただし0から999までのバイトを含む先頭パケットの受信に失敗したという風に伝えることができないので、送信側は10,000バイト全体を再送しなければならない。
このため RFC 2018 で「選択確認応答 (SACK)」オプションが追加された。これは、通常の累積確認応答とは別に、受信側が不連続なブロックを正しく受信したという確認応答を返せるようにしたものである。選択確認応答にはオプション部分にいくつかのSACKブロックを指定し、SACKブロックには正しく受信できた連続な範囲のシーケンス番号の開始点と終了点を指定する。例えば、先ほどの例では 1000 と 9999 のシーケンス番号をSACKオプションで示せばよい。