当前位置: 首页 > news >正文

TCP Analysis Flags 之 TCP Retransmission

前言

默认情况下,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 的情形自然也是五花八门,具体问题具体分析。

相关文章:

TCP Analysis Flags 之 TCP Retransmission

前言 默认情况下&#xff0c;Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态&#xff0c;并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时&#xff0c;会对每个 TCP 数据包进行一次分析&#xff0c;数据包按照它们在数据包列表中出现的顺序进行处理。可…...

#Phi-4:微软 14B 参数开源模型,性能匹敌 OpenAI GPT-4o-mini,现已登陆 Ollama

Phi-4&#xff1a;微软 14B 参数开源模型&#xff0c;性能匹敌 OpenAI GPT-4o-mini&#xff0c;现已登陆 Ollama 一、Phi-4 模型概述 &#xff08;一&#xff09;模型参数与规模 Phi-4 是微软推出的一款小型语言模型&#xff0c;拥有 140 亿参数。虽然参数量相对较小&#xf…...

JSON头文件调用

除了传统的读写操作,现在流行的json文件读取保存,还是非常方便的. 头文件放在源代码中,在调用处添加引用路径 #include “…/ConsoleApplication1/include/json.hpp” using json nlohmann::json; 数据结构例子: // 声明Person类 class Person { public: std::string name; i…...

Swagger学习⑭——@Contact注解

介绍 Contact 是 Swagger/OpenAPI 3.0 注解中的一个注解&#xff0c;用于定义 API 文档中的联系信息。通过 Contact 注解&#xff0c;你可以指定 API 维护者的联系方式&#xff0c;例如电子邮件、URL 或名称等。 源代码 package io.swagger.v3.oas.annotations.info;import …...

如何监听Vuex数据的变化?

使用watch方法监听Vuex state的变化&#xff1a; // 在 Vue 组件中 this.$store.watch((state) > state.someState,(newValue, oldValue) > {console.log(someState changed from, oldValue, to, newValue);} );使用subscribe方法监听mutation的变化&#xff1a; // 在…...

Redis 优化秒杀(异步秒杀)

目录 为什么需要异步秒杀 异步优化的核心逻辑是什么&#xff1f; 阻塞队列的特点是什么&#xff1f; Lua脚本在这里的作用是什么&#xff1f; 异步调用创建订单的具体逻辑是什么&#xff1f; 为什么要用代理对象proxy调用createVoucherOrder方法&#xff1f; 对于代码的详细…...

前端中常用的单位度量(px,rpx,rem,em,vw,vh)+图片自适应

文章目录 前端中常用的单位度量vw/vh 的场景应用px/rem/em 之间的转换关系项目中的rem 应用根元素 font-size 设置为16px 的应用惯例自适应之图片应用1. 使用 max-width 和 max-height2. 使用 object-fit 属性3. 使用 background-image 模拟图片展示 前端中常用的单位度量 px&…...

STM32之一种双通路CAN总线消息备份冗余处理方法(十三)

STM32F407 系列文章 - Dual-CANBus-ProMethod&#xff08;十三&#xff09; 目录 前言 一、现状分析 二、解决思路 1.应用场景网络结构图 2.数据发送流程 3.数据接收流程 4.用到的模块 1.CAN网络速率及时间片分配 2.CAN网络消息ID组成 3.设备节点定义 4.数据格式说明…...

从零开始:使用VSCode搭建Python数据科学开发环境

引言 在数据科学领域&#xff0c;一个高效、稳定的开发环境是成功的关键。本文将详细介绍如何使用Visual Studio Code搭建一个完整的Python数据科学开发环境。通过本指南&#xff0c;您将学会&#xff1a; 安装和配置VSCode&#xff0c;包括基本设置和快捷键配置设置Python开…...

C#语言的字符串处理

C#语言的字符串处理 引言 在现代编程中&#xff0c;字符串处理是一项重要的技能&#xff0c;几乎在所有编程语言中都有应用。C#语言作为一种强类型的、面向对象的编程语言&#xff0c;提供了丰富的字符串处理功能。这使得开发人员能够方便地进行文本操作&#xff0c;比如字符…...

《安富莱嵌入式周报》第348期:开源低功耗测试仪,开源创意万用表,续航100-300小时,开源PCB电机,自制shell和网络协议栈,开源水培自动化系统

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版&#xff1a; https://www.bilibili.com/video/BV1Tzr9Y3EQ7/ 《安富莱嵌入式周报》第348期&#xff1a;开源低功…...

npm发布流程说明

一、进入要发布的项目根目录&#xff0c;初始化为npm包 npm initname&#xff1a;最重要的字段之一&#xff0c;项目名称&#xff08;少于214个字节&#xff09;。没有name和version不能进行安装&#xff1b; version&#xff1a;最重要的字段之一&#xff0c;项目版本。没有n…...

缓存-文章目录

关于缓存系列文章&#xff1a; 缓存学习总结1&#xff08;缓存分类&#xff09; 缓存学习总结2&#xff08;服务器本地缓存&#xff09; 缓存学习总结3&#xff08;服务器内存缓存&#xff09;推荐使用 缓存学习总结4&#xff08;分布式缓存&#xff09; 关于redis系列文章…...

LeetCode 3297.统计重新排列后包含另一个字符串的子字符串数目 I:滑动窗口

【LetMeFly】3297.统计重新排列后包含另一个字符串的子字符串数目 I&#xff1a;滑动窗口 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-substrings-that-can-be-rearranged-to-contain-a-string-i/ 给你两个字符串 word1 和 word2 。 如果一个字符串 x 重新…...

如何在 Ubuntu 24.04 上安装 Memcached 服务器教程

简介 Memcached 是一个高性能、分布式的内存缓存系统&#xff0c;旨在通过减少数据库负载来加速动态 Web 应用程序。它通过将数据和对象缓存在 RAM 中来实现这一点&#xff0c;从而最大限度地减少了从数据库或其他慢速存储层重复获取数据的需要。 本教程的目标是手把手教你如…...

《深度学习模型在鸿蒙分布式框架下的跨设备高效之旅》

在人工智能领域&#xff0c;深度学习模型的训练与推理通常需要强大的计算资源和大量的数据支持。而鸿蒙系统的分布式框架为解决这一问题提供了新的思路和方法&#xff0c;使得深度学习模型能够在多个设备之间实现高效的训练与推理。 鸿蒙分布式框架概述 鸿蒙系统是一款面向万…...

[python3]Excel解析库-xlutils

xlutils 是一组用于处理 Excel 文件的 Python 库&#xff0c;它实际上是 xlrd 和 xlwt 的扩展&#xff0c;提供了额外的功能来操作 Excel 文件。xlutils 主要由三个部分组成&#xff1a;xlutils.copy、xlutils.filter 和 xlutils.view&#xff0c;它们分别用于复制和修改现有 E…...

Springboot Bean创建流程、三种Bean注入方式(构造器注入、字段注入、setter注入)、循坏依赖问题

文章目录 1 Bean 创建流程1.1 Bean的扫描注册1.2 创建Bean的顺序 2 三种Bean注入方式2.1 构造器注入 | Constructor Injection&#xff08;推荐&#xff09;2.2 字段注入 | Field Injection&#xff08;常用&#xff09;2.3 方法注入 | Setter Injection2.4 三种方式注入顺序 3…...

mybatisX插件的使用,以及打包成配置

装mybatisX插件&#xff1b; idea连接数据库&#xff1b; 点击mybatisx-generator&#xff0c;设置自己装mybatisX插件&#xff1b; idea连接数据库&#xff1b; 点击mybatisx-generator&#xff0c;设置自己要的包和类&#xff1b; 如果要把自己的配置设置成一个自定义模板&a…...

【初阶数据结构】线性表之单链表

文章目录 前言 一、单链表的概念与结构 1.概念 2.结点 3.性质 二、实现单链表 1.结构的定义 2.链表的打印和结点的申请 3.单链表的尾插和头插 4.单链表的尾删和头删 5.单链表的查找 6.指定位置之前插入数据和指定位置之后插入数据 7.删除pos结点和删除pos之后的结…...

逆向阿里系227滑块,除了n值,这几个固定参数(a/t/p/x5secdata)你确定拿对了吗?

逆向阿里系227滑块&#xff1a;那些被低估的固定参数陷阱 在逆向工程的世界里&#xff0c;我们常常被那些复杂的算法和动态生成的值所吸引&#xff0c;却忽略了那些看似简单却同样关键的固定参数。就像建造一座高楼&#xff0c;大家总是关注最显眼的钢结构&#xff0c;却很少有…...

ECharts饼图隐藏数据实战:如何优雅处理空值项的指示线与Tooltip(附完整代码)

ECharts饼图隐藏数据实战&#xff1a;如何优雅处理空值项的指示线与Tooltip&#xff08;附完整代码&#xff09; 在数据可视化项目中&#xff0c;我们经常遇到需要隐藏某些数据项的场景。比如当某个分类的数据值为零或空时&#xff0c;传统的饼图会显示一个极小的扇形区域&…...

Qwen3-VL-8B效果实测:上传图片,看AI如何精准描述与回答

Qwen3-VL-8B效果实测&#xff1a;上传图片&#xff0c;看AI如何精准描述与回答 1. 轻量级视觉语言模型的惊艳表现 当你第一次看到Qwen3-VL-8B处理图片的能力时&#xff0c;很难相信这只是一个8B参数的模型。它不仅能准确识别图片中的物体和场景&#xff0c;还能理解上下文关系…...

第八章:实战项目案例

第八章&#xff1a;实战项目案例 8.1 项目一&#xff1a;Todo 应用&#xff08;Vue 3 Pinia&#xff09; 项目初始化 npm create vitelatest todo-app -- --template vue cd todo-app npm install pinia npm install -D vitejs/plugin-vue项目结构 todo-app/ ├── src/ …...

别再死磕localhost了!Dify连接MySQL报错1130?手把手教你搞定IP授权(附MySQL 8.0+命令)

别再死磕localhost了&#xff01;Dify连接MySQL报错1130&#xff1f;手把手教你搞定IP授权&#xff08;附MySQL 8.0命令&#xff09; 当你在Dify中尝试将LLM生成的数据导入本地MySQL数据库时&#xff0c;可能会遇到一个令人头疼的错误&#xff1a;pymysql.err.OperationalError…...

KuiklyUI未来展望:2025路线图与技术演进趋势

KuiklyUI未来展望&#xff1a;2025路线图与技术演进趋势 【免费下载链接】KuiklyUI A Kotlin Multiplatform UI framework from Tencent TDS — high-performance, one codebase for six platforms, with dynamic delivery. 项目地址: https://gitcode.com/gh_mirrors/ku/Kui…...

学习笔记-http协议

1.http介绍http&#xff08;超文本运输协议&#xff09;是一种应用层协议&#xff0c;他定义了web客户机是如何向web服务器请求web页面&#xff0c;以及服务器如何将web页面传送给客户机的。他是基于 TCP&#xff08;HTTP/3 基于 UDP&#xff09;的结构化请求 - 响应协议&#…...

Qwen3.5-27B镜像合规审计:GDPR/等保2.0/数据出境安全评估要点

Qwen3.5-27B镜像合规审计&#xff1a;GDPR/等保2.0/数据出境安全评估要点 1. 模型与部署概述 Qwen3.5-27B是Qwen官方发布的视觉多模态理解模型&#xff0c;支持文本对话与图片理解功能。本镜像已在4 x RTX 4090 D 24GB环境完成部署&#xff0c;提供中文Web对话界面、流式文本…...

Sub-Agent 与 Agent Team 的本质区别

用了 Team 模式的 API&#xff0c;就是 Agent Team 了吗&#xff1f;从一个真实项目出发&#xff0c;拆解两种多 Agent 架构的核心差异。引言&#xff1a;名字叫 Team&#xff0c;就真是 Team 吗&#xff1f; 2026 年&#xff0c;AI 编程圈最热的词之一是"多 Agent 协作&q…...

Graphormer模型推理加速:利用.accelerate库优化计算性能

Graphormer模型推理加速&#xff1a;利用.accelerate库优化计算性能 1. 引言&#xff1a;为什么需要加速Graphormer推理 Graphormer作为图神经网络领域的重要突破&#xff0c;在分子属性预测、药物发现等任务中展现出强大能力。但随着分子库规模扩大&#xff0c;推理速度成为…...