TCP之异常关闭的意义
程序员文章站
2022-03-16 16:19:45
TCP之异常关闭的意义
终止一个连接的正常方式是发送FIN。在发送缓冲区中所有排队数据都已发送之后才发送FIN,正常情况下没有任何数据丢失。
但我们有时也有可能发送一个...
TCP之异常关闭的意义
终止一个连接的正常方式是发送FIN。在发送缓冲区中所有排队数据都已发送之后才发送FIN,正常情况下没有任何数据丢失。
但我们有时也有可能发送一个RST报文段而不是FIN来中途关闭一个连接。这称为异常关闭。
进程关闭socket的默认方式是正常关闭,如果需要异常关闭,利用SO_LINGER选项来控制。
异常关闭一个连接对应用程序来说有两个优点:
(1)丢弃任何待发的已经无意义的数据,并立即发送RST报文段;
(2)RST的接收方利用关闭方式来区分另一端执行的是异常关闭还是正常关闭。
值得注意的是RST报文段不会导致另一端产生任何响应,另一端根本不进行确认。收到RST的一方将终止该连接。程序行为如下:
阻塞模型下,内核无法主动通知应用层出错,只有应用层主动调用read()或者write()这样的IO系统调用时,内核才会利用出错来通知应用层对端RST。
非阻塞模型下,select或者epoll会返回sockfd可读,应用层对其进行读取时,read()会报错RST。
haproxy的实现中用到了这个选项。
推荐阅读
-
iOS 开发之 - 关闭键盘 退出键盘 的5种方式
-
在ASP.NET 2.0中操作数据之十八:在ASP.NET页面中处理BLL/DAL层的异常
-
C#程序异常关闭时的捕获
-
iOS 开发之 - 关闭键盘 退出键盘 的5种方式
-
在ASP.NET 2.0中操作数据之十八:在ASP.NET页面中处理BLL/DAL层的异常
-
Android开发技巧之永不关闭的Toast信息框(长时间显示而非系统关闭)
-
C#程序异常关闭时的捕获
-
Bootstrap modal 多弹窗之叠加关闭阴影遮罩问题的解决方法
-
Android开发技巧之永不关闭的Toast信息框(长时间显示而非系统关闭)
-
Oracle 9i 数据库异常关闭后的启动