セグメント消失への対処
ネットワークがどれだけうまく設計されていても、ときどきデータが失われることがあります。そのため、TCP にはそうしたセグメント消失を管理するための方法が用意されています。 確認応答がないセグメントを再送信するメカニズムもその 1 つです。
TCP を使用している宛先ホストのサービスは、バイトが連続しているデータに対してだけ確認応答を行うのが普通です。 1 つまたは複数のセグメントが欠落している場合、バイトが連続している最初のシーケンスのデータに対してだけ確認応答が行われます。 たとえば、シーケンス番号が 1500 から 3000 までのセグメントとシーケンス番号が 3400 から 3500 までのセグメントが受信されたとすると、ACK 番号は 3001 になります。 そうなるのは、シーケンス番号が 3001 から 3399 までのセグメントが受信されていないからです。
送信元ホストの TCP は、あらかじめ定められた時間が経過しても確認応答を受信していなければ、最後に受信した ACK 番号に戻り、それ以降のデータを再送信します。 再送信プロセスは、RFC(Request For Comments)で規定されておらず、それぞれの TCP 実装に任されています。
一般的な TCP 実装では、ホストがセグメントを再送信し、そのセグメントのコピーを再送信キューに入れ、タイマーを開始します。 データの確認応答が受信されると、そのセグメントはキューから削除されます。 タイマーが期限切れになる前に確認応答が受信されなければ、そのセグメントが再送信されます。
図中の [再生] ボタンをクリックすると、失われたセグメントを再送信するアニメーションを見ることができます。
最近では、選択的確認応答(SACK; selective acknowledgement)と呼ばれるオプションの機能を使用するホストもあります。 両方のホストが SACK をサポートしている場合、宛先ホストは不連続なセグメントのバイトに対して肯定応答を返すことができるので、送信元ホストは失われたデータだけを再送信すれば済むことになります。