TCPリセット問題

TCP リセット問題 (HTTP)

[11] TCP リセット問題 (TCP reset problem) は、 HTTPパイプラインTCP の動作に関する問題です。

仕様書

説明

[2] TCP 接続をすぐに閉じると、 クライアントが最後の要求を読めない可能性があります。 が完全に閉じた接続に対してクライアントが新しいデータ (パイプライン化された次の要求) を送信してが受信すると、 TCPスタックがリセット (RST) をクライアントに送信します。これをクライアントが受信すると、 クライアント側の HTTP 応用が読んで解釈する前にクライアントack されていないデータを消してしまうことになります。 >>1

[3] この問題を回避するため、接続を次の手順で閉じます。 >>1

  1. [4] 書き込み側だけ閉じます。
  2. [5] クライアント側から閉じられるか、の最後の応答を含んだパケットackTCPスタックが受信したと考えられる時点まで、クライアントからのデータを読み続けます。
  3. [6] 完全に閉じます。

[7] この問題が TCP のみか、他のトランスポート層プロトコルにもあるのかは不明です >>1

[9] クライアントは、失敗した接続 (が最後の完全応答で明示的に閉じたのでない接続) の後にパイプライン化された要求を再試行する場合には、 接続を確立した直後にパイプライン化してはなりません>>8

[10] パイプラインで送信していてまだ応答が返ってきていない最初の要求は、 その処理で何らかのエラーが発生し、接続が閉じられ、 パイプラインの続きの要求によってTCPリセット問題が発生したのかもしれません。 そうだとすると、再度パイプライン化して要求を送信すると、 再度同じように接続が閉じられ、エラーもまた受け取れないかもしれません。