これは一般的なTCPの質問かもしれません。
SYN
接続TCP TIME-WAIT
状態の接続でOR ESTABLISHED
パケットを受信できますか?
これは可能ですか?
SYN
TCP接続で受信されたESTABLISHED
は発生しないはずです。遅延パケットである可能性があり、サイレントにドロップしても安全です。
接続が失われ、サーバーではなくクライアントでタイムアウトになった場合、またはクライアントが再起動された場合、サーバーがESTABLISHED
状態になり、クライアントがCLOSED
状態になる可能性があります。このシナリオで新しい接続を開こうとすると、SYN
パケットがESTABLISHED
状態で受信されます。望ましい結果は、古い接続が閉じられ、新しい接続が開かれることです。
この望ましい結果を達成する方法は次のとおりです。
SYN
を送信して、新しい接続を作成します。ACK
接続に対してESTABLISHED
を送信します。ACK
にRST
パケットで応答し、ESTABLISHED
接続が切断されます。SYN
パケットを再送信して、新しい接続を作成します。TIME_WAIT
状態で受信されたSYN
パケットは、サーバーが接続を閉じ、クライアントが同じポート番号で新しい接続を開いた後に発生する可能性があります。これにより、新しい接続が開かれます。
どちらも...SYN
は、接続が最初にセットアップされたとき(3ウェイハンドシェイク)、またはパケットが破棄されたときにのみ使用されます。
基本的に:
SYN (I want to start a connection) -> ACK/SYN (OK, I want to start a connection too) -> ACK (acknowledged connection, ready for data)
両方のホストから送信されたACK
パケットを使用した会話フローは、お互いにパケットを受信したことを示しています。
最後に、FIN
がサーバーに送信され、TIME_WAIT
はソケットに設定されます。サーバーがFIN
パケットで応答すると、ソケットが解放されます。