TCP报文头(首部)详解
本篇文章基于 RFC 9293: Transmission Control Protocol (TCP) 对TCP报头进行讲解,部分内容会与旧版本有些许区别。
TCP协议传输的数据单元是报文段,一个报文段由TCP首部(报文头)和TCP数据两部分组成,其中TCP首部尤其重要,首部用于控制(新建、断开)连接、流量和拥塞等。TCP首部的固定长度是20B,最大长度是60B,其中可变选项长度最长为40B(4B×10)。
字段解释:
- 源端口(Source Port):占用 2 Byte,标识发送方应用程序使用的端口号;
- 目的端口(Destination Port):占用 2 Byte,标识发送方应用程序的目标端口号,也就是接收方应用程序的端口号;
- 序号(Seq,Sequence Number):占用 4 Byte,范围是[0, 2^32),标识TCP报文段中的第一个字节数据的序列号,用于保证传输数据的可靠性和顺序性。TCP是一个面向字节流的传输控制协议,且支持全双工通信,所以为了保证发送方和接收方都能独立进行传输,两端通信时都必须得知道各自分别发送和接收了多少个字节数据(不含TCP首部),以及接收到数据后如何进行读取、拼接组合。TCP发送方用Seq字段告知接收方自建立连接以来我方已累计(不包含本报文段)已发送了Seq-1个字节数据,本次传输的报文数据第一个字节序列号是Seq,而接收方在成功接收完一段或多段数据后可以根据Seq的大小顺序对数据进行拼接组合,并且用Ack字段告知发送方我方已成功接收了Ack-1个字节数据,期望下次接收的报文段是从Ack序号开始。【为什么都要减1呢?因为TCP成功建立连接后Seq和Ack都会置为1,所以Seq和Ack的起始值都是1。第N次发送数据时的 Seq = Seq初始值1 + 第1次发送的字节长度 + ··· + 第N-1次发送的数据字节长度,也就是第N次发送数据时的 Seq = 第N-1次发送数据时的 Seq + 第N-1次发送的数据字节长度】。请注意,TCP建立连接和断开连接时Seq和Ack跟TCP报文数据长度无关。当Seq到达2^32-1(4GB内容.....)后又会从0重新开始。
- 确认号(Ack,Acknowledgment Number):占用 4 Byte,标识接收方期望收到下一个报文段的序列号是Ack,也可以理解成接收方已成功接收了Ack-1个字节数据。只有标志位ACK为1时确认号才有效。接收方在成功接收完数据后需要给发送方一个确认,告诉发送方已收到某个报文段(事实上,接收方往往是在成功接收了多条报文段后才发送一次Ack)。
- 数据偏移(Data Offset):占用 4 bit,标识TCP报文段中报文数据的起始位置距离报文段开始位置有多远,也就是TCP的首部长度是多少,单位是32bit(4字节)。从下图可以看到TCP首部长度 Header Length 为 0101,转换成十进制是5,4Byte × 5 = 20 Byte。而TCP首部固定长度是20Byte,可变长度是40 Byte,最长是60 Byte,所以数据偏移值最小是5,最大是15,[0101, 1111]。
- 保留(Reserved):占用 3 bit,预留给未来使用的一组控制位,目前该值设置为0。TCP首部的数据偏移(首部长度)、保留位和标志位公用16 bit,也就是2 byte,其中数据偏移独占4 bit,保留位和标志位一共可分配12 bit,如果我们把保留位Reserved也当成一个预留的或空白的标志位,那么完全可以理解成TCP最多可分配12个标志位,目前(rfc9293版)已明确的标志位共有8个,还有1个处于实验阶段的标志位AE,一共是9个标志位,每个标志位占用1 bit,剩余的3 bit由Reserved占用。
- 标志位(Flags):也叫控制位,每一个标志位占用 1 bit。目前已有9个标志位,包括AE、CWR、ECE、URG、ACK、PSH、RST、SYN和FIN,值为0或1,用于控制TCP的拥塞、连接的建立、管理和关闭等。
- AE(Accurate ECN):处于试验期的标志位。外文资料也比较少,看了半天也不知道是用来干嘛的,暂且搁置吧。
- CWR(Congestion Window Reduce):拥塞窗口减半标志,发送端通过降低“cwnd”和“ssthresh”来应对网络拥塞。CWR和ECE都是用来控制网络拥塞的,而CWR是用来响应ECE的,所以在了解CWR作用之前,我们得先搞懂ECE是用来干嘛的。Explicit Congestion Notification,翻译过来就是“显式拥塞通知”,简写ECN。数据报在发送方发出后可能要经过多个路由器才能到达接收方,如果中间某个路由器根据算法结果判断出自身发生了拥塞,就会在报文的IP首部设置CE标志(ECE),接收方在接收到这段报文后,发现IP头设置了CE标志,表明数据发送途中网络有拥塞,得赶紧把这个消息告诉发送方,不然可能要丢包。接收方在后续返回给发送方的每一条ACK报文都会设置ECN-Echo(ECE)为1,用于告知发送方从贵方到我方的网络有拥塞。而发送方在接收到对方返回的ECE报文后,得知网络有拥塞,就会将拥塞窗口“cwnd”减半,并降低慢启动阈值“ssthresh”,之后再发送CWR报文给接收方,接收方收到CWR报文后表明发送方也采取相应措施来应对网络拥塞,随后便不再发送ECE报文。请注意,数据重传时,TCP报头中不会设置CWR标志位。
- ECE(ECN-Echo):用于通知对方,从对方到我方的网络有拥塞。如果发送方收到ECN-Echo (ECE) ACK包(即TCP报头中设置了ECN-Echo标志的ACK包),则发送方知道在从发送方到接收方的路径上遇到了网络拥塞。
- URG(Urgent):标识是否为紧急报文,配合紧急指针(urgent pointer)一起使用,值为0或1 。当标志位URG为1时,表明该报文段有紧急数据需要尽快发送(发送端此时不会把报文数据写入到缓冲区,而是直接发送给应用层),即使对端窗口大小此时为0系统也要以高优先级发送该段报文,紧急数据会放在TCP报文段数据部分的最前端,紧急指针用于标识紧急数据在TCP报文段数据部分的结束位置,紧急数据之后的字节内容依然是普通数据。
- ACK(Acknowledgment):标识确认应答是否有效,配合确认号(Ack,Acknowledgment Number)一起使用,值为0或1 。当标志位ACK为1时,确认号Ack才有效。除了最初建立连接时发送的SYN报文段之外,其它情况下发送的报文段ACK都为1。
- PSH(Push):标识是否立即把报文数据推送给应用层,值为0或1。如果TCP接收方接收到PSH为1的报文段,应尽快把这段报文数据从接收缓冲区中读出并立即推送给应用层,不必等到缓冲区写满后再推送。常用于请求方发送完一个新请求后希望立即得到对端的响应。
- RST(Reset):标识是否重置连接,值为0或1 。当RST为1时,表明TCP连接发生错误,需要先强制断开连接,再重新建立新的连接,称之为复位TCP连接,这种报文也称之为复位报文段。
- SYN(Synchronize):该标志位用于在建立连接时同步Seq和Ack的初始值,仅在建立连接时使用。TCP三次握手中,第一次握手时,客户端先发送“SYN=1,ACK=0”的报文段,表示请求建立,第二次握手时,如果服务端同意建立连接就返回“SYN=1,ACK=1”的报文段。我们把含有SYN标志位的报文称为同步报文段。
- FIN(Finish):该标志位用于断开/释放连接,仅在断开连接时使用。当通信结束后需要断开连接时,主动要求断开连接的一方会发送“FIN=1,ACK=1”的报文段给对端,告知对端通信已结束希望断开连接,对端接收后会相应地返回“ACK=1”的报文段,至此连接会彻底关闭。我们把含有FIN标志位的报文称为结束报文段。
- 窗口(Window):占用 2 Byte(16bit),表示TCP接收方当前可用的最大缓冲区(Receive Buffer)大小,常配合Options字段中的Window Scale一起使用,用于实现滑动窗口机制,对流量进行控制(接收方通过Window告知发送方我方剩余的接收缓冲区还剩这么多,发送发会根据Window大小灵活调整发送速率,从而避免网络拥塞并确保通信的稳定性)。请注意,Window大小值有时候并不代表当前的实际可用窗口大小,因为Window共占用16位,最大值是2^16-1,也就是64K(65535),在当前的网络高带宽情况下,64K显然已无法满足大部分的网络通信,所以后来就在TCP的Options字段中新增了Window Scale对窗口进行放大,Window Scale代表的是一个向左的位移值(Shift count),最大值是14。二进制数据每增加一位1,其换算指数都会加1,所以实际窗口大小最大允许值应该是 2^(16+14) -1 = 2^30 - 1,长达1Gb。TCP在建立连接时的前两次握手过程中,双方都会用Window Scale来向对端声明我方的窗口放大因子并缓存对端的窗口放大因子,后期通信过程中不再声明,仅发送Window,双方会用对方的Window和Window Scale来计算实际的窗口大小,并根据实际窗口大小调整发送速率(如果窗口为0,发送方会定期进行窗口探测)。用图说话
- 校验和(Checksum):占用 2 Byte,接收方校验接收的数据是否与发送的数据完全一致,用于保证数据的完整性和准确性。Checksum是一个强制字段,发送方必须生成并发送它,接收方必须检查它。数据在传输过程可能会出错,所以TCP发送方在发送数据前会先根据伪首部、报文段首部和报文段数据计算校验和值,并将最终得到的值写入Checksum字段。而接收方在收到此报文段后,会根据伪首部、报文段首部和报文段数据再次计算校验和值,如果结果是0,说明数据一致,否则丢弃数据并报告发送方重传这段数据。
TCP发送方计算校验和过程:
1.先将TCP报文段首部中的Checksum字段置为0,因为Checksum本身也要参与计算;
2.将伪首部、TCP报文段首部和TCP报文段数据连在一起并分成若干个16位的位串,看是否是偶数个字节(所有数据是否对齐),如果不是则在右侧填充一个全为0的8位位串(填充段仅用于计算校验和值,不会传输给接收方),将每个16位位串看成一个二进制数;
3.对这些16位的二进制数进行1的补码和运算(one's complement sum),如果最高位有进位应循环进到最低位,累加的结果再取反码即得到校验和;
4.将校验写入TCP报文首部的Checksum字段。
TCP接收方检查校验和过程:
1.接收方将伪首部、TCP报文段首部和TCP报文段数据按发送方同样的方式(不包含发送方的第1步操作)进行1的补码和运算,累加的结果再取反码。
2.校验,如果上步的结果为0,表示传输正确;否则,说明传输有差错。
- 紧急指针(Urgent Pointer):占用 2 Byte,也称紧急偏移,用于标识紧急数据在TCP报文段数据部分的结束位置/正的偏移量。只有当标志位URG为1时该参数才有效。紧急数据是放在TCP报文段数据部分的最前端,紧急指针用于标识紧急数据在TCP报文段数据部分的结束位置,紧急数据之后的字节内容依然是普通数据。
- 选项(Options):占用 0~40 Byte,可选字段,用于传输TCP报文的附加信息,Options所有选项也都包含在校验和中。仅当 Data Offset > 5 时Options才会出现,size(Options) = (Data Offset - 5)×32,每个option的长度必须是8bit的整倍数(最短1个字节),且Options总长度也必须是32bit(4字节)的整倍数。如果某个option的长度不够4字节,那么就用“No-Operation(占用1字节)”来补充位数(都是补高位),缺几个字节就补几个“No-Operation”。请注意,当整个选项列表的结束位置无法与TCP报头尾部对齐时,TCP会在整个选项(all options, not each option)列表的尾部填充“End of Option List”选项。综上可知,size包含了补位和填充的数据长度。一个option由Kind、Length和Data三部分组成,其中Length和Data是选填参数,Length表示的是当前这个option的总长度,它包含Kind、Length和Data三者总共占用的位数。
常用option如下表:
Kind | Length | Meaning | Reference | |
0 | - | End of Option List | RFC9293 | 仅用于填充整个选项列表尾部。 |
1 | - | No-Operation,NOP | RFC9293 | 补位选项。 |
2 | 4 | Maximum Segment Size,MSS | RFC9293 | 最大报文段长度,具体限制的是TCP报文段中数据部分的长度。 |
3 | 3 | Window Scale | RFC7323 | 窗口放大因子 |
4 | 2 | SACK Permitted | RFC2018 | 标识是否支持SACK,只有在建立连接时SYN报段使用。 |
5 | N | Selective Acknowledgment,SACK | RFC2018 | 选择性确认,用于数据重传机制。接收方可通过SACK参数告知发送方我方收到了不连续的数据块(Ack=200,SACK=200-400),发送方可根据此信息检查哪部分数据丢失(对方收到200字节数据,接收到的是200-400段,说明0-199段丢失了)并重传这段数据。 |
8 | 10 | Timestamps | RFC7323 | 时间戳 |
完整的options list请参阅:Transmission Control Protocol (TCP) Parameters/tcp-parameters-1
参考文章
RFC 9293: Transmission Control Protocol (TCP)
Transmission Control Protocol (TCP) Parameters TCP所有字段、标志位和参数在这里都能找到!
RFC 3168: The Addition of Explicit Congestion Notification (ECN) to IP
draft-ietf-tcpm-accurate-ecn-28 - More Accurate Explicit Congestion Notification (ECN) Feedback in TCP Accurate ECN
draft-kuehlewind-tcpm-accurate-ecn-05 - More Accurate ECN Feedback in TCP Accurate ECN
RFC 2018: TCP Selective Acknowledgment Options Options:SACK
RFC 2883: An Extension to the Selective Acknowledgement (SACK) Option for TCP Options:SACK
RFC 7323: TCP Extensions for High Performance Optinos:Window Scale、Timestamps
相关文章:
TCP报文头(首部)详解
本篇文章基于 RFC 9293: Transmission Control Protocol (TCP) 对TCP报头进行讲解,部分内容会与旧版本有些许区别。 TCP协议传输的数据单元是报文段,一个报文段由TCP首部(报文头)和TCP数据两部分组成,其中TCP首部尤其重…...
第4章-第1节-初识Java的数组
1、数组 属于Java内存层面的一款容器(crud操作)。 概念: 内存中的一块存储区域(空间),内部有一组连续的小区域(元素空间),有数据类型的限定,可以存入一组匹配类型的数据,并且根据需要可以改动元素空间中的数据内…...
大数据技术10:Flink从入门到精通
导语:前期入门Flink时,可以直接编写通过idea编写Flink程序,然后直接运行main方法,无需搭建环境。我碰到许多初次接触Flink的同学,被各种环境搭建、提交作业、复杂概念给劝退了。前期最好的入门方式就是直接上手写代码&…...
IDEA中工具条中的debug按钮不能用了显示灰色
IDEA中工具条中的debug按钮不能用了显示灰色 1. 问题描述 IDEA上的DEBUG按钮突然变成了灰色: 2. 解决办法 一通搜索,终于找到解决办法 点击 File -> Project Structure如下图操作 3. 重启,解决 4. 参考 https://www.cnblogs.com…...
【MySQL内置函数】
目录: 前言一、日期函数获取日期获取时间获取时间戳在日期上增加时间在日期上减去时间计算两个日期相差多少天当前时间案例:留言板 二、字符串函数查看字符串字符集字符串连接查找字符串大小写转换子串提取字符串长度字符串替换字符串比较消除左右空格案…...
C++相关闲碎记录(14)
1、数值算法 (1)运算后产生结果accumulate() #include "algostuff.hpp"using namespace std;int main() {vector<int> coll;INSERT_ELEMENTS(coll, 1, 9);PRINT_ELEMENTS(coll);cout << "sum: " << accumulate(…...
18、vue3(十八):菜单权限,按钮权限,打包,发布nginx
目录 一、菜单权限和路由拆分 1.思路分析 2.深拷贝插件 3.代码实现 4.效果展示...
04 在Vue3中使用setup语法糖
概述 Starting from Vue 3.0, Vue introduces a new syntactic sugar setup attribute for the <script> tag. This attribute allows you to write code using Composition API (which we will discuss further in Chapter 5, The Composition API) in SFCs and shorte…...
vite+ts——user.ts——ts接口定义+axios请求的写法
import axios from axios; import qs from query-string; import {UserState} from /store/modules/user/types;export interface LoginData{username:string;password:string;grant_type?:string;scope?:string;client_id?:string;client_secret?:string;response_type?:…...
环境搭建及源码运行_java环境搭建_mysql安装
书到用时方恨少、觉知此时要躬行;拥有技术,成就未来,抖音视频教学地址: 1、介绍 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle旗下产品。MySQL是最…...
Android camera的metadata
一、实现 先看一下metadata内部是什么样子: 可以看出,metadata 内部是一块连续的内存空间。 其内存分布大致可概括为: 区域一 :存 camera_metadata_t 结构体定义,占用内存 96 Byte 区域二 :保留区&#x…...
ElasticSearch面试题
1.介绍下es的架构? es采用的是分布式的架构,es集群中会有多个结点,而结点的角色主要有下面几种。 协调结点: 请求路由能力,将请求内容将请求转发给对应的结点进行处理。 master结点: 结点管理ÿ…...
C++ 数据结构知识点合集-C/C++ 数组允许定义可存储相同类型数据项的变量-供大家学习研究参考
#include <iostream> #include <cstring>using namespace std;// 声明一个结构体类型 Books struct Books {char title[50];char author[50];char subject[100];int book_id; };int main( ) {Books Book1; // 定义结构体类型 Books 的变量 Book1Books …...
【机器学习】5分钟掌握机器学习算法线上部署方法
5分钟掌握机器学习算法线上部署方法 1. 三种情况2. 如何转换PMML,并封装PMML2.1 什么是PMML2.2 PMML的使用方法范例3. 各个算法工具的工程实践4. 只用Linux的Shell来调度模型的实现方法5. 注意事项参考资料本文介绍业务模型的上线流程。首先在训练模型的工具上,一般三个模型训…...
Vue3-21-组件-子组件给父组件发送事件
情景描述 【子组件】中有一个按钮,点击按钮,触发一个事件, 我们希望这个事件的处理逻辑是,给【父组件】发送一条消息过去, 从而实现 【子组件】给【父组件】通信的效果。这个问题的解决就是 “发送事件” 这个操作。 …...
[密码学]AES
advanced encryption standard,又名rijndael密码,为两位比利时数学家的名字组合。 分组为128bit,密钥为128/192/256bit可选,对应加密轮数10/12/14轮。 基本操作为四种: 字节代换(subBytes transformatio…...
CentOS 7 部署pure-ftp
文章目录 (1)简介(2)准备工作(3)更新系统(4)安装依赖环境(5)下载和解压pure-ftp源码包(6)编译和安装pure-ftp(7࿰…...
Vue2-动态组件案例
1.component介绍 说明: Type: string | ComponentDefinition | ComponentConstructor Explanation: String: 如果你传递一个字符串给 is,它会被视为组件的名称,用于动态地渲染不同类型的组件。这是一个在运行时动态切换组件类型的常见用例。…...
【源码】车牌检测+QT界面+附带数据库
目录 1、基本介绍2、基本环境3、核心代码3.1、车牌识别3.2、车牌定位3.3、车牌坐标矫正 4、界面展示4.1、主界面4.2、车牌检测4.3、查询功能 5、演示6、链接 1、基本介绍 本项目采用tensorflow,opencv,pyside6和pymql编写,pyside6用来编写UI界…...
实战1-python爬取安全客新闻
一般步骤:确定网站--搭建关系--发送请求--接受响应--筛选数据--保存本地 1.拿到网站首先要查看我们要爬取的目录是否被允许 一般网站都会议/robots.txt目录,告诉你哪些地址可爬,哪些不可爬,以安全客为例子 2. 首先测试在不登录的…...
光栅化渲染:可见性问题和深度缓冲区算法
在前面第二章中,我们了解到,在投影点(屏幕空间中的点)的第三个坐标中,我们存储原始顶点 z 坐标(相机空间中点的 z 坐标): 当一个像素与多个三角形重叠时,查找三角形表面上…...
docker入门小结
docker是什么?它有什么优势? 快速获取开箱即用的程序 docker使得所有的应用传输就像我们日常通过聊天工具文件传输一样,发送方将程序传输到超级码头而接收方也只需通过超级码头进行获取即可,就像一只鲸鱼拖着货物来回运输一样。…...
LLM Agent发展演进历史(观看metagpt视频笔记)
LLM相关的6篇重要的论文,其中4篇来自谷歌,2篇来自openai。技术路径演进大致是:SSL (Self-Supervised Learning) -> SFT (Supervised FineTune) IT (Instruction Tuning) -> RLHF。 word embedding的问题:新词如何处理&…...
Linux(操作系统)面经——part2
1、请你说说进程和线程的区别 1.进程是操作系统资源分配和调度的最小单位,实现操作系统内部的并发;线程是进程的子任务,cpu可以识别、执行的最小单位,实现程序内部的并发。 2.一个进程最少有一个线程或有多个,一个线程…...
Flink系列之:WITH clause
Flink系列之:WITH clause 适用流、批提供了一种编写辅助语句以在较大查询中使用的方法。这些语句通常称为公共表表达式 (CTE),可以被视为定义仅针对一个查询而存在的临时视图。 WITH 语句的语法为: WITH <with_item_definition> [ , …...
JMeter直连数据库
JMeter直连数据库 使用场景操作步骤 使用场景 用作请求的参数化 登录时需要的用户名,密码可以从数据库中查询获取 用作结果的断言 添加购物车下订单,检查接口返回的订单号,是否与数据库中生成的订单号一致 清理垃圾数据 添加商品后ÿ…...
Linux部署MySQL5.7和8.0版本 | CentOS和Ubuntu系统详细步骤安装
一、MySQL数据库管理系统安装部署【简单】 简介 MySQL数据库管理系统(后续简称MySQL),是一款知名的数据库系统,其特点是:轻量、简单、功能丰富。 MySQL数据库可谓是软件行业的明星产品,无论是后端开发、…...
STL中set和multiset容器的用法(轻松易懂~)
目录 1. 基本概念 2. 构造和赋值 3. 大小和交换 4. 插入 和 删除 5. 统计 和 查找 6. set容器的排序 1. 基本概念 set和multiset属于关联式容器,底层结构式二叉树,所有元素都会在插入时自动排序。 如果你对容器的概念,或是二叉树不太了…...
Codeforces Round 915 (Div. 2)
Constructive Problems(Problem - A - Codeforces) 题目大意:现在有一片城市被摧毁了,需要进行重建,当一个城市水平相邻和竖直相邻的位置都至少有一个城市的时候,该城市可以被重建。所有城市排成n行m列的矩…...
C语言经典错误总结(三)
一.指针与数组理解 我们都知道定义一个数组然后对其进行各种想要的操作,但是你真的能够区分那些是对数组的操作,那些是通过指针实现的吗? 例如;arr[1]10;这个是纯粹对数组操作实现的吗? 答案肯定不是,实际上我们定义…...
房源哪个网站最靠谱/优化公司网站
说明是一组键值对的结构,用于存储key-value的数据创建map//创建方式1 var m new Map([[michael,95],[bob,75],[tracy,85]]); //创建方式2 var m new Map();map添加元素m.set(Adam, 67);map判断元素是否存在m.has(Adam);map获取元素m.get(Adam);map删除元素m.delete(Adam);转载…...
黄页网站推广app软件/涟源网站seo
http://www.cnblogs.com/tianzhiliang/archive/2011/01/06/1927691.html...
做最好的网站/seo流量优化
# python操作mysqlmysql数据库可以应用于多种编程语言,包括 PHP,Java,Go,Python不同编程语言操作mysql,都是使用了mysql提供的API接口。如果直接操作mysql提供的API相对复杂一些,因为不同的编程语言都有不同…...
百度云 免费 网站主机/搜狗seo排名软件
shutdownshutdown指令以安全的方式来关闭系统,所有已经登录的用户都会被告知系统将要关闭。并且在最后五分钟内,新的登录将被阻止。过了指定的time后,关机会向init(8)守护进程发送一个请求,以便将系统降至适当的运行级别。这是通过…...
wordpress 个人主题/百度站长工具seo查询
全球及中国浆液阀行业市场深度分析及发展战略咨询报告2022-2028年 详情内容请咨询鸿晟信合研究院! 【全新修订】:2022年2月 【撰写单位】:鸿晟信合研究研究【报告目录】 1 浆液阀市场概述 1.1 浆液阀产品定义及统计范围 1.2.1 不同产品类型浆…...
学习做网站多久/百度开车关键词
今天干了件很蠢的事情~.. 想要将a电影.srt 改成跟电影.avi 同名字.于是就下了mv a电影.srt 电影.avi ... 当按下enter 时清醒了过来...发现到那avi 已经被我清掉了.. 变srt 了... :~于是就有这篇文章的由来.... 呜... :~虽然是写说档案删除的回复救援, 但事实上我没有成功救回来…...