一直从事高性能高并发服务器研究
2013年(28)
分类: LINUX
2013-09-13 02:09:02
终止一个连接的正常方式是发送FIN。在发送缓冲区中所有排队数据都已发送之后才发送FIN,正常情况下没有任何数据丢失。
但我们有时也有可能发送一个RST报文段而不是FIN来中途关闭一个连接。这称为异常关闭。
进程关闭socket的默认方式是正常关闭,如果需要异常关闭,利用SO_LINGER选项来控制。
异常关闭一个连接对应用程序来说有两个优点:
(1)丢弃任何待发的已经无意义的数据,并立即发送RST报文段;
(2)RST的接收方利用关闭方式来区分另一端执行的是异常关闭还是正常关闭。
值得注意的是RST报文段不会导致另一端产生任何响应,另一端根本不进行确认。收到RST的一方将终止该连接。程序行为如下:
阻塞模型下,内核无法主动通知应用层出错,只有应用层主动调用read()或者write()这样的IO系统调用时,内核才会利用出错来通知应用层对端RST。
非阻塞模型下,select或者epoll会返回sockfd可读,应用层对其进行读取时,read()会报错RST。
haproxy的实现中用到了这个选项。