本文正在参与 “网络协议必知必会”征文活动
首先需要简单介绍下tcp原理。
首先先看一下tcp的组成结构。
序列号为客户端成功发送的数据位数,确认号为服务端端成功接收的数据位数,SYN标志位和FIN标志位也要占1位。
状态位用来维护连接的状态,带状态位的包发送出去,会改变连接的状态。如SYN表示发起一个连接,sck是回复,rst是重新连接,fin是结束连接等。
窗口大小,tcp是通过滑动窗口协议控制进行流量控制的。为防止发送数据过多导致接收方无法处理过多数据,tcp会按照滑动窗口的大小发送合适数量的信息。发送信息数目,等于滑动窗口大小减去已发送和已接受的数据差。
正常来说,我们通过三次握手建立连接,通过四次挥手断开连接。其中,四次挥手会发送FIN标示位,它不是立即发送,而是将包放到缓冲区,等缓冲区内容发完了再发送挥手包。
但是如果状态位中的rst状态为1,即异常关闭,发送方直接发送rst包,且丢掉换冲突的缓存。接收方收到一个异常关闭的包,那么接收方也不必等待缓冲区的包都发出去,直接触发connect reset by peer错误。
发送rst包正常的常见情况为:
-
建立连接的syn到达某端口,但是端口没有正在监听的服务,此时回回复一个rst
-
tcp想取消一个已有的连接
-
tcp接收到一个根本不存在的连接
常见的rst攻击形式有两种:
-
模拟客户端重复发送syn包,这时服务端会认为客户端出问题了,返回rst包
-
模拟客户端直接发送rst包,服务端接收到rst包,直接关闭连接
rst攻击的一个要点是需要找对上面提到的序列号,这个通常可以通过暴力解决,因为序列号范围有限。