我一直在玩websocket(使用Sails.js,內置套接字,基於Socket.io)。websocket如何知道服務器被關閉?
我注意到Chrome每25秒收到兩幀。我認爲這是一種投票來告訴連接仍在繼續。
但是之後,我取消了服務器並立即通知Chrome。
另外,我用kill
命令強制關閉了Node進程,Chrome仍被通知,這意味着在關閉服務器之前它並不是Node發送信號。
這是怎麼發生的?
我一直在玩websocket(使用Sails.js,內置套接字,基於Socket.io)。websocket如何知道服務器被關閉?
我注意到Chrome每25秒收到兩幀。我認爲這是一種投票來告訴連接仍在繼續。
但是之後,我取消了服務器並立即通知Chrome。
另外,我用kill
命令強制關閉了Node進程,Chrome仍被通知,這意味着在關閉服務器之前它並不是Node發送信號。
這是怎麼發生的?
正常的TCP套接字連接做到這一點,所以如果websocket 不是,那將是令人驚訝的。
當服務器進程死亡/退出/被終止時,服務器內核負責清理。這包括釋放內存,關閉文件和關閉套接字。乾淨地關閉TCP套接字需要發送消息告訴對等體。
有趣的是,在一些帶有用戶空間winsock的舊版Windows中,如果服務器進程崩潰,則不會發生這種情況。在符合TCP支持的所有操作系統上,除非內核本身掛起,機器斷電或網絡中斷,否則應該保證。
當對等進程退出時,該連接或者用FIN關閉,或者用對等操作系統用RST重置,這又導致流的結束或本地套接字上的「連接重置」。 – EJP