TCP Analysis Flags 之 TCP Retransmission

news2025/1/9 17:33:42

前言

默认情况下,Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态,并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时,会对每个 TCP 数据包进行一次分析,数据包按照它们在数据包列表中出现的顺序进行处理。可以通过 “Analyze TCP sequence numbers” TCP 解析首选项启用或禁用此功能。

TCP 分析展示

在数据包文件中进行 TCP 分析时,关于 “TCP Retransmission” 一般是如下显示的,包括:

  1. Packet List 窗口中的 Info 信息列,以 [TCP Retransmission] 黑底红字进行标注;
  2. Packet Details 窗口中的 TCP 协议树下,在 [SEQ/ACK analysis] -> [TCP Analysis Flags] 中定义该 TCP 数据包的分析说明。

考虑到 TCP 乱序、重传场景的复杂性,专家信息在重传的判断上,前面都会有一个(suspected),表示疑似,说明并不是百分百正确。

TCP Retransmission 定义

文档中关于 TCP Retransmission 的定义看起来简单,但实际考虑到 TCP 乱序、重传场景的复杂性,在 TCP 分析中对于 TCP Retransmission 是与 TCP Spurious RetransmissionTCP Fast RetransmissionTCP Out-Of-Order 等在一起判断标记乱序或重传类型,而在不少场景还会有判断出错的问题,当然 Wireshark 考虑到这种情况,也有手动修正的选项,这正好也侧面证明了上面的说法,关于 TCP 乱序、重传的复杂性。

TCP Retransmission 的定义如下,当以下所有条件都为真时设置:

  • 不是 Keep-Alive 数据包
  • TCP 段大小大于零或设置了 SYN/FIN
  • 同方向之前下一个期望的 Seq Num 大于当前数据包的 Seq Num
Set when all of the following are true:

This is not a keepalive packet.
In the forward direction, the segment length is greater than zero or the SYN or FIN flag is set.
The next expected sequence number is greater than the current sequence number.

具体的代码如下,总的来说这段代码是 Wireshark 中 TCP 分析模块的一部分,用于检测和标识 TCP 数据包中的各种重传类型。它的主要功能是根据当前数据包的序列号、长度、标志位以及之前收到的 TCP 数据包的信息,判断当前数据包是否属于重传,如果是则进一步确定它属于哪种重传类型。

根据分析 TCP 数据包的各种特征,对重传数据包进行分类,有助于更好地理解 TCP 连接中的重传行为,对于诊断网络问题很有帮助。这段代码的主要逻辑如下,如果所有下述条件均满足,则认为该数据包是一个重传包。

实际上 TCP Retransmission 是在符合一定条件之后,再依次判断是否属于 TCP Spurious RetransmissionTCP Fast RetransmissionTCP Out-Of-Order 等,如果之前都不匹配,但满足以下条件时,即被认定为 TCP Retransmission,即普通的 TCP 重传。

  • 检查 seq_not_advanced,序列号是否未递增。
    /* RETRANSMISSION/FAST RETRANSMISSION/OUT-OF-ORDER
     * If the segment contains data (or is a SYN or a FIN) and
     * if it does not advance the sequence number, it must be one
     * of these three.
     * Only test for this if we know what the seq number should be
     * (tcpd->fwd->nextseq)
     *
     * Note that a simple KeepAlive is not a retransmission
     */
    if (seglen>0 || flags&(TH_SYN|TH_FIN)) {
        gboolean seq_not_advanced = tcpd->fwd->tcp_analyze_seq_info->nextseq
                && (LT_SEQ(seq, tcpd->fwd->tcp_analyze_seq_info->nextseq));

        guint64 t;
        guint64 ooo_thres;

        ...

        if (seq_not_advanced) {
            /* Then it has to be a generic retransmission */
            if(!tcpd->ta) {
                tcp_analyze_get_acked_struct(pinfo->num, seq, ack, TRUE, tcpd);
            }
            tcpd->ta->flags|=TCP_A_RETRANSMISSION;

            /*
             * worst case scenario: if we don't have better than a recent packet,
             * use it as the reference for RTO
             */
            nstime_delta(&tcpd->ta->rto_ts, &pinfo->abs_ts, &tcpd->fwd->tcp_analyze_seq_info->nextseqtime);
            tcpd->ta->rto_frame=tcpd->fwd->tcp_analyze_seq_info->nextseqframe;

            /*
             * better case scenario: if we have a list of the previous unacked packets,
             * go back to the eldest one, which in theory is likely to be the one retransmitted here.
             * It's not always the perfect match, particularly when original captured packet used LSO
             * We may parse this list and try to find an obvious matching packet present in the
             * capture. If such packet is actually missing, we'll reach the list first entry.
             * See : issue #12259
             * See : issue #17714
             */
            ual = tcpd->fwd->tcp_analyze_seq_info->segments;
            while(ual) {
                if(GE_SEQ(ual->seq, seq)) {
                    nstime_delta(&tcpd->ta->rto_ts, &pinfo->abs_ts, &ual->ts );
                    tcpd->ta->rto_frame=ual->frame;
                }
                ual=ual->next;
            }
        }
    }

finished_checking_retransmission_type:

next expected sequence number,为 nextseq,定义为 highest seen nextseq。

Packetdrill 示例

根据上述 TCP Retransmission 定义和代码说明,通过 packetdrill 模拟普通的超时重传现象即可,即为 TCP Retransmission 数据包。

# cat tcp_retrans_001.pkt 
0   socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0  setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0  bind(3, ..., ...) = 0
+0  listen(3, 1) = 0

+0 < S 0:0(0) win 16000 <mss 1460>
+0 > S. 0:0(0) ack 1 <...>
+0.01 < . 1:1(0) ack 1 win 16000
+0 accept(3, ..., ...) = 4

+0.01 write(4, ..., 1000) = 1000

+0 `sleep 100`
# 

经 Wireshark 展示如下,可以看到满足判断条件后,重传的数据包均标记为 [TCP Retransmission] ,因为始终同方向之前下一个期望的 Seq Num 1001 大于当前数据包的 Seq Num 1。

实例

关于 TCP Retransmission 的实例,实际日常抓包中经常会看到,是比较常见的一种 TCP 分析信息,也会伴生着出现像是 TCP Dup ACKTCP Fast RetransmissionTCP Spurious Retransmission 等信息,当然有时也会单独出现。

  1. SYN TCP Retransmission

普通的客户端 SYN 超时重传场景,始终同方向之前下一个期望的 Seq Num 1 ( SYN 占用 1 字节)大于当前数据包的 Seq Num 0,所以满足判断条件后,重传的数据包均标记为 [TCP Retransmission] ,当然 SYN/ACK 超时重传场景同样如此。

  1. TCP Retransmission

普通的数据段重传场景,同方向之前下一个期望的 Seq Num 14958 大于当前数据包的 Seq Num 4878,在判断不是 TCP Spurious RetransmissionTCP Fast RetransmissionTCP Out-Of-Order 等类型后,满足序列号未递增的情况下,判定为 [TCP Retransmission]。

  1. FIN TCP Retransmission

和 SYN 超时重传一样,也是普通的 FIN 超时重传场景,始终同方向之前下一个期望的 Seq Num 2 ( FIN 占用 1 字节)大于当前数据包的 Seq Num 1,所以满足判断条件后,重传的数据包均标记为 [TCP Retransmission]

总结

考虑到数据包会出现乱序、重传等各类不同的场景,产生 TCP Retransmission 的情形自然也是五花八门,具体问题具体分析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2273912.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker 使用Dockerfile创建镜像

创建并且生成镜像 在当前目录下创建一个名为Dockerfile文件 vi Dockerfile填入下面配置 # 使用 CentOS 作为基础镜像 FROM centos:7# 设置工作目录 WORKDIR /app# 复制项目文件到容器中 COPY bin/ /app/bin/ COPY config/ /app/config/ COPY lib/ /app/lib/ COPY plugin/ /a…

Matlab 数据处理与可视化的多元拓展应用(具体代码分析)

一、代码整体功能概述&#xff1a; 该代码主要实现了以下几个功能&#xff1a; 从文件&#xff08;part1.txt&#xff09;中读取数据&#xff0c;并提取第二列数据&#xff0c;将其存储在 originalColumnData 中。对原始数据进行可视化&#xff0c;包括绘制置零前数据的折线图…

Oracle OCP考试常见问题之线上考试流程

首先要注意的是&#xff1a;虽然Oracle官方在国际上取消了获得OCP认证需要培训记录的要求&#xff0c;但在中国区&#xff0c;考生仍然需要参加Oracle的官方或者其合作伙伴组织的培训&#xff0c;并且由Oracle授权培训中心向Oracle提交学员培训记录。考生只有在完成培训并通过考…

第2章 市场走势的分类与组合

本章主要讨论市场中走势的分类与组合&#xff0c;从基本假设出发&#xff0c;对市场的走势状态进行分类&#xff0c;探讨不同的走势组合和走势组合分类&#xff0c;以深刻理解走势。 2.1 走势分类 根据第一章市场的基本假设三&#xff0c;走势包含无序运动状态&#xff08;混…

【Excel/WPS】根据平均值,生成两列/多列指定范围的随机数/随机凑出两列数据

原理就是通过随机生成函数和平均值函数。 适用场景&#xff1a;在总体打分后&#xff0c;需要在小项中随机生成小分数 第一列&#xff1a;固定的平均值A2第二列&#xff1a; RANDBETWEEN(A2-10,A210)第三列&#xff1a;根据第二列用平均值函数算除 A2*2-B2这是随机值1的公式&am…

STM32裸机开发转FreeRTOS教程

目录 1. 简介2. RTOS设置&#xff08;1&#xff09;分配内存&#xff08;2&#xff09;查看任务剩余空间&#xff08;3&#xff09;使用osDelay 3. 队列的使用&#xff08;1&#xff09;创建队列&#xff08;1&#xff09;直接传值和指针传值&#xff08;2&#xff09;发送/接收…

Golang的网络安全漏洞检测

Golang的网络安全漏洞检测 一、网络安全意识的重要性 在当今网络高度发达的环境下&#xff0c;网络安全问题变得异常突出。黑客利用各种手段对网络系统进行攻击&#xff0c;企图窃取数据、篡改信息、瘫痪服务等&#xff0c;因此网络安全成为全球关注的焦点。在这种环境下&#…

oscp备考 oscp系列——Kioptix Level 1靶场 古老的 Apache Vuln

目录 前言 1. 主机发现 2. 端口扫描 3. 指纹识别 4. 目录扫描 5. 漏洞搜索和利用 前言 oscp备考&#xff0c;oscp系列——Kioptix Level 1靶场 Kioptix Level 1难度为简单靶场&#xff0c;主要考察 nmap的使用已经是否会看输出&#xff0c;以及是否会通过应用查找对应漏…

git的rebase和merge的区别?

B分支从A分支拉出 1.git merge 处于A分支执行&#xff0c;git merge B分支:相当于将commit X、commit Y两次提交&#xff0c;作为了新的commit Z提交到了A分支上。能溯源它真正提交的信息。 2.git rebase 处于B分支&#xff0c;执行git rebase A分支&#xff0c;B分支那边复…

ansible-性能优化

一. 简述&#xff1a; 搞过运维自动化工具的人&#xff0c;肯定会发现很多运维伙伴们经常用saltstack和ansible做比较&#xff0c;单从执行效率上来说&#xff0c;ansible确实比不上saltstack(ansible使用的是ssh,salt使用的是zeromq消息队列[暂没深入了解])&#xff0c;但其实…

Pytest钩子函数,测试框架动态切换测试环境

在软件测试中&#xff0c;测试环境的切换是个令人头疼的问题。不同环境的配置不同&#xff0c;如何高效切换测试环境成为许多测试开发人员关注的重点。你是否希望在运行测试用例时&#xff0c;能够动态选择测试环境&#xff0c;而不是繁琐地手动修改配置&#xff1f; Pytest 测…

【RK3568笔记】Android修改开机动画

概述 Android 的开机动画是由一系列连续的 PNG 图片作为帧组成的动画形式&#xff0c;不是一张 GIF 图片。将各帧 PNG 图片以压缩方式进行保存&#xff08;压缩方式要求是存储压缩&#xff09;&#xff0c;并将保存的文件名命名为 bootanimation.zip&#xff0c;这个 bootanim…

华为路由器、交换机、AC、新版本开局远程登录那些坑(Telnet、SSH/HTTP避坑指南)

关于华为设备远程登录配置开启的通用习惯1、HTTP/HTTPS相关服务 http secure-server enablehttp server enable 2、Telnet服务telnet server enable3、SSH服务stelnet server enablessh user admin authentication-type password 「模拟器、工具合集」复制整段内容 链接&…

spring boot学习第二十三篇:Spring Boot集成RocketMQ

前置条件先安装好RocketMQ 希望在Window10安装rocketMQ并简单使用&#xff0c;可以参考如下文章&#xff1a; Window10安装rocketMQ并简单使用-CSDN博客 1、pom.xml文件里面加上依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId&…

花生好坏缺陷识别数据集,7262张图片,支持yolo,coco json,pasical voc xml格式的标注,识别准确率在95.7%

花生好坏缺陷识别数据集,7262张图片&#xff0c;支持yolo&#xff0c;coco json&#xff0c;pasical voc xml格式的标注&#xff0c;识别准确率在95.7% 数据集分割 训练组87&#xff05; 6353图片 有效集8% 606图片 测试集4% 303图片 预处理 自动定…

在JavaScript开发中,如何判断对象自身为空?

前言 如何判断一个对象为空是我们在开发中经常会遇到的问题&#xff0c;今天我们来聊聊几种经常使用的方法&#xff0c;以及在不同的场景下我们如何去使用。 1. JSON.stringify JSON.stringify 方法可以使对象序列化&#xff0c;转为相应的 JSON 格式。 const obj {};cons…

现场展示deepseek VS openAI o1模型大对比

DeepSeek-V3 模型的发布在 AI 领域引起了广泛关注。作为一款拥有 6850 亿参数的混合专家&#xff08;MoE&#xff09;语言模型&#xff0c;DeepSeek-V3 在多个基准测试中表现出色&#xff0c;甚至超越了一些闭源模型。其在 Aider 代码能力排行榜上的正确率达到 48.4%&#xff0…

2010年IMO几何预选题第1题

在 △ A B C \triangle ABC △ABC 中, A D AD AD, B E BE BE, C F CF CF 为三条高线, 延长 E F EF EF 交 ( A B C ) (ABC) (ABC) 于 P P P, 延长 D F DF DF, B P BP BP 交于 Q Q Q. 求证: A P A Q APAQ APAQ. 证明: 设 D F DF DF 交 ( A P F ) (APF) (APF) 于点 …

SOLID原则学习,单一职责原则(Single Responsibility Principle)

文章目录 1. 定义2. 核心思想3. 优点4. 总结 1. 定义 单一职责原则是面向对象设计中的五大原则&#xff08;SOLID&#xff09;之一&#xff0c;由Robert C. Martin提出。它指出一个类应该只有一个引起它变化的原因&#xff0c;即一个类应该只负责一项职责。 2. 核心思想 职责…

对快速由表及里说拜拜/如何正确运用由表及里

你是不是还&#xff1a;看到一男子拖走一女子就以为小情侣吵架而已&#xff08;可能人贩子&#xff09;&#xff1b;看到男友对你好个几次就从此死心塌地&#xff08;可能有手就行&#xff0c;细节装装而已&#xff09;结果耽误终身&#xff1b;看到女同事对你微笑不排斥就以为…