44

私がこれを理解する方法では、TCP接続を閉じるには2つの方法があります。

  • FINフラグを送信します
  • RSTフラグを送信します

RSTは接続を即座に終了させますが、FINでは確認を受け取ります。

私はこの権利を理解していますか、そしてこの2つの間に他の違いはありますか?これらの2つのフラグを一緒に使用できますか?

4

3 に答える 3

101
  • FINは次のように述べています。「私はあなたと話し終えましたが、あなたが終わったと言うまで、あなたが言わなければならないことはすべて聞きます。」

  • RSTは、「会話はありません。私は何も言わず、あなたの言うことも聞きません。」と言います。

    RSTは、トラフィックが少なく、TCP接続が長続きする場合に役立ちます。一方のコンピューターを再起動すると、接続を忘れ、もう一方のコンピューターは別のパケットを送信するとすぐにRSTを取得します。

于 2012-10-24T13:15:08.920 に答える
12

次の場合、FINまたはRSTが送信されます。

  • プロセスがソケットを閉じます
  • プロセスがソケットを閉じずに終了すると、OSはリソースのクリーンアップを実行します。

    プロセスがclose()を呼び出す場合、FINはデフォルトで終了側から送信されます(注:ソケットオプションSO_LINGERを設定して、FINの代わりにRSTを送信することができます)

    ソケットを閉じずにプロセスが終了すると、カーネルはtcp接続を閉じ、プロセスのクリーンアップを実行します。FINまたはRSTを送信できます。受信キューにデータがある場合、RSTが送信されます。それ以外の場合は、FINが送信されます。

    詳細については、tcp.cのtcp_close()をループできます(redhatブランチのkernel-2.6.32-573.7.1を使用しています)

于 2015-11-06T06:01:53.247 に答える
10

誰もが私に対して引用し続けているが実際には引用していないRFC1122から

TCP接続は、(1)FINハンドシェイクを使用した通常のTCPクローズシーケンスと、(2)1つ以上のRSTセグメントが送信され、接続状態がすぐに破棄される「中止」の2つの方法で終了する場合があります。

両方を同時に使用することはできません。概念は意味をなさないようになり始めていません。

ここでは説明しないトリックによって、FINではなくRSTを使用してTCP接続を閉じることは可能ですが、それはばかげた考えであるため、文書化しません。一つには、飛行中のすべての保留中のデータが失われます。

于 2012-10-24T21:23:00.663 に答える