「ぎこちなく感じる」場合でも、受信者に ack を返すのが最善の方法です。 IP はデータを複数のパケットに分割し、それらを再構築する可能性があることに注意してください。これは、途中のさまざまなルーターの MTU が異なる場合、送信に沿って複数回実行される可能性があるため、「パケット」と TCP の概念が一致しない可能性があります。
文字列、シリアル化されたオブジェクト、バイナリ データのいずれであっても、「パケット」を送信し、受信者にそれがそこにあることを確認するために必要なすべてのチェックを行わせてから、確認応答を送り返す方がはるかに優れています。
送信側の TCP は、データが相手側からいつ確認応答されるかを知っていますが、これを行う唯一の理由は、データをいつ破棄できるかを知るためです (他の誰かが相手側のアプリケーションにデータを渡す責任があるため)。 ).
通常、この情報は送信側のアプリケーションに提供されません。なぜなら (見た目にもかかわらず) 実際には 意味 ではないからです。 送信アプリケーションに多くのことを。受信確認は、受信アプリケーションがデータを取得し、それに対して適切な処理を行ったことを意味するものではありません。つまり、送信 TCP がデータを気にする必要がなくなったことを意味します。データはまだ転送中の可能性があります。たとえば、中間プロキシ サーバー内、または受信側の TCP スタック内です。
「正常に受信されたデータ」は、実際にはアプリケーション レベルの概念であり、その意味はアプリケーションによって異なります (たとえば、多くのアプリケーションでは、データが受信側でディスクに同期された後にのみ「受信された」と見なすことが理にかなっています)。側)。つまり、自分で実装する必要があるということです。なぜなら、アプリケーション開発者として、自分のアプリケーションのために賢明に実装する方法を知っている立場にあるのはあなただけだからです。