UNP卷一学习笔记:TCP服务器常见故障

来源:互联网 发布:民生证券交易软件官方 编辑:程序博客网 时间:2024/04/28 03:22

在使用TCP协议通信时,服务器有可能会发生以下问题:

(1)accept返回前连接中止:

三次握手完成并且连接建立后,客户端TCP发送了一个RST。在服务器看来,就在该连接已由TCP排队,等着服务器进程调用accept的时候RST到达,然后,服务器调用accept函数。

(2)服务器进程终止:

客户端和服务器开始传输数据后,服务器与该客户端传输数据的子进程被杀死,于是发生:

服务器:

(a)被杀死的子进程的所有打开描述符被关闭,并且发送一个FIN给客户端。

(b)SIGCHLD信号发给该子进程的父进程,并得到正确处理。

客户端:

没有发生特别的事,接收FIN后返回服务器一个ACK,然后继续发送数据。


服务器在接收客户端的ACK后,再收到客户端发送的新数据,会返回客户端一个RST,而这个RST被客户端接收后有可能会被客户端的进程所忽略,忽略RST的进程继续向接收RST的套接字写数据,内核就会发送一个SIGPIPE信号告知该进程,进程的写操作会返回EPIPE错误。该信号的默认处理是终止进程,因此进程如果不想被终止就必须捕获它

(3)服务器主机崩溃:

服务器主机崩溃后,不会向客户端发送任何数据。根据TCP的重传机制,客户端会坚持一段时间向服务器重发数据,由于服务器主机崩溃,对这些数据无法响应,因此客户端在坚持一段时间后会放弃重传,并且进程会返回一个ETIMEOUT错误。,如果是中间路由器判定服务器不可达,则会返回EHOSTUNREACHENETUNREACH错误。

客户端要想检测出服务器主机崩溃可以采用两个办法:

(a)向服务器主动发送数据,直到返回ETIMEOUT或者EHOSTUNREACH或者ENETUNREACH错误

(b)如果不想主动发送数据也能检测出服务器主机崩溃,可以通过设置SO_KEEPALIVE套接字选项。

(4)服务器主机崩溃后重启:

服务器主机崩溃后重启,它的TCP丢失了TCP崩溃前的所有连接信息,因此会对收到的客户端数据响应一个RST。

如果客户端阻塞于read调用,会导致该调用返回ECONNRESET错误。

(5)服务器主机关机:

服务器主机如果被人为关机,UNIX系统的init进程会向所有进程发送SIGTERM信号,然后等待一段时间,再向所有仍在运行的进程发送SIGKILL信号。从进程角度,当接收到SIGTERM信号后,会有一段时间来处理SIGTERM信号,并且终止自己;如果超过了这段时间,进程还在运行就会被SIGKILL信号强制终止。服务器与客户端连接进程终止后,就会发生上述服务器子进程终止的情况。

0 0
原创粉丝点击