socket链接的关闭close和shutdown的区别_TIME_WAIT和CLOSE_WAIT什么时刻出现_如何处理
2015-04-12 13:51
856 查看
TCP主动关闭连接'target='_blank'>http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201181410222775/
[code]TCP主动关闭连接TCP主动关闭连接'target='_blank'>http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201181410222775/
appl:close(),-->FINFIN_WAIT_1//主动关闭socket方,调用close关闭socket,发FIN
<--ACKFIN_WAIT_2//对方操作系统的TCP层,给ACK响应。然后给FIN
<--FIN
-->ACK"TIME_WAIT"--2MSLtimeout-->CLOSED
//TIME_WAIT,防止ACK没有给到对方。
注意:close时,如果TCP发送队列中还有数据,那么将会发送RST包而不是FIN包。
另外:对于Linux下来说,无论是FIN还是RST,应用层read将会返回0,可以认为对方请求关闭链接,调用close关闭fd即可。
TCP被动关闭连接
<--FIN"CLOSE_WAIT"//被动方,收到对方的FIN,处于CLOSE_WAIT状态
-->ACK//被动方的TCP层,给ACK响应
appl:close(),-->FINLAST_ACK
//被动方调用close,从CLOSE_WAIT转到LAST_ACK
不调close,将一直在CLOSE_WAIT状态。
<--ACK-->CLOSED
tcp是全双工::
close()会关闭读写。
shutdown()可以选择性的关闭读、写或读写。
主动关系SOCKET链接的一方,会进入TIME_WAIT(作用是防止最后一个ACK包丢失)
TIME_WAIT的时间会非常长,因此server尽量减少主动关闭连接。
close和shutdown的区别:
intclose(intsockfd);
close(fd)调用会将描述字的引用计数减1,只有当socket描述符的引用计数为0时,才关闭socket,即发送FIN包,因此,在fork()模式中,父进程在accept()返回后,fork()子进程,由子进程处理connfd,而父进程将close(connfd);由于connfd这个socket描述符的引用计数不为0,因此并不引发FIN,所以就没有关闭和客户端的连接。
intshutdown(intsockfd,inthowto);
//howto:SHUT_RD,SHUT_WR,SHUT_RDWR
shutdown()则不管socket描述符的引用计数,而直接发生FIN,因此会直接关闭链接。
shutdown()可控制read/write两个方向的管道。
SHUT_RDshutdown(sockfd,SHUT_RD);后,来自对端的数据都被确认,然后悄然丢弃。
SHUT_WRhalfclose状态。
close()引发的4次交互:(这里的close是client发起的)
clientserver
FIN_WAIT_1----FINM------>
//(Server端操作系统的TCP层(网络协议栈)响应ACK包)
FIN_WAIT_2<----ACKM+1----CLOSE_WAIT
//(这里必须调用close,才能从CLOSE_WAIT到LAST_ACK)
TIME_WAIT<------FINN-----LAST_ACK
//(TIME_WAIT有一个重要的作用就是防止最后一个ACK丢失)
-------ACKN+1---->CLOSE
TIME_WAIT是主动关闭链接时形成的,等待2MSL时间,约4分钟。
主要是防止最后一个ACK丢失。由于time_wait的时间会非常长,因此server端应尽量减少主动关闭连接
CLOSE_WAIT是被动关闭链接是形成的,
按状态机,我方收到FIN,则由TCP实现发送ACK,因此进入CLOSE_WAIT状态。
但如果我方不执行close(),就不能由CLOSE_WAIT迁移到LAST_ACK,则系统中会存在很多CLOSE_WAIT状态的连接。
此时,可能是系统忙于处理读、写操作,而未将已收到FIN的连接,进行close。此时,recv/read已收到FIN的连接socket,会返回0。
大量TIME_WAIT和CLOSE_WAIT的存在,会产生怎样的影响?
内核维护更多的状态。收到ip包,做hash运算,hlist冲突的概率更大。
相关文章推荐
- socket链接的关闭close和shutdown的区别,TIME_WAIT和CLOSE_WAIT什么时刻出现,如何处理
- socket链接的关闭close和shutdown的区别_TIME_WAIT和CLOSE_WAIT什么时刻出现_如何处理
- 关闭socket链接过程中的TCP状态:TIME_WAIT状态(开启地址重用),CLOSE_WAIT状态
- socket关闭的close和shutdown区别
- socket关闭的close和shutdown区别
- socket关闭的close和shutdown区别
- socket半关闭 shutdown close 区别
- close与shutdown关闭socket连接的区别
- socket关闭close和shutdown的区别
- 用于关闭socket 的close 和shutdown 区别
- 当出现大量timewait状态的连接时,该如何处理?
- socket关闭的close和shutdown区别
- socket关闭的close和shutdown区别[转]
- socket编程——关闭(shutdown 和 close的区别)
- 网络编程:优雅关闭socket/TIME_WAIT/CLOSE_WAIT/SoLinger
- socket关闭close和shutdown区别
- socket编程——关闭(shutdown 和 close的区别)
- socket关闭的close和shutdown区别
- socket关闭的close和shutdown区别
- Socket 编程中 close() 和 shutdown() 有什么区别?