RFCのこの部分は、オペレーティングシステムまたはプロセスの次の段階に責任を渡すことに関するものです。それは基本的にレイヤーの分離に関係しています。
TCPによる確認応答は、データがエンドユーザーに配信されたことを保証するものではなく、受信側のTCPが配信を担当したことを保証するだけです。
私はいつもこのように考えてきました:
- ACKの送信とクライアントプロセスに到達するデータの間でOSがクラッシュする可能性があります(ここでの「クライアント」とは、「ネットワーククライアント」ではなく、OSのクライアントを意味します)
- クライアントプロセスは、バグがあるかクラッシュするか、予想よりもはるかに遅く、着信データの処理に取り掛かるか、実際には明白でない状況でのみ読み取ることができます。
- クライアントがおそらくディスクファイルにデータを送信している場合、ファイルはまだ書き込まれていないか、フラッシュされていない可能性があります
- クライアントがTCPでデータを先に送信している場合、向こう側のTCPがデータを送信していない、ACKを受信していない、または遠方のプロセスがデータを正常に消費している
それが言っているのは、これが上位層の確認応答ではなく、第3層の確認応答(「私はあなたのバイトを聞いた」)であることです。たとえば、TCP ACK、250 OK
ネクストホップメールゲートウェイがメッセージを受け入れた後のSMTP 、メッセージ受信メッセージ(RFC 3798など)、メッセージが開いたトラッキングピクセル、PAからの礼状の違いを検討してください。 「はい、やります」と返信
もう1つの具体的な例はプリンターです。
- データの終わりが何であるかを知る前に、データにACKを送信する必要があります(TCP送信ウィンドウよりも大きいインクルードライブラリで始まるPostscriptファイルである可能性があります)
- ステータスクエリが含まれている可能性があります(「紙はありますか?」、これは明らかに実行できます)。
- 印刷コマンドが含まれている場合があります(「これを印刷してください」。用紙がない場合は失敗する可能性があります)。
ユーザーがACKを表示して送信しているにもかかわらず接続性の問題が発生している場合は、厳密にネットワーク関連のものよりも、輻輳、OS、またはアプリケーションの問題が発生している可能性が桁違いに大きいことをお勧めします。
診断するには、具体的にはACKではなく、再送信を探すことをお勧めします。