我们在介绍TCP头的时候,提到过其中有个RST标志位。当一个TCP报文中这个标志位打开的时候,我们叫做reset包(严格的说应该叫做reset段,但是很多时候段包帧并不加以区分)或者简单称呼为reset、RST。通常reset的产生是由于一个异常包导致,reset一般会导致TCP连接的快速断开。产生reset的几种常见的情形如下

  1. 向一个未打开的端口发送连接请求

  2. 应用程序主动终止一个连接

  3. 应用程序还没有接收缓存中的数据,连接被提前关闭

  4. TWA(TIME-WAIT Assassination)

  5. 半开连接的情况下发送数据

注意我们这里是描述的reset产生的一些场景(而且是部分场景),在具体reset的产生原因上可能会有重复,比如第1、4、5都可以认为是对端没有打开相对应的TCP端口。

一、向一个未打开的端口发送连接请求

reset产生的一个常见的原因是,在一个未打开的端口发送连接请求。这里未打开的端口是指没有应用程序在监听这个端口等待连接。

如下图wireshark抓包,再不开启server情况下,没有应用程序监听9877端口,当client连接9877端口的时候就会产生reset消息。

注意我截图中的系列号,在这个截图中我设置了wireshark显示绝对系列号(前面文章截图显示的都是相对系列号),因为SYN包中的ACK标志没有置位,ack number字段无效(实际是以0填充的),所以在reset中的seq=0,ack则为SYN包中的seq+1(因为SYN标志和FIN标志在逻辑上占1byte)。一个reset包如果要被TCP endpoint接收,ACK标志必须置位且ack number落在有效的窗口区间内(窗口相关知识后面细讲)。这帮助阻止了一个简单的reset攻击(RFC5961),否则攻击者可以通过伪造源IP地址、源端口号构造一个reset消息来中断TCP连接。

二、应用程序主动通过reset消息终止一个连接

应用程序可以通过socket API接口设置主动reset一个TCP连接,这种情况下的连接中断过程称为abortive release。之前我们介绍过的四次挥手之类的通过FIN终止连接的过程我们称呼为orderly release。在abortive release情况下,reset包的发送端缓存的待发送数据都会直接丢弃,接收端接收到reset后也可以知道是对端主动abort了这个tcp连接。

wireshark截图如下,注意client发送reset后,并不会引起server回应ACK之类的消息。

可以看到RST消息的seq正好是对端期望接收的seq,按照RFC5961要求,非SYN_SENT状态下,接收端需要判断RST消息的系列号seq为正好为自己期望接收的seq,才会认为这个RST消息有效。如果RST的系列号seq落在接收窗口内但不是期望的seq时候,接收端需要发送challenge ACK,如果落在接收窗口外则会直接丢弃这个RST消息。(实际上challenge ACK也会引起RST,详见RFC5961,此处不做介绍。)

三、应用层还没有读取完接收缓存中的数据,连接被提前关闭

当TCP接收端缓存中还有缓存数据而没有被应用层接收,但是应用层直接关闭TCP连接时候就会产生reset,如下图wireshark抓包所示,连接建立后client向server发送10bytes的数据,server应用层并没有读取这10bytes的数据而是直接关闭tcp连接就会产生reset。

四、TWA(TIME-WAIT Assassination)

TCP在TIME-WAIT状态下的时候,如果接收到reset包,它可能会提前结束TIME-WAIT状态,这种行为即叫做TIME-WAIT Assassination(TWA),数据包的流程如下图所示

为了避免TIME-WAIT状态提前被reset结束,一些系统的TCP实现在TIME-WAIT状态下不会响应rst消息。linux则可以通过net.ipv4.tcp_rfc1337设置TCP在TIME-WAIT下是否响应reset,如果设置tcp_rfc1337为0,在TIME-WAIT下如果接收到reset则会直接关闭tcp连接,而不会等到2MSL超时。

五、半开连接的情况下发送数据

关于半开连接我们前面已经进行了介绍,同时wireshark抓包中也有对应的reset的展示,此处不再介绍。

TCP系列09—连接管理—8、TCP Reset的更多相关文章

  1. TCP系列08—连接管理—7、TCP 常见选项(option)

    一.TCP选项概述 在前面介绍TCP头的时候,我们说过tcp基本头下面可以带有tcp选项,其中有些选项只能在连接过程中随着SYN包发送,有些可以延后.下表汇总了一些tcp选项 其中我标记为红色的部分是 ...

  2. TCP系列07—连接管理—6、TCP连接管理的状态机

            经过前面对TCP连接管理的介绍,我们本小节通过TCP连接管理的状态机来总结一下看看TCP连接的状态变化 一.TCP状态机整体状态转换图(截取自第二版TCPIP详解) 二.TCP连接建立 ...

  3. TCP系列05—连接管理—4、TCP连接的ISN、连接建立超时及TCP的长短连接

    一.TCP连接的ISN         之前我们说过初始建立TCP连接的时候的系列号(ISN)是随机选择的,那么这个系列号为什么不采用一个固定的值呢?主要有两方面的原因 防止同一个连接的不同实例(di ...

  4. TCP系列02—连接管理—1、三次握手与四次挥手

    一.TCP连接管理概述 正如我们在之前所说TCP是一个面向连接的通信协议,因此在进行数据传输前一般需要先建立连接(TFO除外),因此我们首先来介绍TCP的连接管理. 通常一次完整的TCP数据传输一般包 ...

  5. TCP系列03—连接管理—2、TCP连接的同时打开和同时关闭

    在前面的内容中我们介绍了TCP连接管理中最常见的三次握手方式和四次挥手的方式.但是有可能A和B两端同时执行主动打开并连接对方或者同时执行主动关闭连接(尽管发生这种情况的可能性比较低低),这个时候的流程 ...

  6. TCP系列04—连接管理—3、TCP连接的半打开和半关闭

    在前面部分我们我们分别介绍了三次握手.四次挥手.同时打开和同时关闭,TCP连接还有两种场景分别是半打开(Half-Open)连接和半关闭(Half-Close)连接.TCP是一个全双工(Full-Du ...

  7. TCP系列06—连接管理—5、TCP fastopen(TFO)

    一.TFO背景 当前web和web-like应用中一般都是在三次握手后开始数据传输,相比于UDP,多了一个RTT的时延,即使当前很多应用使用长连接来处理这种情况,但是仍然由一定比例的短连接,这额外多出 ...

  8. TCP系列10—连接管理—9、syncookie、fastopen与backlog

    这部分内容涉及较多linux实现,可以跳过. 一.listen系统调用对backlog的处理 当socket处于LISTEN或者CLOSED状态时,fastopen队列的长度可以通过TCP_FASTO ...

  9. TCP的运输连接管理

    TCP的运输连接管理 TCP是面向连接的协议,有三个阶段:连接建立.数据传送 和 连接释放.运输连接的管理就是使运输连接的简历和释放都能正常地进行. 在TCP连接建立过程中要解决一下三个问题: 1.  ...

随机推荐

  1. oracle 用户尝试登录失败锁定策略及修改

    -- 修改密码的有效期策略, 永不过期SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;Profile altered ...

  2. STM32(12)——CAN

    简介: CAN是Controller Area Network,是 ISO 国际标准化的串行通信协议. CAN  控制器根据两根线上的电位差来判断总线电平.总线电平分为显性电平和隐性电平,二者必居其一 ...

  3. Python学习1——关于变量

    在python中,使用变量之前不需要声明变量的数据类型, 但是,使用变量前,必须要先对变量进行赋值: 例: num01 += 100 print('num01') 上述例子中,表示的意思是 num01 ...

  4. SAP Odata実行命令(1)

    $count $Orderby:desc/asc ※$Orderby=ソートする項目 desc降順/asc昇順 を指定すること $Filter: $Skip,Top and Inline count: ...

  5. 【commons】字符串工具类——commons-lang3之StringUtils

    类似工具见Hutool-StrUtil 一.起步 引入maven依赖 <!-- https://mvnrepository.com/artifact/org.apache.commons/com ...

  6. 成都Uber优步司机奖励政策(2月26日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  7. CF 1042 F. Leaf Sets

    F. Leaf Sets http://codeforces.com/contest/1042/problem/F 题意: 将所有的叶子节点分配到尽量少的集合,一个可行的集合中两两叶子节点的距离< ...

  8. Centos7 下安装以及使用mssql

    Centos7下安装以及使用Mssql,在这下面玩,主要是发现linux环境下的mysql非常的小,小到只有169M,这在windows上面,动撤几个G的安装文件,会让你直接打消使用MSSQL的勇气, ...

  9. 使用navicat连接Mysql8.0出现2059错误

    一. 进入MySQL,打开要用navicat连接的数据库 二.打开运行以下代码: ALTER USER 'root'@'localhost' IDENTIFIED BY '你的mysql密码' PAS ...

  10. 深入解析UUID及其应用(转载)

    UUID 编辑 UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Founda ...