UNP卷一学习笔记:TCP服务器常见故障
Posted printfnothing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UNP卷一学习笔记:TCP服务器常见故障相关的知识,希望对你有一定的参考价值。
在使用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错误。,如果是中间路由器判定服务器不可达,则会返回EHOSTUNREACH或ENETUNREACH错误。
客户端要想检测出服务器主机崩溃可以采用两个办法:
(a)向服务器主动发送数据,直到返回ETIMEOUT或者EHOSTUNREACH或者ENETUNREACH错误
(b)如果不想主动发送数据也能检测出服务器主机崩溃,可以通过设置SO_KEEPALIVE套接字选项。
(4)服务器主机崩溃后重启:
服务器主机崩溃后重启,它的TCP丢失了TCP崩溃前的所有连接信息,因此会对收到的客户端数据响应一个RST。
如果客户端阻塞于read调用,会导致该调用返回ECONNRESET错误。
(5)服务器主机关机:
服务器主机如果被人为关机,UNIX系统的init进程会向所有进程发送SIGTERM信号,然后等待一段时间,再向所有仍在运行的进程发送SIGKILL信号。从进程角度,当接收到SIGTERM信号后,会有一段时间来处理SIGTERM信号,并且终止自己;如果超过了这段时间,进程还在运行就会被SIGKILL信号强制终止。服务器与客户端连接进程终止后,就会发生上述服务器子进程终止的情况。
以上是关于UNP卷一学习笔记:TCP服务器常见故障的主要内容,如果未能解决你的问题,请参考以下文章