Linux 下TCP连接关闭情况分析
来源:互联网 发布:软件著作权办理时间 编辑:程序博客网 时间:2024/05/28 01:35
一、TCP连接关闭的几种方式:
1、“正常”关闭:调用close()关闭socket、没close但进程正常结束(当然这是不应该的做法)、进程core掉、在shell命令行中kill掉进程,都可抽象成“正常”关闭。因为即使core掉,内核也会马上帮应用程序回收(close)socket文件描述符。
“正常”关闭,默认情况下(非默认即设置Linger下面会介绍),关闭端即客户端TCP层会发FIN包,对端即服务器TCP层收到后,回ACK,客户端进入FIN_WAIT2状态。此时,TCP终止连接的4个分组中服务器应该发的第3个分组FIN包,其TCP层是不会主动发的,只有服务器端socket“正常”关闭,才会发出这个FIN包。至此,客户端进入TIME_WAIT状态。
2、“非”正常关闭:客户端崩溃了,此时肯定发不出FIN包了(当然啦,内核都没机会帮应用程序回收资源了)。这种情况,服务器端有如下两种情况:
A、服务器send数据,因为客户端已经崩溃,服务器收不到ACK自然会不停的重传。源自
Berkeley的重传机制,重传8次,相对第一次传的15分钟后仍没收到ACK,则返回
ETIMEDOUT或EHOSTUNREAC错误。如果服务器不理会这个错误,再次调用send,则
立马返回Broken Pipe错误。
注:15分钟超时可以在 /proc/sys/net/ipv4/tcp_retries2 中修改
B、 服务器不发任何数据了,那只有靠应用层心跳检测机制或Keepalive,来发觉TCP断连了。
二、SO_LINGER套接口选项
A、l_onoff设置为0,这也是默认情况,函数close()是立即返回的,然后TCP连接双方是通过
FIN、ACK4分组来终止TCP连接的。当然,发送缓冲区还有数据的话,系统将试着将这些数据
发送到对方。
B、l_onoff非0,l_linger设置0,函数close()立即返回,并发送RST终止连接,发送缓冲区的数据丢弃。
C、l_onoff非0,l_linger非0,函数close()不立即返回,而是在(a)发送缓冲区数据发送完并得到确认
(b)l_linger延迟时间到,l_linger时间单位为微妙。两者之一成立时返回。如果在发送缓冲区数据发送
完并被确认前延迟时间到的话,close返回EWOULDBLOCK(或EAGAIN)错误。
三、客户端TCP连接“正常”关闭,服务器的几种情况:
情形客户端l_onoff设置为0,“正常”关闭客户端l_onoff非0,l_linger设置0,“正常”关闭服务器阻塞模式send,正阻塞在send函数未返回客户端TCP发送FIN,服务器send函数返回成功(返回字节数是实际拷贝到发送缓冲区的字节数)。客户端发送RST。如果服务器再次调用send,将返回errno[32]:Broken pipe客户端TCP发送RST,服务器函数返回成功(返回字节数是实际拷贝到发送缓冲区的字节数)。若服务器再次调用send,则返回-1,errno[104]:Connection reset by peer。若再次调用send,则返回-1,errno[32]:Broken pipe服务器空闲客户端TCP发送FIN,若服务器没理会而调用send,客户端发送RST,send返回-1,errno[32]:Broken pipe客户端TCP发送RST,若服务器没理会而调用send,send返回-1,errno[104]:Connection reset by peer。若再次调用send,则返回-1,errno[32]:Broken pipe
总之,1、收到对端RST后,仍然调入send(),则返回Connection reset by peer,再次调用send(),则返回Broken pipe
2、收到对端FIN后,仍然调研哪个send(),直接返回Broken pipe
- Linux 下TCP连接关闭情况分析
- Linux 下TCP连接关闭情况分析
- Linux 下TCP连接关闭情况分析
- linux不重启服务的情况下关闭某条链路的tcp连接
- linux下查看TCP网络连接情况
- tcp连接中分组丢失情况分析
- linux下TCP连接
- TCP建立/关闭连接时握手过程中的状态情况
- TCP/IP详解--TCP中异常关闭连接的意义 异常关闭的情况
- TCP/IP详解--TCP中异常关闭连接的意义 异常关闭的情况
- 唯快不破:TCP/IP详解--TCP中异常关闭连接的意义 异常关闭的情况
- linux关闭tcp连接工具--killcx
- wcf 连接出错的情况下关闭连接。
- 一点细节 关于linux下tcp断开连接时的情况
- Linux下的TCP连接
- TCP连接的部分细节及边界情况分析
- TCP连接关闭时不发FIN包的奇怪行为分析
- TCP连接关闭总结
- oracle管理
- perl 模块列表
- WinpCap过滤串表达式的语法
- oracle字段拼接
- perl使用xml::simple来读写xml
- Linux 下TCP连接关闭情况分析
- oracle转义
- poj1125最短路模板
- Oracle中TO_DATE TO_CHAR格式
- 第十周实验报告2
- 一种优化的字符串排序 泛型算法
- 为指针分配和释放空间
- 第十周任务一(派生类的定义与应用)
- poj 3321 apple tree