Chinaunix首页 | 论坛 | 博客
  • 博客访问: 35122
  • 博文数量: 31
  • 博客积分: 652
  • 博客等级: 上士
  • 技术积分: 245
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-05 17:16
文章分类

全部博文(31)

文章存档

2013年(1)

2012年(2)

2011年(28)

最近访客

分类: LINUX

2011-04-25 18:58:41

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结束连接。
[转自:]
阅读(1045) | 评论(0) | 转发(0) |
0

上一篇:一个不错的shell 脚本教程

下一篇:没有了

给主人留下些什么吧!~~