在线h5制作工具/seo推广网址
前言
默认情况下,Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态,并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时,会对每个 TCP 数据包进行一次分析,数据包按照它们在数据包列表中出现的顺序进行处理。可以通过 “Analyze TCP sequence numbers” TCP 解析首选项启用或禁用此功能。
TCP 分析展示
在数据包文件中进行 TCP 分析时,关于 “TCP Dup ACK” 一般是如下显示的,包括:
- Packet List 窗口中的 Info 信息列,以 [TCP Dup ACK #] 黑底红字进行标注;
- 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;}}
- next expected sequence number,为 nextseq,定义为 highest seen nextseq。
- 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 caputred
、TCP Fast Retransmission
、TCP Spurious Retransmission
等信息,当然有时也会单独出现。
- 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 数据包。
- 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 重传数据段。
- 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]
。
- 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 。
- 看不到 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
前言 默认情况下,Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态,并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时,会对每个 TCP 数据包进行一次分析,数据包按照它们在数据包列表中出现的顺序进行处理。可…...

r-and-r——提高长文本质量保证任务的准确性重新提示和上下文搜索的新方法可减轻大规模语言模型中的迷失在中间现象
概述 随着大规模语言模型的兴起,自然语言处理领域取得了重大发展。这些创新的模型允许用户通过输入简单的 "提示 "文本来执行各种任务。然而,众所周知,在问题解答(QA)任务中,用户在处理长文本时…...

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

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

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

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

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

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

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

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

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

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

Python小白学习教程从入门到入坑------习题课2(基础巩固)
目录 一、选择题 二、实战题 2.1 实战1:输入一个年份,判断是否是闰年 2.2 实战2:模拟10086查询功能 2.3 实战3:使用嵌套循环输出九九乘法表 2.4 实战4:猜数游戏 一、选择题 1、以下选项符合Python语法要求且能够…...

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

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

(33)iptables设置防火墙策略常用命令(docker环境、非docker环境)
#普通环境(非docker) # 拒绝所有对端口 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)的使用
实现的功能如下: 1、支持模糊搜索;2、分页功能;3支持多选 官方文档: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中,默认的行高和列宽可能不足以完全显示某些单元格中的内容,特别是当内容较长时。通过调整行高和列宽,可以确保所有数据都能完整显示,避免内容被截断。合理的行高和列宽可以使表格看起来更加整洁和专业,尤其是在…...

力扣-Mysql-3278. 寻找数据科学家职位的候选人 II(中等)
一、题目来源 3278. 寻找数据科学家职位的候选人 II - 力扣(LeetCode) 二、数据表结构 表:Candidates ----------------------- | Column Name | Type | ----------------------- | candidate_id | int | | skill | varch…...

Android笔记(三十六):封装一个Matrix从顶部/底部对齐的ImageView
背景 ImageView的scaleType默认显示图片是这样,但是有时候设计稿需求希望图片左右能紧贴着ImageView左右边缘,又不破坏图片的比例,用自带的matrix,centerCrop等都可以满足 但是都会造成图片的某些区域被裁剪了,如果设…...

web 入门
学习 Web 开发的基础,建议从以下几个方面入门,按步骤循序渐进学习核心知识: 1. 了解 Web 的基础概念 在开始编码之前,先理解 Web 开发的基本工作原理: Web 前端与后端: 前端:负责用户界面和用…...

京东 2025届秋招 自然语言处理
文章目录 个人情况一面/HR面 10min二面/技术面 1h三面/技术面 1h四面/线下HR面 20min 个人情况 先说一下个人情况: 学校情况:211本中9硕,本硕学校都一般,本硕都是计算机科班,但研究方向并不是NLP,而是图表…...

Mybatis框架之模板方法模式 (Template Method Pattern)
MyBatis 中也使用到了 模板方法模式 (Template Method Pattern),主要体现在 执行 SQL 语句的流程控制 上。模板方法模式允许 MyBatis 定义数据库操作的标准流程,并允许子类或特定实现类去实现某些步骤。这种模式使得 MyBatis 能够在处理不同类型的 SQL 操…...

【进阶系列】python简单爬虫实例
python有一个很强大的功能就是爬取网页的信息,这里是CNBlogs 网站,我们将以此网站为实例,爬取指定个页面的大标题内容。代码如下: 首先是导入库: # 导入所需的库 import requests # 用于发送HTTP请求 from bs4 impor…...

️虚拟机配置NAT和Bridge模式
虚拟机的网络配置 桥接 通过使用物理机网卡 具有单独ip NAT 把物理机为路由器进行上网 NAT模式: 所谓nat模式,就是虚拟系统会通过宿主机的网络来访问外网,而这里的宿主机相当于有两个网卡,一个是真实网卡,一个是虚拟…...

解决Spring Boot整合Redis时的连接问题
前言 在使用Spring Boot整合Redis的过程中,经常会遇到连接问题,尤其是当Redis服务部署在远程服务器上时。 问题描述 当你尝试连接到Redis服务器时,可能会遇到以下错误: org.springframework.data.redis.connection.PoolExcept…...

109. UE5 GAS RPG 实现检查点的存档功能
在这一篇文章里,我们接着实现存档的功能,保存当前玩家的生成位置,游戏里有很多中方式去实现玩家的位置存储,这里我们采用检查点的方式,当玩家接触到当前检查点后,我们可以通过检查点进行保存玩家的状态&…...

springboot005基于springboot学生心理咨询评估系统得设计与实现。
项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…...

ESC算法/逃生:一种基于人群疏散行为的优化方法
文章介绍了一种有用的算法,称为逃生或逃生算法(ESC),受人群疏散行为的启发,用于解决现实世界的案例和基准问题。ESC算法模拟了疏散过程中人群的行为,其中人群在探索阶段被分为平静、羊群和恐慌组࿰…...

构建安全的数据库环境:群晖NAS安装MySQL和phpMyAdmin详细步骤
文章目录 前言1. 安装MySQL2. 安装phpMyAdmin3. 修改User表4. 本地测试连接MySQL5. 安装cpolar内网穿透6. 配置MySQL公网访问地址7. 配置MySQL固定公网地址8. 配置phpMyAdmin公网地址9. 配置phpmyadmin固定公网地址 前言 本文将详细讲解如何在群晖NAS上安装MySQL及其数据库管理…...