RST是什么
TCP首部组成如下图:
RST是TCP首部6个标志位之一,表示复位,用于非正常地关闭连接。
发送RST包关闭连接时,直接丢弃缓冲区的包发送RST包。而接收端收到RST包后,也不必发送ACK包来确认。
什么情况下会出现RST包
GFW(Great Firewall of China,中国国家防火墙)
GFW一旦发现数据包中有敏感信息,就会伪造RST数据包,分别发送给连接双方。访问非LISTENING状态的端口
A向B发起连接,但B之上并未监听相应的端口,这时B操作系统上的TCP处理程序会发RST包。注意:如果服务器的BACKLOG已满,客户端的SYN包只是被简单丢弃,客户端表现为连接超时,服务器并不会发RST包。
在请求超时后,又收到对方的包
A创建socket,设置SO_RCVTIMEO选项为100ms,向B发送SYN包请求连接。B正常回复SYN-ACK包,但是A在接收到这个包时,已经超过了100ms的超时时间。此时,A会给B发送一个RST包。当recv buffer还有数据时应用程序关闭连接
A、B建立连接后,A发送5000字节的数据给B,但是B只读了4096字节,之后就调用closesocket()
,此时,B会向A发送一个RST包。在已关闭的socket上收到数据包
A、B成功建立连接,通讯中,突然A断电,此时B并不知道。等A重新启动后,之前的连接信息都已丢失,当他接收到来自B的数据包时,他一脸懵逼,只能回复B一个RST包。NAT超时
我们的设备大多数挂在NAT设备下,通讯双方一段时间没有数据交互后,NAT设备会切断链路。当再次向对方发送数据包时,会收到RST包。注意:中国移动2G、3G的NAT超时时间是5分钟,中国电信3G大于28分钟。
SO_LINGER选项
给socket设置该选项后,调用closesocket()
时,会直接丢弃send buffer中未发完的数据,并向对方发送RST包关闭连接。- 优点
- 节省资源,不需要繁琐的断开连接四次握手
- 没有烦人的TIME_WAIT状态
- 缺点
- 由于会直接丢弃send buffer中的数据,可能造成业务逻辑错误
- 优点
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