IPパケットに載せられて運ばれるもの、UDP/TCPとその上位プロトコルはじめての車載イーサネット(4)(3/5 ページ)

» 2020年04月20日 06時00分 公開

TCPの振る舞いとヘッダ構造

 一方、TCPはコネクションオリエンテッドコミュニケーション、つまり電話です。従って、電話をかける(コネクションを確立する)、話をする(データ転送を行う)、電話を切る(コネクションを解消する)の3つのフェーズがあり、かつ、それぞれのやりとりにおいて常に相づち(アクノリッジ、確認応答)を返していきます。

 そのため、制御情報も多くヘッダも複雑です。今回は、その3つのフェーズをシーケンス番号、確認応答(アクノリッジ)番号とACK、SYN、FINの3つのコントロールビットを使って簡単に説明していきます(図4参照)。

図4:TCPヘッダフォーマット(クリックして拡大) 出典:ベクター

 ここでのポイントは下記の通りです。

  • コネクション確立の際にはSYNビットをON、コネクション解放の際にはFINビットをONにする
  • SYNまたはFINを受け付けたことを知らせる際(アクノリッジ)には、SYNまたはFINと同時に受信したシーケンス番号に1を足した値を確認応答番号として送る
  • データを受信したことを知らせる際には、データと同時に受信したシーケンス番号に受信したデータのバイト数を足した値を確認応答番号として送る(例:シーケンス番号が970で30バイトのデータを受信したら1000が確認応答番号)
  • アクノリッジ受信側は上記のルールに合致しているかをチェック。合致していない、または規定の時間内にアクノリッジが返ってこない場合には、異常と見なしてリトライを行う

 では、以下の例を見ていきましょう(図5参照)。

図5:コネクション確立(TCP)(クリックして拡大) 出典:ベクター

(1)コネクションの確立

 コネクションは双方向に確立します。この例では、ECU A がシーケンス番号とSYNをセットした「コネクション確立要求」セグメントを送信します。図5内にもあるように、SYNとともに送るシーケンス番号は最初のシーケンス番号で、送る側が無作為に決めた数字です。これを基に以降の通信が進んでいきます。

(2)アクノリッジとコネクション確立要求

 続いてECU Bでは、受け取った「コネクション確立要求」セグメントを受け入れ、それを示す「アクノリッジ(確認応答、ACK)」とそれが何に対する応答であるかを示す確認応答番号(受信シーケンス番号+1)を送るとともに、自らも「コネクション確立要求」を送るべくSYNと(最初の)シーケンス番号をセットした「アクノリッジ+コネクション確立要求」セグメントを送り出します。

(3)アクノリッジ確認とアクノリッジ送信

 ECU Aは受信したセグメントの中にACKと自らが送ったシーケンス番号(1300)+1の確認応答番号を確認することで、自らのコネクション確立要求が受け入れられたことを理解します。またSYNがセットされていることから、ECU Bからも「コネクション確立要求」があり、それを受け入れたことを示すための「アクノリッジ」を、ACKと確認応答番号(受信したシーケンス番号3500+1)をセットして送信します。もちろんそれを受信したBも同様にACKと確認応答番号をチェックし、自らの「コネクション確立要求」が受け入れられたと理解します。

 この3回のやりとりで双方向のコネクションを確立する方法を「スリーウェイハンドシェイク(Three way hand shaking)」とよびます。

 続いて行われるのはデータ転送です(図6参照)。

図6:データ転送(TCP)(クリックして拡大) 出典:ベクター

Copyright © ITmedia, Inc. All Rights Reserved.