確認応答(ACK)

更新日:

用語解説

確認応答(ACK:Acknowledgment)は、受信側がデータや制御情報を受け付けた範囲を送信側へ通知する仕組みです。TCPではACK番号が「次に受信したいシーケンス番号」を示し、それより前の連続したバイト列を累積的に確認します。ACKだけでアプリケーション処理の完了や通信内容の真正性まで保証するものではありません。

■ 試験で押さえるポイント

  • TCPのシーケンス番号は基本的にバイト単位です。ACK番号が5001なら、5000までの連続したシーケンス空間を受信し、次は5001からを期待するという意味で、単に「パケット5000番を受信した」という意味ではありません。

  • 途中に欠落があると、後続セグメントが届いても通常は欠落位置を示す同じ累積ACKを返します。重複ACKや再送タイマの満了を手掛かりに送信側が再送し、SACKオプションがあれば非連続に受信済みの範囲も通知できます。

  • ACK自体が失われても、後の累積ACKが同じ範囲をまとめて確認できるため、直ちに再送が必要とは限りません。反対に再送によって同じデータが再到着しても、シーケンス番号で重複を識別してアプリケーションへ二重に渡さないよう処理します。

  • 受信側は全セグメントへ即時にACKを返すとは限らず、複数セグメントをまとめるdelayed ACKや、逆方向データへACKを載せるpiggybackを使えます。過度な遅延は再送や送信速度へ影響するため、規定された範囲で行います。

  • TCPヘッダのACKフラグはACK番号欄が有効であることを示します。接続確立のSYNに対するSYN+ACK、接続終了のFINに対するACKでもシーケンス空間を確認し、確立後のほぼ全てのセグメントでACKが有効です。

  • ACKは受信TCPがデータを引き受けたことを示しますが、受信アプリケーションが読んだ、データベースへ保存した、又は業務処理に成功したことを意味しません。業務上の完了確認にはアプリケーションプロトコルの応答やトランザクション管理が必要です。

  • TCPの通常ACKには暗号学的認証がありません。経路上の攻撃やセッション推測に対してはTLS、IPsec、TCP-AO等を要件に応じて用い、ACKを送信者本人の証明として扱いません。

■ 過去問での着眼点

TCPのACK番号は次に受信したいシーケンス番号を示し、それより前の連続したバイト列を累積的に確認します。欠落時の重複ACK、タイムアウト・高速再送、delayed ACK及びSACKを区別し、ACK喪失が必ずデータ再送を意味しない点を押さえます。TCPのACKはアプリケーション処理完了の証明ではないため、必要なら上位層で完了応答を設けます。

例: 1000番から500バイトを正常受信した側はACK=1500を返します。次の1500~1999が失われ、2000以降が届けばACK=1500を繰り返し、送信側は欠落範囲を再送します。ACK=1500は受信アプリが保存済みという意味ではありません。

音声で聞く

同じ分野の用語