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

TCP Analysis Flags 之 TCP Dup ACK

前言

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

TCP 分析展示

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

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

TCP Dup ACK 定义

实际在 TCP 分析中,关于 TCP Dup ACK 的定义也相对来说简单,包括如下:

  • TCP 段大小为 0
  • 窗口大小非零且没有改变,或者有有效的 SACK 数据
  • 下一个期望的 Seq Num 和 LastACK Num 是非 0 的(即连接已经建立)
  • 没有设置 SYN、FIN、RST
Set when all of the following are true:The segment size is zero.
The window size is non-zero and hasn’t changed, or there is valid SACK data.
The next expected sequence number and last-seen acknowledgment number are non-zero (i.e., the connection has been established).
SYN, FIN, and RST are not set.

具体的代码如下,总的来说这段代码的用于准确检测 TCP 重复 ACK 的情况,并记录相关信息以支持后续的重传机制分析,是 TCP 可靠传输的重要组成部分。这段代码的主要逻辑如下,如果所有下述条件均满足,则认为该数据包是一个重复确认包。

  • 检查 TCP 段大小是否为 0;
  • 检查窗口大小是否不为 0;
  • 检查窗口大小与同方向之前窗口大小是否相同;
  • 检查 Seq Num 是否等于同方向之前下一个期望的 Seq Num;
  • 检查 ACK Num 是否等于同方向之前的LastACK Num;
  • 检查当前数据包是否不是 SYN/FIN/RST 数据包。
    /* DUPLICATE ACK* It is a duplicate ack if window/seq/ack is the same as the previous* segment and if the segment length is 0*/if( seglen==0&&  window&&  window==tcpd->fwd->window&&  seq==tcpd->fwd->tcp_analyze_seq_info->nextseq&&  ack==tcpd->fwd->tcp_analyze_seq_info->lastack&&  (flags&(TH_SYN|TH_FIN|TH_RST))==0 ) {/* MPTCP tolerates duplicate acks in some circumstances, see RFC 8684 4. */if(tcpd->mptcp_analysis && (tcpd->mptcp_analysis->mp_operations!=tcpd->fwd->mp_operations)) {/* just ignore this DUPLICATE ACK */} else {tcpd->fwd->tcp_analyze_seq_info->dupacknum++;if(!tcpd->ta) {tcp_analyze_get_acked_struct(pinfo->num, seq, ack, TRUE, tcpd);}tcpd->ta->flags|=TCP_A_DUPLICATE_ACK;tcpd->ta->dupack_num=tcpd->fwd->tcp_analyze_seq_info->dupacknum;tcpd->ta->dupack_frame=tcpd->fwd->tcp_analyze_seq_info->lastnondupack;}}
  1. next expected sequence number,为 nextseq,定义为 highest seen nextseq。
  2. lastack,定义为 Last seen ack for the reverse flow。

Packetdrill 示例

根据上述 TCP Dup ACK 定义和代码说明,通过 packetdrill 模拟丢包现象即可,因缺失中间一段数据,在收到后一段数据后,就会触发产生 TCP Dup ACK 数据包。

# cat tcp_dup_ack.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 < P. 1:21(20) ack 1 win 15000
+0 < P. 41:61(20) ack 1 win 15000
# 

经 Wireshark 展示如下,可以看到满足判断条件后,No.7 标识 [TCP Dup ACK 5#1] ,意味着 No.7 与 No.5 重复,发生一次。

如果想触发多次重复的 Dup ACK,可增加几次后续数据段即可,如下

# cat tcp_dup_ack_02.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 < P. 1:21(20) ack 1 win 15000
+0 < P. 41:61(20) ack 1 win 15000
+0 < P. 61:81(20) ack 1 win 15000
+0 < P. 81:101(20) ack 1 win 15000
# 

经 Wireshark 展示如下,No.7 标识 [TCP Dup ACK 5#1] ,No.9 标识 [TCP Dup ACK 5#2] ,No.11 标识 [TCP Dup ACK 5#3] ,共重复三次。

实例

关于 TCP Dup ACK 的实例,实际日常抓包中经常会看到,是比较常见的一种 TCP 分析信息,多数情况会发生在乱序或丢包场景中。在不同的场景中,也会伴生着出现像是 TCP Previous segment not caputredTCP Fast RetransmissionTCP Spurious Retransmission 等信息,当然有时也会单独出现。

  1. TCP Dup ACK + TCP Fast Retransmission

很常见的数据段丢包场景,No.1969 Seq Num 为 1431,提示 TCP 之前的数据分段未被捕获到,也即丢失了一个长度为 1430 字节的数据分段(Seq Num 1、Next Seq Num 1431),因此在收到 No.1969-1971 三个数据分段后,客户端会依次响应 No.1972-1974 三个 ACK 数据包,包含 SACK 信息,并标识为 [TCP Dup ACK],重复三次#1-#3,这样服务器端触发产生了之前丢失分段的快速重传,即 No.1975 数据包。

  1. TCP Dup ACK + TCP Retransmission

一个看起来实际像是丢包,实际为乱序的场景。该数据包为客户端所抓取,No.33 和 No.34 为客户端所发送的数据分段,但在收到服务器端所返回的 No.36 Ack Num 11217 以及 SACK SLE=12168 SRE=12239 说明未收到 No.33,而收到了 No.34 数据包段,因此在客户端由 RACK 触发了重传了 No.33 数据包,也就是 No.37 Seq Num 11217,而在之后才收到了服务器端的 No.38 和 No.39 两个 Ack,其中 No.39 标识 [TCP Dup ACK] ,No.38 Ack Num 为 12239 , 而 No.39 Ack Num 也为 12239 + SACK SLE=11217 SRE=12168,说明在服务器端收到了两个同样的分段 Seq 11217 + Len 951 的数据段,也就是说 No.38 ACK 确认的是 No.33 原始数据段,而 No.39 ACK 确认的是 No.37 重传数据段。

  1. TCP Dup ACK + TCP Spurious Retransmission

一个 RTO 超时重传的场景,该数据包为客户端所抓取,对于服务器端所发送的 No.6 数据段,客户端由于延迟确认等原因,间隔 209ms 才发出 No.7 Ack 确认了该数据段,但同时此时在服务器端又因为 RTO 超时重传,对 No.6 进行了重传,也就是 No.8 数据包,标识 [TCP Spurious Retransmission],继而触发客户端发送了 No.9 ACK 数据包,标识 [TCP Dup ACK]

  1. TCP Dup ACK + TCP Out-Of-Order

一种数据包乱序的场景,该抓包点在客户端本地,服务器端所发送的数据分段在到达时即已发生了乱序,No.5 标识为 [TCP Previous segment not captured],之前应该还有两个 Len=1460 的分段,No.6 为其中一个乱序数据段,标识为 [TCP Out-Of-Order] ,之后客户端 No.7 Ack 确认了 No.5,标识为 [TCP Dup ACK],同时 SACK SLE=2921 SRE=4201,No.8 Ack Num 1461 + SACK SLE=2921 SRE=4201 确认了 No.6,之后才收到另外一个乱序数据段 No.9,最后回复 No.10 Ack Num 4201 。

  1. 看不到 TCP Out-Of-Order 的乱序

同样一种数据包乱序的场景,但是看不到乱序标识,这是正常的,只是抓包点的问题。该数据包为客户端所抓取,因为看到的客户端 No.3414 Len 1573 实际会大于 MTU 1380,但是在出本地网卡后,会变成两个数据包,一个 Len 1380,另一个 Len 193,再加 No.3415 Len 213,一共三个数据包到达了服务器,此时可能在中间网络传输中发生了乱序,数据分段顺序变成了 Len 193、Len 213、Len 1380,这样前两个数据包会触发服务器产生 No.3416-3417 ACK 数据包,标识为 [TCP Dup ACK],其中 No.3416 SLE=17956 SRE=18149 表明收到了 Len 193 的数据分段,No.3417 SLE=17956 SRE=18362 表明又收到了 Len 213 的数据分段,而在之后的 No.3420 ACK Num 18362 才表示收到了 Seq Num 18362 之前所有的数据分段。

总结

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

相关文章:

TCP Analysis Flags 之 TCP Dup ACK

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

r-and-r——提高长文本质量保证任务的准确性重新提示和上下文搜索的新方法可减轻大规模语言模型中的迷失在中间现象

概述 随着大规模语言模型的兴起&#xff0c;自然语言处理领域取得了重大发展。这些创新的模型允许用户通过输入简单的 "提示 "文本来执行各种任务。然而&#xff0c;众所周知&#xff0c;在问题解答&#xff08;QA&#xff09;任务中&#xff0c;用户在处理长文本时…...

光伏电站的方案PPT总结

现在的市面上每做一个项目&#xff0c;做个项目方案是必不可少的了&#xff0c;光伏电站的项目亦是如此&#xff0c;做一个既美观又有说服力的项目PPT方案就尤为重要&#xff0c;项目PPT方案的全面性&#xff0c;美观度更征服业主&#xff0c;拿下项目&#xff0c;下面我从鹧鸪…...

前端pdf预览方案

前端pdf预览方案 pdf预览一般不需要前端生成pdf文件&#xff0c;pdf文件一般是通过接口&#xff0c;获取pdf文件【responseType:‘blob’,】或二进制文件流【responseType: ‘arraybuffer’,】或者已有的pdf文件。 前端PDF预览通常是通过读取现有的PDF文件&#xff0c;并使用…...

java 深拷贝 浅拷贝 详解

在 Java 中&#xff0c;深拷贝和浅拷贝是对象拷贝&#xff08;复制&#xff09;时的两个重要概念&#xff0c;它们决定了拷贝后的对象与原对象之间的关联性。以下是深拷贝和浅拷贝的详解&#xff0c;包括定义、实现方式及其区别。 1. 概念解释 1.1 浅拷贝&#xff08;Shallow …...

针对git、giteeVSCode连接的使用 || Live Share插件使用

1.下载git 链接 打开终端&#xff0c;桌面鼠标右键 2.配置密钥 登录gitee。 设置密钥 查看官方文档 跟着教程 复制最后的输出进行密钥添加 验证是否添加成功 3.创建&连接远程仓库 创建仓库 git终端进行配置 远程仓库克隆到本地 桌面终端clone,克隆他人|自己的仓库到本地…...

如何解决Ubuntu 20.04中Vim编辑器在按下Ctrl+S时暂停响应的问题

如何解决Ubuntu 20.04中Vim编辑器在按下CtrlS时暂停响应的问题 在Ubuntu 20.04中使用Vim编辑器时&#xff0c;用户可能会遇到按下CtrlS后编辑器似乎“卡死”或无响应的情况。这个问题实际上源于历史悠久的终端行为&#xff0c;而非Vim本身或操作系统的缺陷。以下是详细的分析及…...

mybatisPlus打印sql配置

MyBatis-Plus 提供了方便的配置方式来打印 SQL 查询语句&#xff0c;以便进行调试和性能分析。可以通过配置 log 来输出 SQL 语句以及执行的参数。 方法 1&#xff1a;通过 application.properties 或 application.yml 配置打印 SQL 可以通过配置 application.properties 或 a…...

Redis 内存管理

参考&#xff1a;面试官&#xff1a;为什么 Redis 不立刻删除已经过期的数据&#xff1f; 目录 1.Redis 给缓存数据设置过期时间有什么用&#xff1f; 2.Redis 是如何判断数据是否过期的呢&#xff1f; 3.Redis 过期 key 删除策略了解么&#xff1f; 4.大量 key 集中过期怎…...

Excel表文本函数、日期和时间函数

一、文本函数 函数说明CHAR返回字符代码所对应的字符CLEAN删除文本中的所有不可打印字符CODE返回文本字符串首字符的代码CONCATENATE合并多个文本字符串EXACT检查两个文本是否完全相同FIND查找文本中某个字符串的位置LEFT从文本的左边开始返回指定数量的字符LEN返回文本字符串…...

从零到一:利用 AI 开发 iOS App 《震感》的编程之旅

在网上看到一篇关于使用AI开发的编程经历&#xff0c;分享给大家 作者是如何在没有 iOS 开发经验的情况下&#xff0c;借助 AI&#xff08;如 Claude 3 模型&#xff09;成功开发并发布《震感》iOS 应用。 正文开始 2022 年 11 月&#xff0c;ChatGPT 诞生并迅速引发全球关注。…...

基于Java Springboot幼儿园管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…...

Python小白学习教程从入门到入坑------习题课2(基础巩固)

目录 一、选择题 二、实战题 2.1 实战1&#xff1a;输入一个年份&#xff0c;判断是否是闰年 2.2 实战2&#xff1a;模拟10086查询功能 2.3 实战3&#xff1a;使用嵌套循环输出九九乘法表 2.4 实战4&#xff1a;猜数游戏 一、选择题 1、以下选项符合Python语法要求且能够…...

基于IPMI_SSH的服务器硬件监控指标解读

随着企业IT架构的日益复杂化&#xff0c;对服务器的实时监控和管理变得至关重要。监控易作为一款功能强大的监控软件&#xff0c;支持通过IPMI_SSH的方式对服务器硬件进行远程监控&#xff0c;确保服务器的稳定运行。本文将针对监控易中基于IPMI_SSH的服务器硬件监控指标进行解…...

数据结构-二叉树及其遍历

🚀欢迎来到我的【数据结构】专栏🚀 🙋我是小蜗,一名在职牛马。🐒我的博客主页​​​​​​ ➡️ ➡️ 小蜗向前冲的主页🙏🙏欢迎大家的关注,你们的关注是我创作的最大动力🙏🙏🌍前言 本篇文章咱们聊聊数据结构中的树,准确的说因该是只说一说二叉树以及相…...

(33)iptables设置防火墙策略常用命令(docker环境、非docker环境)

#普通环境&#xff08;非docker&#xff09; # 拒绝所有对端口 31001 的访问 iptables -A INPUT -p tcp --dport 31001 -j DROP # 允许 IP 地址 20.59.30.77 访问端口 31001 (此处用的是虚拟机 所以要使用nat地址的网关) iptables -I INPUT 1 -p tcp -s 20.59.30.77 --dpor…...

fastadmin中动态下拉组件(SelectPage)的使用

实现的功能如下&#xff1a; 1、支持模糊搜索&#xff1b;2、分页功能&#xff1b;3支持多选 官方文档&#xff1a;https://doc.fastadmin.net/doc/178.html html页面引用组件 <div class"form-group"><label class"control-label col-xs-12 col-sm-2…...

通过Python 调整Excel行高、列宽

在Excel中&#xff0c;默认的行高和列宽可能不足以完全显示某些单元格中的内容&#xff0c;特别是当内容较长时。通过调整行高和列宽&#xff0c;可以确保所有数据都能完整显示&#xff0c;避免内容被截断。合理的行高和列宽可以使表格看起来更加整洁和专业&#xff0c;尤其是在…...

力扣-Mysql-3278. 寻找数据科学家职位的候选人 II(中等)

一、题目来源 3278. 寻找数据科学家职位的候选人 II - 力扣&#xff08;LeetCode&#xff09; 二、数据表结构 表&#xff1a;Candidates ----------------------- | Column Name | Type | ----------------------- | candidate_id | int | | skill | varch…...

Android笔记(三十六):封装一个Matrix从顶部/底部对齐的ImageView

背景 ImageView的scaleType默认显示图片是这样&#xff0c;但是有时候设计稿需求希望图片左右能紧贴着ImageView左右边缘&#xff0c;又不破坏图片的比例&#xff0c;用自带的matrix&#xff0c;centerCrop等都可以满足 但是都会造成图片的某些区域被裁剪了&#xff0c;如果设…...

探索二维非常规态型近场动力学代码

非常规态型近场动力学代码 纬度&#xff1a;二维&#xff1b; 时间积分&#xff1a;自适应动态松弛 or verlet-velocity; 零能抑制模式&#xff1a;silling method or Li pan method; 语言&#xff1a;MATLAB 代码注释详细&#xff0c;可适当在数值模拟领域&#xff0c;近场动力…...

嵌入式新手入门:用快马平台生成带详细注释的LED控制项目

作为一个嵌入式开发新手&#xff0c;刚开始接触STM32时确实有点懵。寄存器配置、时钟树、GPIO模式这些概念扑面而来&#xff0c;光看理论文档很容易失去方向。最近我发现用InsCode(快马)平台生成带详细注释的基础项目特别适合入门&#xff0c;今天就以最经典的LED流水灯为例&am…...

Path of Building完全指南:精准规划角色构筑3步法+高效配置策略

Path of Building完全指南&#xff1a;精准规划角色构筑3步法高效配置策略 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/gh_mirrors/pat/PathOfBuilding Path of Building是一款强大的离线工具&#xff0c…...

sklearn分类指标实战:如何用precision_recall_curve优化你的模型效果

sklearn分类指标实战&#xff1a;如何用precision_recall_curve优化模型效果 在机器学习项目中&#xff0c;分类模型的评估往往比训练过程更考验数据科学家的专业素养。当你的模型在测试集上达到95%的准确率时&#xff0c;是否就意味着可以高枕无忧&#xff1f;现实情况往往复杂…...

4个突破式步骤:哔咔漫画下载解决方案

4个突破式步骤&#xff1a;哔咔漫画下载解决方案 【免费下载链接】picacomic-downloader 哔咔漫画 picacomic pica漫画 bika漫画 PicACG 多线程下载器&#xff0c;带图形界面 带收藏夹&#xff0c;已打包exe 下载速度飞快 项目地址: https://gitcode.com/gh_mirrors/pi/picac…...

终极Modbus测试工具:OpenModScan让工业通讯调试变得前所未有的简单

终极Modbus测试工具&#xff1a;OpenModScan让工业通讯调试变得前所未有的简单 【免费下载链接】OpenModScan Open ModScan is a Free Modbus Master (Client) Utility 项目地址: https://gitcode.com/gh_mirrors/op/OpenModScan 在工业自动化领域&#xff0c;Modbus协议…...

英雄联盟LCU工具集:3大核心功能如何提升你的游戏体验?

英雄联盟LCU工具集&#xff1a;3大核心功能如何提升你的游戏体验&#xff1f; 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit Lea…...

MXNet多语言生态:Python到Java/C++的跨平台部署

MXNet多语言生态&#xff1a;Python到Java/C的跨平台部署 文章详细介绍了MXNet深度学习框架的多语言支持能力&#xff0c;重点阐述了从Python训练环境到Java/C生产环境的完整部署流程。内容涵盖Python API的深度使用指南&#xff0c;包括NDArray高效张量计算、Symbolic编程的计…...

OpenClaw技能开发入门:基于百川2-13B-4bits制作天气查询插件

OpenClaw技能开发入门&#xff1a;基于百川2-13B-4bits制作天气查询插件 1. 为什么选择OpenClaw开发个人技能&#xff1f; 去年冬天&#xff0c;我每天早上都要手动查询天气决定穿衣厚度&#xff0c;直到发现OpenClaw可以通过自然语言指令自动完成这类重复任务。作为一个开源…...

避开C盘爆满!保姆级教程:在D盘安装Unity 2023.2f1c1和VS2022社区版

避开C盘爆满&#xff01;保姆级教程&#xff1a;在D盘安装Unity 2023.2f1c1和VS2022社区版 对于刚接触游戏开发的新手来说&#xff0c;安装Unity和Visual Studio往往是遇到的第一个"拦路虎"。更让人头疼的是&#xff0c;这两个"重量级"开发工具默认都会占…...