这些并非臆造出来的问题,而是实际会开发遇到的问题。对于一个健壮的网络服务器,应该考虑如何处理连接异常。
一、半开连接
TCP的半开连接是指TCP连接的一端异常崩溃,或者在未通知对端的情况下关闭连接,这种情况下不可以正常收发数据,否则会产生RST。比如一个常见的情况是TCP连接的一端异常断电,就会导致TCP的半开连接。如果没有数据传输,对端就不会知道本端的异常而一直处于ESTABLISHED状态(TCP有存活检测机制,后面内容我们会进行介绍)。
二、半关连接
当TCP连接中A发送FIN请求关闭,B端回应ACK后(A端进入FIN_WAIT_2状态),如果B没有立即发送FIN给A时,A方处在半连接状态,此时A可以接收B发送的数据,但是A已不能再向B发送数据。
如下图所示,在红色背景文本框标注的数据传输场景下就是TCP的半关连接:
从程序的角度,可以使用API来控制实现半连接状态。
```c
include
int shutdown(int sockfd, int how);
sockfd: 需要关闭的socket的描述符
how: 允许为shutdown操作选择以下几种方式:
SHUT_RD(0): 关闭sockfd上的读功能,此选项将不允许sockfd进行读操作。