相关索引:https://blog.csdn.net/knowledgebao/article/details/84626184


关于三次握手,四次挥手过程及状态变化,请参考https://blog.csdn.net/knowledgebao/article/details/84626238

关于TCP的接口,请参考:https://blog.csdn.net/knowledgebao/article/details/85384510


目录

产生RST的原因

1.  访问不存在的端口。

2. 异常终止连接。

3.处理半打开连接。

4.请求超时

5,keepalive 超时

6, TIME_WAIT 状态

RST攻击


产生RST的原因

1.  访问不存在的端口。

若端口不存,则直接返回RST,同时RST报文接收通告窗口大小为0.其实客户端向服务器的某个端口发起连接,如果端口被处于TIME_WAIT 状态的连接占用时,客户端也会收到RST。这种情况很常见。特别是服务器程序core dump之后重启之前连续出现RST的情况会经常发生。

2. 异常终止连接。

一方直接发送RST报文,表示异常终止连接。

  • 一旦发送方发送复位报文段,发送端所有排队等待发送的数据都被丢弃。应用程序可以通过socket选项SO_LINGER来发送RST复位报文。而接收端收到RST包后,不必发送ACK包来确认。
  • 接收方如果不接受完所有的数据,就关闭链接,底层TCP会给发送方返回一个RET报文,表示数据没有被完全接受,并且关闭里。参考文章3有Demo实现。

3.处理半打开连接。

一方关闭了连接,另一方却没有收到结束报文(如网络故障),此时另一方还维持着原来的连接。而一方即使重启,也没有该连接的任何信息。这种状态就叫做半打开连接。而此时另一方往处于半打开状态的连接写数据,则对方回应RST复位报文。此时会出现connect reset by peer错误。

4.请求超时

设置 connect_timeout,应用设置了连接超时,sync 未完成时超时了,会发送rst终止连接。

曾经遇到过这样一个情况:一个客户端连接服务器,connect返回-1并且error=EINPROGRESS。 直接telnet发现网络连接没有问题。ping没有出现丢包。用抓包工具查看,客户端是在收到服务器发出的SYN之后就莫名其妙的发送了RST。

比如像下面这样:

有89、27两台主机。主机89向主机27发送了一个SYN,表示希望连接8888端口,主机27回应了主机89一个SYN表示可以连接。但是主机27却很不友好,莫名其妙的发送了一个RST表示我不想连接你了。

后来经过排查发现,在主机89上的程序在建立了socket之后,用setsockopt的SO_RCVTIMEO选项设置了recv的超时时间为100ms。而我们看上面的抓包结果表示,从主机89发出SYN到接收SYN的时间多达110ms。(从15:01:27.799961到15:01:27.961886, 小数点之后的单位是微秒)。因此主机89上的程序认为接收超时,所以发送了RST拒绝进一步发送数据。

5,keepalive 超时

公网服务tcp keepalive 最好别打开;移动网络下会增加网络负担,切容易掉线;非移动网络核心ISP设备也不一定都支持keepalive,曾经也发现过广州那边有个核心节点就不支持。

6, TIME_WAIT 状态

  tw_recycle = 1 时,sync timestamps 比上次小时,会被rst。

RST攻击

服务器A和服务器B之间建立了TCP连接,此时服务器C伪造了一个TCP包发给B,使B异常的断开了与A之间的TCP连接,这就是RST攻击。
那么伪造什么样的TCP包可以达成目的呢?我们至顶向下的看:

  • 假定C伪装成A发过去的包,这个包如果是RST包的话,毫无疑问,B将会丢弃与A的缓冲区上所有数据,强制关掉连接;
  • 如果发过去的包是SYN包,B会表示A已经发疯了(与OS的实现有关),正常连接时又来建新连接,B主动向A发个RST包,并在自己这端强制关掉连接;

这两种方式都能够达到复位攻击的效果。似乎挺恐怖,然而关键是C如何能伪造成A发给B的包呢?这里有两个关键因素,源端口和序列号。

一个TCP连接都是四元组,由源IP+源端口、目标IP+目标端口唯一确定一个连接。所以,如果C要伪造A发给B的包,要在上面提到的IP头和TCP头,把源IP、源端口、目标IP、目标端口都填对。这里B作为服务器,IP和端口是公开的,A是我们要下手的目标,IP当然知道,但A的源端口就不清楚了,因为这可能是A随机生成的。当然,如果能够对常见的OS如windows和linux找出生成source port规律的话,还是可以搞定的。

此外,伪造的TCP包里需要填序列号(SeqNum),如果序列号的值不在A之前向B发送时B的滑动窗口内,B是会主动丢弃的。所以我们要找到能落到当时的AB间滑动窗口的序列号。这个可以暴力解决,因为一个sequence长度是32位,取值范围0-4294967296,如果滑动窗口大小为65535的话,则最多只需要发65537(4294967296/65535=65537)个包就能有一个序列号落到滑动窗口内。RST包是很小的,IP头+TCP头也才40字节,算算我们的带宽就知道这实在只需要几秒钟就能搞定。


参考文章:

1,https://blog.csdn.net/a_tu_/article/details/80389878

2,https://blog.csdn.net/hhgggggg/article/details/77678687

3,https://www.cnblogs.com/JohnABC/p/6323046.html

4,https://blog.csdn.net/ilozk/article/details/78667499


有任何问题,请联系:knowledgebao@163.com

TCP收到RST的几种情况相关推荐

  1. 服务器TCP握手超时的一种情况(服务器不回SYN ACK)

    近期遇到一个奇怪的问题,客户端到服务器的连接偶发超时,通过抓包,看到服务端收到了客户端的SYN包,但就是不回复SYN ACK,通过网上查找资料,详细原因如下: 服务器同时设置tcp_timestamp ...

  2. TCP/IP详解--接收RST回应的几种情况

    出现RST分节的情况可以在三种情况下发生,在连接建立时.在中间发送数据时.在连接关闭时. 连接建立时出现RST回应的情况有:发送一个不存在的端口,想一个Listen的套接字或者端口上发送数据分节(不是 ...

  3. tcp 出现rst情况整理

    正常情况tcp四层握手关闭连接,rst基本都是异常情况,整理如下: 1. GFW 2. 对方端口未打开,发生在连接建立 如果对方sync_backlog满了的话,sync简单被丢弃,表现为超时,而不会 ...

  4. 【博客278】TCP连接异常关闭的几种情况

    内容: 记录TCP连接异常关闭的几种情况 一.服务器进程异常终止: 服务进程提前终止了,系统进行进程善后处理:将所有打开的文件描述符关闭,这导致发送FIN给 客户端,客户端TCP响应ACK.客户端此时 ...

  5. 下面是以十六进制格式存储的一个 UDP 首部:~~~TCP连接使用1000字节的窗口值,而上一次的确认号是22001~~那么下一个报文段的序号是否就是 x + 1 呢?在本题中列出的 8 种情况下,画

    5-10 试说明运输层中伪首部的作用 用于计算运输层数据报校验和 5-11 某个应用进程使用运输层的用户数据报UDP,然而继续向下交给IP层后,又封装成IP数据报.既然都是数据报,可否跳过UDP而直接 ...

  6. TCP中的状态转移(三种情况)

    文章目录 前言 一. TCP的生命周期 二.另外两种挥手情况 三.经典四问 总结 前言 博主个人社区:开发与算法学习社区 博主个人主页:Killing Vibe的博客 欢迎大家加入,一起交流学习~~ ...

  7. TCP协议RST:RST介绍、什么时候发送RST包

    一.RST介绍 RST标示复位.用来异常的关闭连接. 1. 发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓冲区中的包,发送RST. 2. 而接收端收到RST包后,也不必发送ACK包来确 ...

  8. python SSL: CERTIFICATE_VERIFY_FAILED certificate has expired 证书错误的几种情况和解决方法

    文章目录 一.哪些情况可能会遇到这个错误? 二.为什么会出现这个错误?这个错误说明了什么? 2.1 HTTPS的简要知识 2.2 客户端是如何验证服务器证书的呢? 2.2.1 常见的证书错误有: 三. ...

  9. Linux数据链路tcp失败,TCP连接中的异常断开情况处理

    1.TCP连接中可能出现的异常断开情况 假设存在这样一种情况:在两个不同的主机Machine1.Machine2系统上分别运行两个应用程序Application1.Application2,在Appl ...

最新文章

  1. ubuntu安装Android SDK,adb,fastboot
  2. linux学习之shell基础篇
  3. 谈谈对搜索技术Elastic SearchLucene的理解
  4. Git 使用篇一:初步使用GitHub,下载安装git,并上传项目
  5. mysql操作常见问题_MySQL:常见使用问题
  6. IDM下载速度慢解决方案全网搜集持续更新
  7. 学习Python的几个必要条件,你具备吗?
  8. dataframe保存为txt_如何批量查找并修改替换 Word、PPT、Excel、PDF、TXT等文件的内容...
  9. 计算机组织与结构实验,计算机组织与结构实验报告 CQUPT
  10. 《人生不设限》力克的生命故事
  11. python socket文件传输
  12. PyTorch深度学习:60分钟入门(Translation)
  13. IDEA 忽略CSS错误
  14. 28.yii2 用户认证
  15. 【交换机在江湖】第十章 接口配置锦囊妙计之二----端口隔离
  16. 扁平化组织和层级化组织
  17. 如何将腾讯视频客户端下载的QLV视频格式转换成MP4格式
  18. 聊聊傅里叶变换的意义和定义
  19. opencv读取大恒相机
  20. 计算机f8键的功能,f8键有什么作用(图文)

热门文章

  1. ZEALER背后的乐视云视频
  2. OS 页面置换算法(OPT,FIFO,LRU)颠簸/抖动
  3. 【机器学习入门】(9) 逻辑回归算法:原理、精确率、召回率、实例应用(癌症病例预测)附python完整代码和数据集
  4. 手机上视频格式m3u8装换为mp4格式文件
  5. iconfont 点击更新代码,默认不生成.eot、.svg、base64格式 请到编辑项目中配置
  6. 前端遮罩层实现_jQuery 实现的遮罩层效果
  7. 航天信息将积极转型应对机遇
  8. 维语输入法uyhurqaapp v6.41.0
  9. 帝国cms手机和pc站数据同步建站教程
  10. Microsoft Store应用商城上架「正式版」苹果iCloud同步客户端