ネットワークの基礎講座

TCP(トランスミッション制御プロトコル)

データ転送


 

 


TCPが信頼あるメッセージの到着を保証するために「再送」のメカニズムを備えていることを既に紹介した。送信元のホストは所定時間内に送ったセグメントに対する肯定応答が帰ってこなかったらそのセグメントを再送する。TCPでは否定応答(NAK)が使われていないことに注意されたい。その代り再送すべきACK番号でこれを送信元に通知する。IP層では誤ったデータグラムを廃棄してしまうので、データ誤りが検出されることは少なく、タイムアウトによる再送が主体となるであろう。これはTCP/IPのひとつの弱点でもある。従って、再送のタイムアウトはネットワーク環境に対応して、アダプティブかつダイナミックに設定されるようになっていることが好ましい。

 

下図に正常なシーケンスとデータ誤りや欠落が生じたときのシーケンスを示す。この図ではあるひとつのセグメントのみに着目して示されているが、データを送信する側はここに送ったセグメントの応答を待って次のセグメントを送信する必要は無く、受けてのバッファに余裕がある限りどんどん続けてセグメントを送信しても構わない。

 


 


再送タイマーはあまり短く設定すると、ネットワークの輻輳などの原因で重複したセグメントが相手に届く確率が大きくなる。重複したセグメントを受信したホストは単純にそのセグメントを破棄すればよいが、ネットワークのトラフィックを圧迫するので注意しなければならない。

 

再送タイマー値の決定法の例として、仕様書にはラウンドトリップ・タイム (RTT: Round Trip Time)が示されている。これはあるシーケンス番号のセグメントを送信してから、それに対する応答が受信されるまでの時間を計測するものである。これをRTTとすると、これをスムージングしたSRTTを下式に基づいて算出する(左辺のSRTTは更新されたSRTTであることに注意)。

   SRTT = ( ALPHA * SRTT ) + ((1-ALPHA) * RTT)

しかる後に再送タイマーRTOを下式に基づいて算出する。

    RTO = min[UBOUND,max[LBOUND,(BETA*SRTT)]]

UBOUNDは上限(例えば1分)、LBOUNDは下限(例えば1秒)、ALPHAはスムージング計数で例えば0.8~0.9BETAは遅延バリアンス変数(例えば1.32.0)である。但しこのようなアルゴリズムが総てのネットワーク環境でうまく機能するかどうかは議論があろう。

 

 

 

 

前節     目次     次節