10

TCP PUSH関数のほとんどの説明では、PUSH機能では、送信者がデータをすぐに送信する必要があるだけでなく(バッファーがいっぱいになるのを待たずに)、データを受信側の受信アプリケーションにプッシュする必要があると述べられています。サイド、バッファリングなし。

私が理解していないのは、なぜTCPが受信側でデータをバッファリングするのかということです。結局のところ、TCPセグメントはIPデータグラムで移動し、IPデータグラム全体が処理されます(つまり、IP層は、任意のセグメントを運ぶIPデータグラムのフラグメントの必要な再構成を行った後、セグメント全体のみをTCP層に配信します)。それでは、受信側のTCP層がこのデータをアプリケーションに配信するのを待つのはなぜですか?1つのケースは、アプリケーションがその時点でデータを読み取っていなかった場合です。ただし、その場合、データをアプリケーションに強制的にプッシュすることはできません。したがって、私の質問は、なぜPUSH機能がレシーバー側の動作について何かを指示する必要があるのか​​ということです。セグメントが到着したときにアプリケーションがデータを読み取っていることを考えると、そのセグメントはとにかくすぐにアプリケーションに配信される必要があります。

誰かが私の疑問を解決するのを手伝ってもらえますか?

4

2 に答える 2

7

TCPは、アプリケーションが実際にデータを読み取るタイミングがわからず、送信者に受信する意思があること(使用可能な「ウィンドウ」)を通知するため、受信したデータをバッファリングする必要があります。このデータはすべて、アプリケーションによって読み取られるまで「受信ウィンドウ」に保存されます。

アプリケーションがデータを読み取ると、受信ウィンドウからデータをドロップし、次のACKで送信者に報告するサイズを増やします。このウィンドウが存在しなかった場合、送信者は、受信者が先に進むように指示するまで送信を延期する必要がありますが、アプリケーションが読み取りを発行するまでは送信を保留できませんでした。これにより、すべての読み取り呼び出しに完全なラウンドトリップ遅延に相当する遅延が追加されます。

最近のほとんどの実装では、このバッファを使用して、受信したパケットの順序が乱れているため、送信者は、その後のすべてではなく、失われたパケットのみを再送信できます。

PSHビットは一般的に使用されません。はい、実装はそれを送信しますが、通常、受信側の動作は変更されません。

于 2012-11-04T20:55:52.943 に答える
3

他のコメントは正しいですが(PSHビットはほとんどの実装でアプリケーションの動作にほとんど影響を与えません)、ACKの動作を決定するためにTCPによって使用されることに注意してください。具体的には、PSHビットが設定されている場合、受信側のTCPは、遅延ACKを使用する代わりに、すぐにACKを送信します。マイナーな詳細;)

于 2012-11-06T16:45:53.457 に答える