4

私たちの環境ではランダムなRSTパケットの問題に直面しており、予期しない動作が発生します。次の画像は、wiresharkによって生成されたtcpデータのスナップショットであり、問​​題を示しています。

  1. クライアント(117.136.2.181)がサーバー(192.168.40.16)との接続を正常にセットアップしました
  2. クライアントは、KEEP_ALIVE信号だけでなく、いくつかのデータをサーバーに送信します。
  3. サーバーはデータを受信して​​処理し、結果をクライアントに送り返します。
  4. サーバーがソケットを閉じます。
  5. サーバーはクライアントからACK信号を受信しないため、結果データとFIN信号を再送信します。これはTCPプロトコルによって自動的に行われます。ただし、サーバーはクライアントからACK信号を受信しません。
  6. サーバーはRST信号をクライアントに送信するため、接続は閉じられます。

TCPデータパケット

いくつかの分析の結果、ステップ3の後にネットワークの問題が発生したと考えられるため、サーバーから送信されたすべての結果データとFIN信号はクライアントによって確認されませんが、サーバーから送信されたRST信号については非常に混乱しています。私たちの理解に基づくと、ハーフクローズソケットがデータを受信した場合、またはソケットを閉じたときに受信キューにデータがある場合、RST信号が送信されます。しかし、これらは両方とも私たちのケースの根本的な原因ではないようです。

なぜこれが起こっているのかを詳しく説明するのを助けることができますか?

4

1 に答える 1

0

RST通常、 がcloseなしでソケットで呼び出された場合shutdown、またはshutdownしばらくして相手がまだデータを送信しようとしている (まだ で応答していないFIN) 場合に発生します。

一部のプログラミング言語には、socket.close(timeout)たとえば.NETshutdownがあり、それが渡されたclose後に呼び出されます。timeout

そのため、クライアントはtimeout送信を完了して で接続を閉じるFIN必要があります。これに失敗した場合、接続は によって強制的に閉じられRSTます。

との違いに関する詳細な説明については、https://stackoverflow.com/a/23483487/1438522を参照してください。closeshutdown

于 2021-01-22T23:39:43.017 に答える