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