TCP系列09—连接管理—8、TCP Reset
我们在介绍TCP头的时候,提到过其中有个RST标志位。当一个TCP报文中这个标志位打开的时候,我们叫做reset包(严格的说应该叫做reset段,但是很多时候段包帧并不加以区分)或者简单称呼为reset、RST。通常reset的产生是由于一个异常包导致,reset一般会导致TCP连接的快速断开。产生reset的几种常见的情形如下
-
向一个未打开的端口发送连接请求
应用程序主动终止一个连接
应用程序还没有接收缓存中的数据,连接被提前关闭
TWA(TIME-WAIT Assassination)
半开连接的情况下发送数据
注意我们这里是描述的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的更多相关文章
- TCP系列08—连接管理—7、TCP 常见选项(option)
一.TCP选项概述 在前面介绍TCP头的时候,我们说过tcp基本头下面可以带有tcp选项,其中有些选项只能在连接过程中随着SYN包发送,有些可以延后.下表汇总了一些tcp选项 其中我标记为红色的部分是 ...
- TCP系列07—连接管理—6、TCP连接管理的状态机
经过前面对TCP连接管理的介绍,我们本小节通过TCP连接管理的状态机来总结一下看看TCP连接的状态变化 一.TCP状态机整体状态转换图(截取自第二版TCPIP详解) 二.TCP连接建立 ...
- TCP系列05—连接管理—4、TCP连接的ISN、连接建立超时及TCP的长短连接
一.TCP连接的ISN 之前我们说过初始建立TCP连接的时候的系列号(ISN)是随机选择的,那么这个系列号为什么不采用一个固定的值呢?主要有两方面的原因 防止同一个连接的不同实例(di ...
- TCP系列02—连接管理—1、三次握手与四次挥手
一.TCP连接管理概述 正如我们在之前所说TCP是一个面向连接的通信协议,因此在进行数据传输前一般需要先建立连接(TFO除外),因此我们首先来介绍TCP的连接管理. 通常一次完整的TCP数据传输一般包 ...
- TCP系列03—连接管理—2、TCP连接的同时打开和同时关闭
在前面的内容中我们介绍了TCP连接管理中最常见的三次握手方式和四次挥手的方式.但是有可能A和B两端同时执行主动打开并连接对方或者同时执行主动关闭连接(尽管发生这种情况的可能性比较低低),这个时候的流程 ...
- TCP系列04—连接管理—3、TCP连接的半打开和半关闭
在前面部分我们我们分别介绍了三次握手.四次挥手.同时打开和同时关闭,TCP连接还有两种场景分别是半打开(Half-Open)连接和半关闭(Half-Close)连接.TCP是一个全双工(Full-Du ...
- TCP系列06—连接管理—5、TCP fastopen(TFO)
一.TFO背景 当前web和web-like应用中一般都是在三次握手后开始数据传输,相比于UDP,多了一个RTT的时延,即使当前很多应用使用长连接来处理这种情况,但是仍然由一定比例的短连接,这额外多出 ...
- TCP系列10—连接管理—9、syncookie、fastopen与backlog
这部分内容涉及较多linux实现,可以跳过. 一.listen系统调用对backlog的处理 当socket处于LISTEN或者CLOSED状态时,fastopen队列的长度可以通过TCP_FASTO ...
- TCP的运输连接管理
TCP的运输连接管理 TCP是面向连接的协议,有三个阶段:连接建立.数据传送 和 连接释放.运输连接的管理就是使运输连接的简历和释放都能正常地进行. 在TCP连接建立过程中要解决一下三个问题: 1. ...
随机推荐
- 闰年相关的问题v3.0——计算有多少闰年
# include<stdio.h>int main(){ int a,b,i; int sum = 0; printf("Input your birth year:" ...
- Struts2获取Servlet的api的两种方式,解决ParameterAware过时的问题
servlet API通过ActionContext进行获取 Struts2对HttpServletRequest,HttpSession和ServletContext进行了封装,构造了3个Map对象 ...
- 修改注册表删除Windows资源管理器 “通过QQ发送” 右键菜单项
运行regedit 展开至:HKEY_CLASSES_ROOT\AllFilesystemObjects\shellex\ContextMenuHandlers 删除QQShellExt项
- Java——final代码块是否一定被执行---18.11.08
辨析:final语句块一定会被执行吗? 答案是 不一定!!! 至少有两种情况下finally语句是不会被执行的: (1)try语句没有被执行到,如在try语句之前return就返回了,这样final语 ...
- 广州Uber优步司机奖励政策(1月4日~1月10日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- Mac brew安装redis
1.安装redis $ brew install redis Error:Failed to download resource "reds" // 下载reds失败 不过不需要 ...
- 深入解析UUID及其应用(转载)
UUID 编辑 UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Founda ...
- SQLite FTS3/FTS4与一些使用心得
此文已由作者王攀授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 简介 对于今天的移动.桌面客户端应用而言,离线全文检索的需求已经十分强烈,我们日常使用的邮件客户端.云音乐.云 ...
- Monkey用真机做测试的步骤
1 必备条件 1) 手机需要先获取root权限: 2) 手机和电脑相连(电脑可以访问手机里面的文件) 2 操作步骤 1) 使用adb devices 命令查看电脑手机是否相连: 下图表示手机已连上电 ...
- FU-A方式分包
当 NALU 的长度超过 MTU 时, 就必须对 NALU 单元进行分片封包. 也称为 Fragmentation Units (FUs). 0 1 2 3 0 1 2 3 4 5 6 7 8 9 ...