TCP首部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。

 

posted @ 2018-08-14 16:51  假程序猿  阅读(427)  评论(0)    收藏  举报