TCP非正常情况下的工作状况

1.服务器进程终止

首先,服务器进程终止(收到SIGKILL信号)。作为进程中止处理的工作之一,
该进程所有打开着的描述符将被关闭,这会导致向对端(客户端)发送(FIN N),
而客户端则回复(ACK N+1),这就是TCP断开连接的前半部分。

然后,此时客户端收到(FIN N)并不意味着连接断开(虽然在这个例子中,
确实断开了),只是意味着服务器不再向客户端发送数据了,客户端还可以
继续向服务器发送数据。如果此时客户端还继续向服务器发送数据,服务器
TCP将发现之前的打开该套接字的进程已终止,于是回应一个RST。客户端在
收到这个RST之前的read操作将会返回EOF,在收到这个RST后的read操作会
返回ECONNRESET错误,在收到这个RST后的write操作会使当前进程收到
SIGPIPE信号。

以上过程如下图所示:
这里写图片描述

2.服务器主机崩溃

服务器主机崩溃的意思是,没有任何预兆,来不及在网络上发送任何消息,
主机就无法工作了。这种情况等价于直接切断网络,或者通俗的说,可以直
接拔掉网线来模拟这一情况。

这时,如果客户端向服务器发送数据,后调用read操作,TCP会一直等待
服务器的ACK确认消息,并且不断的超时重传(按照Berkeley的实现,重传
12次,共需9分钟),直到到达重传次数,返回ETIMEOUT错误。
如果是由中间的路由器判定服务器主机不可达,响应“destination unreasonable”的ICMP消息,
将返回EHOSTUNREACH和ENETUNREACH错误。

3.服务器主机崩溃后重启

重启之后的服务器已经丢失了之前的TCP信息,所以即使收到了客户端发来的
TCP数据,也会回复RST,往后的情况和“服务器主机崩溃”中提到的类似。

4.服务器主机关机

Unix系统关机时,init进程通常会给其他进程发送SIGTERM信号,然后等待
10s左右给仍在运行的进程发送SIGKILL信号。所以如果进程不捕获SIGTERM
信号,则将由SIGKILL信号终止,和“服务器进程终止”中提到的类似。

猜你喜欢

转载自blog.csdn.net/m0_37947204/article/details/81408054