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

Loopback-家里事家里了

为了检测一个socket服务是否正常运转,我们可以通过抓包的方式来验证,比如通过下面来抓包验证端口12345是否正常通信。

tcpdump -nn port 12345

监听开始后,通过telnet本端口,即可看到通信包。

- 阅读剩余部分 -

管好你的服务器之防火墙篇

要管好你的服务器,装个防火墙是必须的。所谓防火墙,其实就是网络包过滤功能,在linux中由netfilteriptables组成。netfilter是内核的一部分,由一些包过滤规则表组成。内核会通过这些规则表来对流入和流出的包进行过滤和处理。iptables运行于用户空间,可以修改netfilter的过滤规则表,从而实现对网络包的流向控制。因此,iptables就是linux防火墙的关键部分了,咱们就来看看它的使用方法。

- 阅读剩余部分 -