半关闭状态
一次TCP四次挥手的过程如上图所示。设左侧为客户端,右侧为服务端,当客户端发起FIN而关闭其写通道时(对应服务端读通道),服务端进入close_wait状态,但希望推送完所有数据后再关闭整个连接。此时连接处于半关闭状态,客户端只能读,服务端只能写。
待服务端发送完所有数据并发送一个FIN后,客户端响应ACK,服务端收到ACK后知道客户端收到了所有数据,此时才能关闭服务端的写通道。
实现方法
客户端:调用shutdown(SHUT_WR) 发送⼀个 FIN 包,并且标记该 socket 为 SEND_SHUTDOWN;
服务端:收到 FIN 包并标记该 socket 为RCV_SHUTDOWN;此时就进入半关闭状态;
如果使用epoll实现,若⼀个Socket同时标记为 SEND_SHUTDOWN 和 RCV_SHUTDOWN;那么会触发 EPOLLHUP
事件;
如果⼀个Socket被标记为 RCV_SHUTDOWN;那么会触发 EPOLLRDHUP
事件。
tcp-keepalive
tcp-keepalive 是在TCP传输层实现的探活机制,与应用层无关,因此应用程序无法介入。这也是为什么应