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错误。,如果是中间路由器判定服务器不可达,则会返回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服务器常见故障
- UNP卷一学习笔记:TCP状态
- UNP卷一学习笔记:基本TCP套接字
- UNP卷一学习笔记:POSIX信号处理
- UNP卷一学习笔记:I/O模型
- UNP卷一学习笔记:基本UDP套接字编程
- UNP卷一学习笔记:高级I/O函数
- TCP/IP卷一 学习笔记
- UNP 卷一的服务器时间获取例子
- 《TCP/IP详解卷一:协议》学习笔记一
- TCP/IP卷一学习笔记(概述)
- 《TCP-IP详解 卷1:协议》学习笔记(一)
- 【学习笔记:0】TCP-IP详解卷一:协议
- 《TCP/IP详解卷一:协议》学习笔记二
- 《TCP/IP详解卷一:协议》学习笔记四
- 《TCP/IP详解卷一:协议》学习笔记五
- 《TCP/IP详解卷一:协议》学习笔记六
- 《TCP/IP详解卷一:协议》学习笔记七
- JS返回顶部and底部加载实例
- 写给自己
- viewDidLoad, viewWillDisappear, viewWillAppear等区别及各自的加载顺序
- Picasso设置超时时间和加载出错时的图片
- Oracle 11G R2 用exp无法导出空表解决方法
- UNP卷一学习笔记:TCP服务器常见故障
- Python中报错TypeError: must be str, not bytes
- 64位ubuntu装32位java
- 单源点最短路径Dijkstra的java实现
- iOS 调试问题记录(一)
- 将手机log定向输入到文件中
- 为啥支付宝付款功能不用密码!~这个功能只有客户端有,网页版是一直密码短信都需要
- BZOJ2154: Crash的数字表格
- Element type “property” must be followed by either attribute specifications, “>” or “/>”