Linux上TCP的shutdown/close(备忘)
Linux上TCP的shutdown/close(备忘)
Linux的版本是kernel-2.6.21:
1,只要TCP栈的读缓冲里还有未读取(read)数据,则调用close时会直接向对端发送RST。
2,shutdown与socket描述符没有关系,即使调用shutdown(fd, SHUT_RDWR)也不会关闭fd,最终还需close(fd)。
3,可以认为shutdown(fd, SHUT_RD)是空操作,因为shutdown后还可以继续从该socket读取数据,这点也许还需要进 一步证实。
4,在已发送FIN包后write该socket描述符会引发EPIPE/SIGPIPE。
5,当有多个socket描述符指向同一socket对象时,调用close时首先会递减该对象的引用计数,计数为0时才会发送FIN包结束TCP连接。 shutdown不同,只要以SHUT_WR/SHUT_RDWR方式调用即发送FIN包。
6,SO_LINGER与close,当SO_LINGER选项开启但超时值为0时,调用close直接发送RST(这样可以避免进入TIME_WAIT 状态,但破坏了TCP协议的正常工作方式),SO_LINGER对shutdown无影响。
7,TCP连接上出现RST与随后可能的TIME_WAIT状态没有直接关系,主动发FIN包方必然会进入TIME_WAIT状态,除非不发送FIN而直 接以发送RST结束连接。
创建于: 2007-07-10 18:51:09,修改于: 2007-07-10 18:51:09,已浏览806次,有评论3条
网友评论
网友:本站网友 时 间:2007-07-22 15:16:24 IP地址:218.247.216.★
再补充一条:
TCP半关闭状态只是在shutdown后有效,而使用close关闭连接后,对端向本端发送数据会造成本断发送RST。
网友:西邮 时 间:2007-11-28 15:22:49 IP地址:123.138.241.★
第3条不同意。man手册里这么说:“If how is SHUT_RD, further receptions will be disallowed.”如果是空操作的话,这个是实现不了的。
网友:本站网友 时 间:2007-11-28 16:17:48 IP地址:218.247.216.★
你可以实验看看,我看2.6.21代码的时候没发现有任何对SHUT_RD的处理.
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。