TCPの制御・選択確認応答(SACK)

 拡張されたTCPには、 SACK (選択的確認応答:selective acknowledgement) というメカニズムが実装されています。ここでは、SACK (選択的確認応答)について解説していきます。

前方確認応答

まずは、前方確認応答について簡単におさらいしておきます。

 TCPでは、通信の信頼性を高めるために確実にデータを届ける仕組みが用意されています。これらの中には、受信側に届かなかったデータを再送するメカニズムがあります。

 後で解説するSACKを用いない拡張の前の方法では、TCPは次のバイトを要求することで、それまでのセグメントが届いていたことを送信側のホストに通知します。

下図を例に解説していきます。

送信側ホストはセグメント1~8を受信側ホストに送信します。

 セグメント3と4を除くすべてのセグメントが到着していますが、欠落したパケットの最初が、セグメント3であるため、受信側ホストは、次のセグメントがセグメント3であることを知らせる「ACK3」で確認応答を行います。

送信側ホストは、他のセグメントが到着したかどうかまでは、わかりません。

そこで、送信側ホストはセグメント3~8を再送信します。

 再送したすべてのセグメントが到着した場合、セグメント5~8は重複します。この不要なセグメントのせいで、ネットワークに負荷をかけてしまうことになり、非効率です。

選択的確認応答 (SACK)

 現在のOSでは、通常、3ウェイハンドシェイク中に選択確認応答 (SACK) と呼ばれるTCPのオプション機能を使ってネゴシエーションします。

 送信側と受信側の双方がSACKをサポートしている場合、受信側は不連続なセグメントを含め、正常に受け入れられたすべてのセグメントに関して、受信側が送信側に通知することができます。

この仕組みによって、送信側ホストは、欠落したデータだけを再送信できます。

下図を例に解説していきます。

送信側ホストはセグメント1~8を受信側ホストに送信します。

 セグメント3と4を除くすべてのセグメントが到着した場合、受信側ホストはセグメント1と2を受信できたことを、応答確認を「ACK3」で返信し、他に受信できているセグメント5~8を「SACK5-8」で選択的に返信します。

そうすることで送信側ホストは、セグメント3と4を再送信するだけで済みます。

 上記で解説したように、選択的確認応答 (SACK)を用いることで、必要なセグメントのみを再送してもらうことができるため、効率性を高めることができます。