全1795文字

 TCPコネクションを確立したからといって、それだけでデータが間違いなく転送できるわけではない。IPを使ってTCPパケットを送る以上、ネットワークの中でパケットが失われたり順番が入れ替わったりすることがあるからだ。

 でも大丈夫。TCPは、パケットの消失や順番の入れ替わりを検出して、再送したり正しい順番に入れ替えたりするメカニズムを備える。

返事がなければ再送する

 ネットワークでパケットが失われた場合、パケットの消失を検知して、失われたパケットを再送する必要がある。そこでTCPスタックは、送信相手からパケットが届いたという確認を送り返してもらう(図1)。送ったのに返事が来なければ届いていないとみなして、パケットを送り直す。こうすれば、データの抜けはなくなるわけだ。

図1●届いたことを応答してもらい、応答がなかった分をもう一度送る
図1●届いたことを応答してもらい、応答がなかった分をもう一度送る
データを確実に転送するために、受信側が応答することになっている。応答がなければ再送する。
[画像のクリックで拡大表示]

 ここで問題になるのは、元のデータを分割して、複数のパケットで送る場合。1個のパケットでどれだけのデータを送れるかは、ネットワークによって異なる。元のデータの大きさが1個のパケットで転送できる量を超えると、連続した複数のパケットを送る。このとき、パケットの区別がなく「届いた」という返事だけが送信側に来ても、どのパケットが届いたかがわからない。

 そこでTCPでは、ヘッダーに含まれるシーケンス番号と確認応答番号を使う。転送するデータをバイト単位でカウントし、番号とバイト数から算出した値を連絡し合うことで、データがどこまで届いたのかがわかるようにしている。