ソケットにSO_REUSEADDRオプションを設定しています。ソケットが一方の端から閉じていると仮定します。
そして、ソケット記述子が他のプロセスに再割り当てされました。
古いTCP接続からのデータが新しいTCP接続に忍び込む可能性はありますか?
特にSolarisで、古いデータが新しいTCP接続に忍び込むのを誰かが観察しましたか?
いいえ。
ローカルポートを再利用しても、その後の接続でリモートホストまたはポートのいずれかが変更された場合、これは不可能です。
同じローカルIP/ポートから同じリモートIP/ポートに再接続する場合(TIME-WAIT Assasinationとも呼ばれます)、TCPスタックが従うべきいくつかのルールがあります。主に-前の接続よりも高いシーケンス番号から始めます。RFC 1337で詳細を読むことができます。しかし、後続の接続でシーケンス番号がどのように調整されるかを概説する、より良いリンクと引用があります。
http://blogs.technet.com/b/networking/archive/2010/08/11/how-tcp-time-wait-assassination-works.aspx
サーバー側のソケットがTIME-WAIT状態になり、クライアントが2MSL(デフォルトのTIME-WAIT時間)内にサーバーに再接続する状況では、次の2つのことが発生する可能性があります。
ソケットがTIME-WAIT状態であるため、サーバーはクライアントからのSYNパケットに応答しません。
サーバーはクライアントからSYNを受け入れ、ソケットの状態をTIME-WAITからESTABLISHEDに変更する場合があります。これは、TIME-WAIT暗殺、または以前の接続の化身として知られています。
上記のシナリオ「2」の鍵は、送信されたSYNのISN(初期シーケンス番号)が、前のセッションで使用された最大のシーケンス番号よりも大きい必要があることです。ISNが期待どおりでない場合、サーバーはSYNに応答せず、ソケットは2MSLを待機してから、再び使用できるようになります。
それがTIME_WAIT状態の目的です。最大セグメント寿命の2倍持続するため、古い接続に送信されたデータは、同じIP:ポートペア間の新しい接続が形成される前に期限切れになります。