スヌープを使用してパケットをキャプチャするSolaris10。
未使用のIPアドレスにtelnetで接続し、接続の試行がタイムアウトするのを待つと、すべてが期待どおりに動作します(SYNは、接続確立のタイムアウトを超えるまで数回送信され、その後telnetが終了します)。
同じことを行うが、タイムアウトに達する前に試行をキャンセルする場合、control-cを使用して、最後のパケットにRSETがあります。
これは理由で行われますか?ネットワークスタックは、SYN-ACKが戻ってこなかったとしても、SYNが成功したと想定しているので、リモートシステムが半分開いたままにならないようにRSETを送信しますか?
私はずっと前にStevensTCP/IP Illustrated、Vol 1を読んだことがあり、これが議論されたことを思い出しません(私は簡単なグーグルでチェックしましたが、本を掘り起こしませんでした)。
ご想像のとおり、これは、接続の試行を中止するようにリモートホストに通知するための念のための手段です。あなたのシステムが知っているすべてのために、ホストはSYNACKを送り返しました、そしてあなたはそれを受け取りませんでした。
これは基本的に「リモートホストです。私に接続しようとした場合は、先に進んで停止できます」です。
TCPは、セッションが確立されているか、確立されている途中であるかに関係なく、セッションがあいまいな状態になることを許可しません。 FINまたはRSTを送信せずに接続を中止するだけではないという意味で、接続または接続試行を正常に終了する必要があります(私が知る限り)。
それは、セッションの一方の端でハーフオープンを引き起こすリンクの切断など、TCPの範囲外の要因のために、セッションがあいまいな状態になることは決してないということではありません。 TCPの観点からは、ハーフオープン接続は単に長いアイドル状態の接続です(TCPキープアライブが実装されていない場合)。