TCPセグメント構造
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/06/01 19:49 UTC 版)
「Transmission Control Protocol」の記事における「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ヘッダの長さを差し引いて計算できる。 TCPヘッダオフセットオクテット0123オクテットビット 0 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930310 0送信元ポート 送信先ポート 4 32シーケンス番号 8 64確認応答番号(ACK がセットされている場合) 12 96ヘッダ長 予約0 0 0 NS CWR ECE URG ACK PSH RST SYN FIN ウィンドウサイズ 16128チェックサム 緊急ポインタ(URGがセットされている場合) 20...160...オプション(ヘッダ長が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ビットより長い場合にこれでチェックサム値を示す。 他のオプションは既に使われていないもの、実験的なもの、標準になっていないものなどである。
※この「TCPセグメント構造」の解説は、「Transmission Control Protocol」の解説の一部です。
「TCPセグメント構造」を含む「Transmission Control Protocol」の記事については、「Transmission Control Protocol」の概要を参照ください。
- TCPセグメント構造のページへのリンク