TCPのヘッダフォーマット
TCPのヘッダは以下のようになっています。
送信元ポート番号
16ビットのフィールドで、上位レイヤーのプロトコルを識別するための番号となります。 多くの場合、クライアントサーバシステムでの通信となり後述のウェルノウンポートとは違い一時的に使用する番号となるためエフェメラルポート(Ephemeral Port)と呼ばれている番号が使用されます。
宛先ポート番号
16ビットのフィールドで、送信元ポート番号と同様に上位レイヤーのプロトコルを識別するための番号となります。クライアントサーバシステムでの通信では複数のクライアントからサーバがリクエスト受け付けるため、どのクライアントから見ても同じポート番号である必要があります。そのため、ウェルノウンポート(Well-Known Port)と呼ばれる番号(0~1023)の番号が使われます。例えばHTTPの場合はウェルノウンポートとして80番ポートが定義されてます。
シーケンス番号
32ビットのフィールドで、送信するデータに順序を表すものとしてシーケンス番号を付加しています。受信側ではこのシーケンス番号をもとにデータを復元することができます。
確認応答番号
32ビットのフィールドで、受信側がどのデータまで受信できたかを知らせるためにこの確認応答番号をセットします。シーケンス番号に1を加えた番号となります。
データオフセット
4ビットのフィールドで、TCPデータのヘッダ長が入ります。
予約
6ビットのフィールドで、将来のために予約されています。通常は0がセットされます。
制御ビット
6ビットのフィールドで、下記のコードで制御ビットをセットします。
・URG(Urgent):
緊急で処理が必要なデータが含まれている際にセットされます。
・ACK(Acknowledgement):
確認応答する場合にセットされます。
・PSH(Push):
バッファを行わずにすぐに上位のレイヤーへ渡すことを要求する場合に
セットされます。
・RST(Reset)
セットされた場合、TCPのコネクションが切断されます。
・SYN(Synchronize)
接続要求があるとセットされます。
・FIN(Finish)
TCPのコネクションの切断要求を行う場合、セットされます。
ウィンドウ
16ビットのフィールドで、受信側で受信可能なデータサイズを送信側に知らせるために使用されます。
チェックサム
16ビットのフィールドで、TCPヘッダとペイロードデータが正しく受信できているかチェックする際に使用されます。
緊急ポインタ
16ビットのフィールドで、制御ビットフィールドでURGのフラグが立っている場合に値が入り、緊急データの場所を表しています。
オプション
可変長フィールドで、TCPヘッダのオプションを行う場合に使用されます。
パディング
可変長フィールドで、TCPヘッダ長32ビットの整数倍になるようにパディングで調整します。
ペイロード
可変長のフィールドで、TCPヘッダでカプセル化されたデータが格納されます。