accept返回前终止连接
场景描述:三次握手完成后,连接建立完成,然后Client TCP发送一个RST(reset)。在服务器方,连接被它的TCP放入等待连接队列,当RST到来时,连接正在等待服务器进程调用accept。一段时间后,服务器进程调用accept。
发生这种情况后,POSIX规定accept函数返回ECONNABORTED
服务器进程终止
场景描述:杀死服务器子进程后,子进程上的描述符被关闭,因此会向客户端发送一个FIN。这时候客户端不知道服务器的进程已经关闭,接受到FIN的客户端回复ACK,然后还会继续传送未传完的数据 (但是这个时候调用read将会返回0,表示EOF)。服务器收到客户数据时,由于连接不存在,会返回RST。这时客户端已经关闭,收不到RST。
SIGPIPE信号
当服务器close一个连接时,若client端接着发数据。根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了。
该信号的默认行为是终止进程
无论该进程是捕获了该信号并从信号函数返回,还是简单地忽略该信号,写操作write函数都将返回EPIPE错误
服务器主机奔溃
场景描述:在三次握手后的服务器和客户端之间,如果主机奔溃,接收不到客户端的报文,那么客户端就会持续重传数据分节,试图从服务器接收一个ACK。由于主机已经奔溃,所以对客户不会有回应,那么可能出现两种情况:
1. 中间某个路由器判定服务器主机不可达,返回EHOSTUNREACH 或者 ENETUNREACH
2. 客户一直没收到回应,返回ETIMEOUT
服务器主机奔溃后重启
场景描述:在三次握手后的服务器和客户端之间,如果主机奔溃并重启,那么这时候主机已经丢失了奔溃前的所有连接信息。接收到客户端的数据分节时,会响应一个RST。这时候客户阻塞的read函数会返回ECONNRESET
服务器主机关机
UNIX系统关机时,init进程先给所有进程发送SIGTERM信号,等待一段时间,然后给所有仍在运行的进程发送SIGTERM信号并终止。服务器子进程关闭后,接下来的情况同上面的 服务器进程终止。