当服务器进程被终止时,会关闭其打开的所有文件描述符,此时就会向客户端发送一个 FIN 的报文,客户端则响应一个 ACK 报文,但是这样只完成了“四次挥手”的前两次挥手,也就是说这样只实现了半关闭,客户端仍然可以向服务器写入数据。
但是当客户端向服务器写入数据时,由于服务器端的套接字进程已经终止,此时连接的状态已经异常了,所以服务端进程不会向客户端发送 ACK 报文,而是发送了一个 RST 报文请求将处于异常状态的连接复位;如果客户端还要继续向服务端发送数据,系统会发出一个 SIGPIPE 信号给进程,告诉进程这个连接已经断开了,不要再写了。
根据信号的默认处理规则 SIGPIPE 信号的默认执行动作是 terminate(终止、退出),所以客户端会退出。