全2985文字
PR

確実に早くデータを渡すための四つの制御機能

 TCPはデータを確実に、かつなるべく早く送るために、四つの機能を備えている。それは「(1)確認応答」「(2)フロー制御」「(3)順序制御」「(4)輻輳(ふくそう)制御」である。

確実にやりとりするためのTCPの機能
確実にやりとりするためのTCPの機能
[画像のクリックで拡大表示]

 (1)確認応答とは、受信側がパケットを受け取るたびに送信元へ応答パケットを返すことだ。これによって、送信側は確実に相手がデータを受け取ったことを確認できる。なお、送信側はパケットを送った後、一定時間待っても応答がなければ、パケットが紛失したと判断してパケットを再送する。

 (2)フロー制御は、受信側のバッファーに空きがあれば、まとめてパケットを送る機能だ。バッファーは、TCP処理ソフトが処理を開始するまで、一時的にデータを保存するメモリーである。一つずつパケットを送って応答を確認してから次のパケットを送ると、スループットは著しく低くなる。そこでフロー制御を使ってスループットを高める。

 しくみを見てみよう。まずコネクションを張る際に、お互いのバッファーのサイズをヘッダーに書き込んで通知し合う。図の(2)のように、受信側のバッファーにパケットが三つまで入ることがわかれば、送信側は三つのパケットをまとめて送る。

 受信側はパケットが届くたびに応答パケットでバッファーの空きサイズも通知する。送信側は、パケットを送った数と応答があった数、最後の応答に書かれたバッファーの空きサイズを計算して、空きがあるとわかれば、その分のパケットを送信する。

 (3)順序制御は、フロー制御と合わせて利用する。LANでイーサネットを使っている場合、TCPパケットの最大サイズは約1460バイトである。

 このため、アプリケーションから受け取ったデータがこれより大きいと、送信側のTCP処理ソフトはデータを分割して送り出す。このとき、ヘッダーには、データの分割した順番を表す「シーケンス番号」を書き込む。

 フロー制御を行うと、同時に複数のパケットを送信するため、届く順序が入れ替わることがある。順序制御では、届く順序が入れ替わっても、シーケンス番号を使って元のデータを正しく復元できるようにしている。

 (4)輻輳制御は、ネットワークの混み具合に応じて、まとめて送信するパケット数を制御する機能である。輻輳とは、ネットワークが混み合って、送信途中にパケットが紛失してしまう状態を指す。輻輳が起こると、送信側は紛失したパケットの再送を繰り返すようになる。

 これを防ぐために、輻輳制御ではいったん輻輳が起こったら、一度に送るパケット数を大幅に減らす。これにより、輻輳が連続して起こらないようにしている。

 このように、TCPではデータを確実に送ること、それを実現するために大きくなるオーバーヘッドをなるべく抑える工夫が備わっている。