简单说说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
    • 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值