TCPとは?TCPヘッダ、TCPペイロードについてまとめました。
【TCPとは】TCPヘッダ、TCPペイロード
TCP(Transmission Control Protocol)とは、IPネットワークにおける誤り制御のためのプロトコルです。
通信の信頼性を確保するために、コネクション確立、再送処理、輻輳処理などの様々な仕組みが取り入れられおり、その分だけ通信のオーバヘッドは増加してしまいます。
TCPセグメント(TCPパケット)は以下の通り「TCPヘッダ」と「TCPペイロード」で構成されます。
TCPヘッダ
TCPヘッダの中身は以下です
フィールド | データサイズ | 概要 |
---|---|---|
送信元ポート番号 | 16bit | 送信元のポート番号 |
宛先ポート番号 | 16bit | 宛先のポート番号 |
シーケンス番号 | 32bit | 送信したデータの順序を示す値(相手から受信した確認応答番号)の値 |
確認応答番号 | 32bit | 相手から受信したシーケンス番号 + データサイズ |
データオフセット | 4bit | TCPヘッダの長さを示す値 |
予約 | 6 bit | 全ビット「0」が入る。将来の拡張用 |
コントロールフラグ | 6bit | URG、ACK、PSH、RST、SYN、FINの6つのビットで構成されている。フラグを立てる場合は1となる(例えばACKを1にすると、相手に確認応答を示すことができる) |
ウィンドウサイズ | 16bit | 受信側が一度に受信できるデータ量を送信側に通知するために使用される。送信側は、この値のデータ量を超えて送信できない。 |
チェックサム | 16bit | TCPヘッダとデータ部分のエラーチェックを行うために使用される値。 |
緊急ポインタ | 16bit | コントロールフラグのURGの値が「1」である場合にのみ使用されるフィールド。緊急データの開始位置を示す情報が入る。 |
オプション | 可変長 | TCPコネクションの際にMSSを決定するためなど、TCP通信の性能向上に利用。 |
パディング | 可変長 | TCPヘッダの長さを32ビットの整数にするために詰め物として空データの値0を入れて調整。 |
MSS
MSS(Maximum Segment Size)は、1つのTCPパケットで運ぶことができるデータ量のことです。
一般的なTCP/IP環境では、最大サイズのEthernetフレーム(1518byte)では、MSSは「1460バイト」になります。
従ってホストAからホストBに14600バイトのTCPデータを送信したい場合、10回のTCPパケットを送出します。
MSSは3ウェイハンドシェイク時に送信されます。
MSSは、3ウェイハンドシェイクの際のSYNパケットで双方向に伝えられて、両者の値のうち小さい値が採用
されて双方向通信の際に使用されます。例えばホストAがMSSを「1460」と通知し、ホストBはMSSを「2000」
と通知するとします。その場合、ホストAとBとの通信で使用するMSSは「1460」となり双方向通信をします。
TCPペイロードのフォーマット
フィールド | データサイズ | 概要 |
---|---|---|
データ | 可変長 | データ |
【手順1】TCPのコネクションの確立(3ウェイハンドシェイク)
3ウェイハンドシェイクとは、 TCPにおいて使用されるコネクションの確立手順(3回のやりとり)のことです。
コネクションの確立とは、TCPがコネクション型プロトコル(通信相手の応答があってはじめて通信を開始する)であることから、データ転送を行う前にコネクションの確立を行うことです。
手順① ホストAからホストBにコネクション確立の要求。
– SYN=0、ACK=0(TCPヘッダの中にある)
– シーケンス番号は最初だけはランダムな値が割り当てられる(上の例だと0)
– 確認応答番号(ACK番号)は通信開始時はなし
手順② ホストBはホストAのコネクション要求に応え、ホストBからもコネクション確立を要求する。
– SYN=0、ACK=1
– シーケンス番号は最初だけランダムな値が割り当てられる。上図の例で「0」として、確認応答番号は「相手から受信したシーケンス番号」+「データサイズの値」となるが、3ウェイハンドシェイクでは「相手から受信したシーケンス番号」に「1」を加算した値となる。
手順③ ホストAはホストBからのコネクション要求に応える。
・SYN=1、ACK=1
・ シーケンス番号は「相手から受信した確認応答番号」なので「1」となり、確認応答番号は②と同じく「相手から受信したシーケンス番号」に「1」を加算した値になるため「1」となる。
【手順2】データの送受信
次に、3ウェイハンドシェイクにより確立したコネクション上で、ホストAとホストBがデータの送受信を行う流れは以下のとおりです。
① ホストAからホストBにデータを送信します。(上の例では10byte)
・「シーケンス番号」と「確認応答番号」の値は、3ウェイハンドシェイク後から変化はなく「1」のまま。
② 今度はホストBからホストAに例えば100byteのデータを送信します。
・シーケンス番号は「相手から受信した確認応答番号」を使用するので「1」
・確認応答番号は「相手から受信したシーケンス番号」+「データサイズ(byte)」で「101」
以降、同じようにやり取りを繰り返していきます(上の図だと同じやり取りを③④でもう1回行っています)。
【手順3】通信終了(コネクションの切断)
最後に、通信終了(コネクションの切断)の流れは以下のとおりです。
① ホストBはコネクションの切断要求を送信します。
・切断要求を示すFINビットが「1」
・シーケンス番号は「直前の自分のシーケンス番号」+「自分が直前に送信したデータサイズ」で「201」。
・確認応答番号はそのまま「21」。
② ホストAはコネクションの切断要求への確認応答をします。
・確認応答を示す「ACK」は1
・シーケンス番号は「相手から受信した確認応答番号」で「21」
・確認応答番号は、FINへの確認応答の場合「相手から受信したシーケンス番号」に「1」を加算し「202」
③ ホストAもコネクションの切断要求を送信します。
・切断要求を示すFINビットが「1」
・シーケンス番号と確認応答番号は変化なし。
④ FINを受信したホストBはコネクションの切断要求への確認応答をします。
・シーケンス番号は「相手から受信した確認応答番号」で「202」
・確認応答番号は、今回のように FIN への応答確認の場合は「相手から受信したシーケンス番号」に「1」を加算して「22」
これでTCPコネクションは正常に終了します。
コメント