ソケットに対してcloseを呼び出して、TCPコネクションを切断すると切断をリセットされた(エラーメッセージだとConnection reset by peerなど)と判断される場合があります。

この場合、TCPヘッダにRSTフラグがセットされています。 同じようにcloseを呼び出したつもりでも、リセットになるのは何故なのか?

次の二つを同時に満たした場合のようです。

  • 未受信(受信バッファからデータを取り出していない)がある
  • 明示的にshutdownを呼び出していない

主には一つ目のように正常に通信を終了していなさそうなことが原因になるようです。 それでもなお、明示的にshutdownを呼び出していた場合は、リセットでなく正常の切断(FINフラグ)とするようです。

(ソケットライブラリの実装にもよるかもしれません。今回は正確に覚えていませんが、Linuxのソケットライブラリでした)

リセットによる切断はあまり普通ではない、とのことなので理由としては納得できる気がします。