私がこれを理解する方法では、TCP接続を閉じるには2つの方法があります。
- FINフラグを送信します
- RSTフラグを送信します
RSTは接続を即座に終了させますが、FINでは確認を受け取ります。
私はこの権利を理解していますか、そしてこの2つの間に他の違いはありますか?これらの2つのフラグを一緒に使用できますか?
私がこれを理解する方法では、TCP接続を閉じるには2つの方法があります。
RSTは接続を即座に終了させますが、FINでは確認を受け取ります。
私はこの権利を理解していますか、そしてこの2つの間に他の違いはありますか?これらの2つのフラグを一緒に使用できますか?
FINは次のように述べています。「私はあなたと話し終えましたが、あなたが終わったと言うまで、あなたが言わなければならないことはすべて聞きます。」
RSTは、「会話はありません。私は何も言わず、あなたの言うことも聞きません。」と言います。
RSTは、トラフィックが少なく、TCP接続が長続きする場合に役立ちます。一方のコンピューターを再起動すると、接続を忘れ、もう一方のコンピューターは別のパケットを送信するとすぐにRSTを取得します。
次の場合、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を使用しています)
誰もが私に対して引用し続けているが実際には引用していないRFC1122から:
TCP接続は、(1)FINハンドシェイクを使用した通常のTCPクローズシーケンスと、(2)1つ以上のRSTセグメントが送信され、接続状態がすぐに破棄される「中止」の2つの方法で終了する場合があります。
両方を同時に使用することはできません。概念は意味をなさないようになり始めていません。
ここでは説明しないトリックによって、FINではなくRSTを使用してTCP接続を閉じることは可能ですが、それはばかげた考えであるため、文書化しません。一つには、飛行中のすべての保留中のデータが失われます。