TCP reset发送时机

  1. close的时候检查接收缓冲区是否有数据未读(不包括FIN包),如果有数据未读,并且SO_LINGER 时间为0,那么会发送reset包,而不是fin包。

  2. 当进程被直接kill时,会向对端发送reset包。

  3. 当接收到一个未曾建立连接的数据包时,会直接返回reset包。

  4. 尝试连接一个不存在的端口时候

当TCP连接的对端进程已经关闭了Socket的情况下,本端进程再发送数据时,第一包可以发送成功(但会导致对端发送一个RST包过来):
之后如果再继续发送数据会失败,错误码为“10053: An established connection was aborted by the software in your host machine”(Windows下)或“32: Broken pipe,同时收到SIGPIPE信号”(Linux下)错误;
之后如果接收数据,则Windows下会报10053的错误,而Linux下则收到正常关闭消息

如果可以从源码层面讲解下,会更好
http://blog.csdn.net/justlinux2010/article/details/20913755
上面的文章有分析到close的源码,可以看下什么时候发送reset

下面两篇文章有讲到一些问题。
http://lovestblog.cn/blog/2014/05/20/tcp-broken-pipe/

http://jeffchen.sinaapp.com/?p=776

标签: none

添加新评论