简单说说TCP(5) --- RST

RST是什么

TCP首部组成如下图:

RST是TCP首部6个标志位之一,表示复位,用于非正常地关闭连接。

发送RST包关闭连接时,直接丢弃缓冲区的包发送RST包。而接收端收到RST包后,也不必发送ACK包来确认。

什么情况下会出现RST包

  1. GFW(Great Firewall of China,中国国家防火墙)
    GFW一旦发现数据包中有敏感信息,就会伪造RST数据包,分别发送给连接双方。

  2. 访问非LISTENING状态的端口
    A向B发起连接,但B之上并未监听相应的端口,这时B操作系统上的TCP处理程序会发RST包。

    注意:如果服务器的BACKLOG已满,客户端的SYN包只是被简单丢弃,客户端表现为连接超时,服务器并不会发RST包。

  3. 在请求超时后,又收到对方的包
    A创建socket,设置SO_RCVTIMEO选项为100ms,向B发送SYN包请求连接。B正常回复SYN-ACK包,但是A在接收到这个包时,已经超过了100ms的超时时间。此时,A会给B发送一个RST包。

  4. 当recv buffer还有数据时应用程序关闭连接
    A、B建立连接后,A发送5000字节的数据给B,但是B只读了4096字节,之后就调用closesocket(),此时,B会向A发送一个RST包。

  5. 在已关闭的socket上收到数据包
    A、B成功建立连接,通讯中,突然A断电,此时B并不知道。等A重新启动后,之前的连接信息都已丢失,当他接收到来自B的数据包时,他一脸懵逼,只能回复B一个RST包。

  6. NAT超时
    我们的设备大多数挂在NAT设备下,通讯双方一段时间没有数据交互后,NAT设备会切断链路。当再次向对方发送数据包时,会收到RST包。

    注意:中国移动2G、3G的NAT超时时间是5分钟,中国电信3G大于28分钟。

  7. SO_LINGER选项
    给socket设置该选项后,调用closesocket()时,会直接丢弃send buffer中未发完的数据,并向对方发送RST包关闭连接。

    • 优点
      • 节省资源,不需要繁琐的断开连接四次握手
      • 没有烦人的TIME_WAIT状态
    • 缺点
      • 由于会直接丢弃send buffer中的数据,可能造成业务逻辑错误
  8. Linux下启用TIME_WAIT快速回收
    修改/etc/sysctl.conf中内核参数:

    net.ipv4.tcp_tw_recycle = 1

    当收到的SYN包的timestamp比上次的小时,就会RST。

参考资料

http://blog.csdn.net/softwave/article/details/50997545
http://www.cnblogs.com/lulu/p/4149562.html
http://blog.csdn.net/wireless_tech/article/details/6405755

你可能感兴趣的:(tcp,rst)