引言:在采用TCP协议进行文件流传输时,客户端的不正常退出导致的服务器进程直接退出。而一个稳健的高并发服务器上这样的情形是不被允许的,接下来将剖析其产生服务器进程退出的根本原因;
一、原因概述
过程:
当客户端与服务器保持一个长连接,并且正在由服务器端传输文件流到客户端的过程中,客户端由于某些人为或其他原因导致的客户端的套接字进程突然断开连接(进程被kill);此时服务器仍然向客户端的套接字写入数据,接着服务器进程停止;
分析:
客户端进程突然断开(进程被kill掉)时,被kill的进程在终止处理的工作中关闭所有该进程打开的描述符,这导致了一个FIN被发送给了服务器,服务器接收以后回复一个ACK;至此,该过程完成了四次挥手的前半个部分;然而此时在服务器上与客户端保持连接的该进程正在将文件流发往客户端,服务器上的该进程还并未调用close或shutdown函数,因此四次挥手的后一部分尚未完成;
根据上述,由于四次挥手没有完成后一部分,服务器仍然能向客户端发送数据,第一次数据到客户端后,客户端会响应一个RST,服务器接收后仍在向缓冲区发送数据,此时,内核向该进程发送一个SIGPIPE信号;(当一个进程向某个已收到RST的套接字执行写操作时,内核向该进程发送一个SIGPIPE信号);
注意:SIGPIPE信号的默认行为是终止进程,因此服务器进程退出;