TCPによる確認は、データが配信されたことを保証するものではありません


11

RFC 793には、TCPセグメントの確認応答に関する部分があります。

TCPがデータを含むセグメントを送信すると、TCPはコピーを再送信キューに入れ、タイマーを開始します。そのデータの確認が受信されると、セグメントはキューから削除されます。タイマーが切れる前に確認応答が受信されない場合、セグメントは再送信されます。

TCPによる確認は、データがエンドユーザーに配信されたことを保証するものではなく、受信側のTCPが配信を担当したことを保証するだけです。

さて、これは面白いです。私たちのNOCでは、ネットワークと外部クライアントネットワーク間の接続の問題をトラブルシューティングすることがよくあります。ファイアウォールでトラフィックをスニッフィングし、両方向で送受信されるSYNおよびACKビットを確認するときはいつでも、接続が確立され、問題には何もないと仮定しますネットワークで行います。

しかし今、このRFCは私に考えさせました-TCP接続が確立されているのに、ユーザーがまだ接続の問題を経験している場合、他に何を確認する必要がありますか(Wiresharkをセットアップせずに)?


5
この文が意味するのは、単に文の文字通りの英語の意味です。ネットワークドライバーがデータを受信した(そして受信を確認した)という事実は、エンドユーザーがデータを受信することを保証するものではありません。たとえば、Webサーバーにバグがある可能性があります。最後の質問に関しては、エンドユーザーがデータを受け取ったかどうかを判断する唯一の方法は、それらを呼び出して質問することです。
イェルクWミッターク

回答:


24

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ではなく、再送信を探すことをお勧めします。


別の箇条書き項目:クライアントプロセスが正常に実行されている場合でも、まだデータを読み取っていない可能性があります。
Barmar 2018

1
クライアントプロセス(それが怠惰または混乱している場合)がrecv()ソケットを呼び出すことはありません。その場合、受信したデータはTCPソケットの受信バッファに無期限に残ります。
Jeremy Friesner、

両方に感謝し、クライアントプロセスが遅く、バグが多く、気まぐれである可能性があることを示唆するように更新しました。
ジョナサン

アプリケーションが入力を処理したことを確認するためにACKに依存することはできません。アプリケーション層のACKまたはチェックを実装する必要があります。これを別の文脈で説明します。クライアント側のIPスタックでTSNを使用する産業用制御ネットワークの場合、TCP ACKは、プロセス変数がラッチされたことを保証するには不十分です。つまり、TCP ACKを使用してシステムを安全な状態またはサービス可能な状態にすることはできません。アプリケーションレイヤーサービスから、マシンに手を差し込んでも安全であることを確認する必要があります。
18

10

RFCの観点からは、「エンドユーザー」がアプリケーションです。アプリケーションがデータを取得したという保証はなく、TCPプロセスがデータを受信したというだけです。

NOCの観点から見ると、ネットワークは機能しており、データはエンドホストに到達しています。おそらく、それがあなたが気にするすべてのことです。


0

あなたはそれをこのように見ることができました。

あなたはM.Smithであり、M.Totoに手紙を送りたいとします(人はアプリケーション層です)。

手紙を送るには、ローカルの郵便局Aに行きます。郵便局はM.Totoのローカル郵便局Bに手紙を送ります(郵便局はTCPレイヤーです)。

郵便局Aと郵便局B-Bの間ですべてがうまくいく可能性があります。郵便局AにACKを送信します。ただし、手紙がM.Totoに届くとは限りません。郵便局BとM.Totoの間で何かが起こる可能性があります。

それは基本的にRFCが言うことです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.