1:服务器主机崩溃
由于服务器主机崩溃时,已有的网络连接上发不出任何东西,所以客户机TCP使用重传机制持续重传数据分节,试图从服务器上接受一个ACK。
源自Berkley的重传数据分节为12次,放弃前等待的时间约为9分钟。
当客户端终于放弃重传时,(这段时间内服务器没有启动),
假设服务器主机已崩溃,对客户的数据分节没有响应,则错误为ETIMEOUT.
如果是中间路由器判断服务器主机不可达,且以一个目的地不可达的ICMP消息回应,则错误是EHOSTUNREACH或者ENETUNREACH.
尽管客户端还是会发现对方已崩溃或者不可达,但是要等待9分钟,,然而有时想尽快检测出种情况,需要设置套接子选项SO_KEEPALIVE.
2:服务器主机崩溃后重启
如果客户端在服务器主机崩溃后不主动发送数据给服务器,客户是不会知道服务器已经崩溃的。(假设没有设置SO_KEEPALIVE)
如果服务器主机崩溃后重启,它的TCP将丢失崩溃前的所有信息,所以服务器对接受的客户端的数据以RST响应。
在客户端,当RST到达时,客户端当前正处于recv调用,导致他返回一个ECONNRESET.
3:服务器主机关闭
客户端通过recv调用接受到服务器发送的FIN,recv返回0。