【TCPとは】TCPヘッダ、TCPペイロード、3ウェイハンドシェイク

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コネクションは正常に終了します。

【通信プロトコルとは】インタフェース、TCP/IP、HDLC、CORBA、HTTP、DNS、SOAP、IPv6、シリアル通信
ネットワークにおける「通信プロトコル」とは?プロトコルとインタフェース、TCP/IP、HDLC、CORBA、HTTP、DNS、SOAP、IPv6、シリアル通信についてまとめました。
【情報処理入門】用語解説・資格試験対策まとめ
情報処理分野の用語・原理・資格試験対策について解説します。
IPA試験対策
スポンサーリンク

コメント