TCPヘッダの構造

 TCPによる通信を理解するには、TCPヘッダにどんな内容が含まれるかを理解しておく必要があります。

 TCPでは、通信に先立ってコネクションの確立を行ったり、確認応答やフロー制御を行うため、TCPのヘッダ構造は、UDPパケットの構造と比べると、非常に複雑なものになっています。

通常のTCPヘッダのサイズは、20バイトの大きさになります。

フィールド説明
送信元ポート番号
(16ビット)
送信元のアプリケーションを識別するための番号。
TCPは、UDPの場合と違い、送信元ポート番号を0にできない。
1~65535まで利用できる。
宛先ポート番号
(16ビット)
宛先のアプリケーションを識別するための番号。
1~65535まで利用できる。
※0は予約済み
シーケンス番号
(32ビット)
送信するデータに、順序を付けるための番号。
送信するデータ1バイトごとにシーケンス番号を1つずつ増やす。
232を超えるとまた同じ番号を繰り返す。
確認応答番号
(32ビット)
受信したデータに対して、どこまで受信できたのかをバイト位置で表すフィールド。
受信が完了したデータ位置のシーケンス番号+1を返す。
ACKフラグがONの場合にのみ、ACK番号フィールドを有効とする。
ヘッダ長
(4ビット)
TCPデータが始まる位置を表すフィールド。TCPヘッダの直後にデータ部が続くため、TCPヘッダのサイズと考えてもよい。
URG

(1ビット)
URG ・・・ urgent:緊急
緊急データが含まれていることを示すフラグ。
デフォルト値は0、1でONになる。
あまり使用されることはない。
ACK
(1ビット)
ACK ・・・ acknowledge
有効なACK番号がTCPヘッダに含まれていることを示すフラグ。
TCPの3ウェイハンドシェイク時の一番最初を除き、他の全てのTCPパケットは、ACKのフラグがONになっている。
PSH
(1ビット)
PSH ・・・ push
受信したデータをすぐにアプリケーションに引き渡すように要求するためのフラグ。
バッファリングを行うと応答性が損なわれてしまう可能性があるので、Telnetでは、このフラグをONにしている。
RST
(1ビット)
RST ・・・ reset
TCP接続を中断、拒否したい場合にセットされるフラグ。
RSTフラグをONにしたTCPパケットを送信することで、現在のTCP接続を強制終了することができる。
SYN
(1ビット)
SYN ・・・ synchronize
TCPの3ウェイハンドシェイク時のオープン処理の開始に双方のそれぞれがSYNフラグがONにして、ACK番号を同期させる。以降のパケットにはセットされない。
FIN
(1ビット)
FIN ・・・ finis
TCP接続を終了させるためセットされるフラグ。
双方からFINが送られるとTCP接続が終了する。
ウィンドウサイズ
(16ビット)
受信側のウィンドウサイズを相手に伝えるために利用されるフィールド。
単位はバイトで、最大65535バイトになる。
0は、データを受信することができないことを表す。
チェックサム
(16ビット)
TCPパケットの整合性を検査するための検査用データが入るフィールド。
緊急ポインタ
(16ビット)
URGフラグが1の場合のみ有効。
緊急データの場所を表す。
オプションTCP接続の特性を設定するために利用される可変長のフィールド。
MSSのやり取りなどに利用される。
32ビットの倍数になるように、必要に応じて最後にパディング(0)が埋められる。
データTCPのデータ部。
TCP接続がタイムアウトして切断されないようにデータを含まないTCPヘッダだけのパケットを送る場合もある。

UDPヘッダの構造

 UDPでは、リアルタイム性を損なう確認応答や再送、輻輳制御がないため、TCPよりもリアルタイム性が高いという利点があります。UDPヘッダは、TCPヘッダと比べると、とてもシンプルです。8バイトしかありません。

フィールド説明
送信元ポート番号
(16ビット)
送信元のアプリケーションを識別するための番号。
返信を要求しないUDPパケットの場合は、送信元ポート番号を0にする。
0~65535まで利用できる。
宛先ポート番号
(16ビット)
宛先のアプリケーションを識別するための番号。
0~65535まで利用できる。
ヘッダ長
(4ビット)
UDPパケットの長さを表すフィールド。
UDPで送信するデータ部分の長さを加えたバイト数を格納する。
チェックサム
(16ビット)
UDPパケットの整合性を検査するための検査用データが入るフィールド。
チェックサム計算のでは、UDP擬似ヘッダ(12bytes)、UDPヘッダ(8bytes)、UDPペイロードの3つを使用する。
※UDP擬似ヘッダは、チェックサムの計算時にだけに使われる仮想的なヘッダ。
データUDPのデータ部。