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

TCP Analysis Flags 之 TCP Keep-Alive

前言

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

TCP 分析展示

在 TCP 分析中和 TCP Keep-Alive 相关的实际上有两种信息,分别是:TCP Keep-AliveTCP Keep-Alive ACK 。实际运行环境中,有时 TCP Keep-Alive 单独出现的,因为有可能对端未确认 ,有时是一起出现的,也就是对端对 TCP Keep-Alive 数据包进行了确认,回复了 TCP Keep-Alive ACK 数据包。

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

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

TCP Keep-Alive 定义

实际在 TCP 分析中,关于 TCP Keep-AliveTCP Keep-Alive ACK 相关的定义也相对简单,主要说明如下:

  1. TCP Keep-Alive

当 TCP 数据段大小为 0 或 1 时设置,当前序列号比下一个期望的序列号小 1 字节,并且没有设置 SYN、FIN 或 RST。

替代 Fast RetransmissionOut-Of-OrderSpurious RetransmissionRetransmission

Set when the segment size is zero or one, the current sequence number is one byte less than the next expected sequence number, and none of SYN, FIN, or RST are set.Supersedes “Fast Retransmission”, “Out-Of-Order”, “Spurious Retransmission”, and “Retransmission”.

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

具体的代码如下,总的来说这段代码的作用是检测出 TCP 保活包,并对其进行适当的标记,以便 Wireshark 能够正确识别和显示这种特殊的 TCP 控制数据包,帮助分析长连接的保活状态。这段代码的主要逻辑如下,如果所有下述条件均满足,则认为该数据包是一个保活探测包。

  • 检查 TCP 段大小是否为 0 或 1 字节;
  • 检查 Seq Num 比同方向之前的下一个期望的 Seq Num 少 1;
  • 检查当前数据包是否不是 SYN/FIN/RST 数据包。
    /* KEEP ALIVE* a keepalive contains 0 or 1 bytes of data and starts one byte prior* to what should be the next sequence number.* SYN/FIN/RST segments are never keepalives*/if( (seglen==0||seglen==1)&&  seq==(tcpd->fwd->tcp_analyze_seq_info->nextseq-1)&&  (flags&(TH_SYN|TH_FIN|TH_RST))==0 ) {if(!tcpd->ta) {tcp_analyze_get_acked_struct(pinfo->num, seq, ack, TRUE, tcpd);}tcpd->ta->flags|=TCP_A_KEEP_ALIVE;}
  1. TCP Keep-Alive ACK

当以下所有条件都为真时设置该标志:

  • TCP 段大小为 0
  • 窗口大小非零且没有改变
  • Seq Num 等于之前下一个期望的 Seq Num
  • ACK Num 等于之前的 LastACK Num
  • 最近看到的一个反向数据包是 Keep-Alive
  • SYN、FIN、RST 均未设置

替代 Dup ACKZeroWindowProbeAck

Set when all of the following are true:The segment size is zero.
The window size is non-zero and hasn’t changed.
The current sequence number is the same as the next expected sequence number.
The current acknowledgment number is the same as the last-seen acknowledgment number.
The most recently seen packet in the reverse direction was a keepalive.
The packet is not a SYN, FIN, or RST.Supersedes “Dup ACK” and “ZeroWindowProbeAck”.

具体的代码如下,总的来说这段代码的作用是检测对 TCP 保活包的 ACK 响应,并对其进行适当的标记,以便 Wireshark 能够正确分析和显示 TCP 长连接的保活状态。这段代码的主要逻辑如下,如果所有下述条件均满足,则认为该数据包是一个保活探测响应包。

  • 检查 TCP 段大小是否为 0;
  • 检查窗口大小是否不为 0;
  • 检查当前窗口大小与同方向之前窗口大小是否相同;
  • 检查 Seq Num 是否等于同方向之前下一个期望的 Seq Num;
  • 检查 ACK Num 是否等于同方向之前的 LastACK Num;
  • 检查反方向上一个数据包是否是 TCP Keep-Alive;
  • 检查当前数据包是否不是 SYN/FIN/RST 数据包。
    /* KEEP ALIVE ACK* It is a keepalive ack if it repeats the previous ACK and if* the last segment in the reverse direction was a keepalive*/if( seglen==0&&  window&&  window==tcpd->fwd->window&&  seq==tcpd->fwd->tcp_analyze_seq_info->nextseq&&  ack==tcpd->fwd->tcp_analyze_seq_info->lastack&& (tcpd->rev->lastsegmentflags&TCP_A_KEEP_ALIVE)&&  (flags&(TH_SYN|TH_FIN|TH_RST))==0 ) {if(!tcpd->ta) {tcp_analyze_get_acked_struct(pinfo->num, seq, ack, TRUE, tcpd);}tcpd->ta->flags|=TCP_A_KEEP_ALIVE_ACK;goto finished_fwd;}
  1. next expected sequence number,为 nextseq,定义为 highest seen nextseq。
  2. lastack,定义为 Last seen ack for the reverse flow。

Packetdrill 示例

在上述 TCP Keep-AliveTCP Keep-Alive ACK 定义和代码可知,TCP 分析的逻辑相对比较简单,因此通过 packetdrill 比较容易模拟出相关现象。

# cat tcp_keep_alive.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 1000 <mss 1460>
+0 > S. 0:0(0) ack 1 <...>
+0.01 < . 1:1(0) ack 1 win 1000+0 accept(3, ..., ...) = 4
+.1 write(4, ..., 500) = 500
+0 > P. 1:501(500) ack 1
+0.1 < . 1:1(0) ack 501 win 1000+0.1 < . 0:0(0) ack 501 win 1000
#

经 Wireshark 展示如下,可以看到满足判断条件后,No.6 标识 [TCP Keep-Alive] ,No.7 标识 [TCP Keep-Alive ACK] ,此时 No.6 的 TCP Len 长度为 0 字节。

同样,可以验证一下 TCP Keep-Alive 数据包 TCP Len 长度为 1 字节的场景,这在 RFC9293 中也明确说明,0 或 1 字节都可以。

# cat tcp_keep_alive_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 1000 <mss 1460>
+0 > S. 0:0(0) ack 1 <...>
+0.01 < . 1:1(0) ack 1 win 1000+0 accept(3, ..., ...) = 4
+.1 write(4, ..., 500) = 500
+0 > P. 1:501(500) ack 1
+0.1 < . 1:1(0) ack 501 win 1000+0.1 < . 0:1(1) ack 501 win 1000
#

经 Wireshark 展示如下,可以看到满足判断条件后,No.6 标识 [TCP Keep-Alive] ,No.7 标识 [TCP Keep-Alive ACK] ,此时 No.6 的 TCP Len 长度为 1 字节。

实例

关于 TCP Keep-Alive 的实例,正常来说日常抓包中应该比较少看到,TCP Keep-Alive 数据包必须仅在没有未完成的发送数据,且在一定时间间隔内没有收到连接的数据或确认数据包时发送,默认的时间间隔为 2 小时,相对来说很长。

  1. TCP Keep-Alive Len 0 场景

TCP Keep-Alive 数据包 TCP Len 为 0 的场景相对来说更容易碰到。如下 TCP 流在经过 45 秒间隔后,客户端发出了 No.579 [TCP Keep-Alive] , 此时 TCP Len 为 0,之后服务器端响应 No.580 [TCP Keep-Alive ACK]

  1. TCP Keep-Alive Len 1 场景

TCP Keep-Alive 数据包 TCP Len 为 1 的场景相对来说少见。如下 TCP 流在经过 45 秒间隔后,客户端发出了 No.151 [TCP Keep-Alive] , 此时 TCP Len 为 1,之后服务器端响应 No.152 [TCP Keep-Alive ACK],之后每经过 45 间隔后,就继续保活检测和响应。

此案例有意思的是,No.151 TCP Keep-Alive 数据包 Seq Num 为 1155,TCP Len 为 1 ,相较于 No.124 Next Seq Num 1156 以及 No.125 ACK Num 1156,No.151 实际上回退了 1 字节,即所携带的 1 字节数据段为垃圾数据,而对于 No.152 在收到该数据后,除了响应标记 TCP Keep-Alive ACK 之外,同时会标记 [SLE==1155 SRE==1156],说明这 1 个字节的数据之前已收到过,属于重复数据,这属于该 TCP 流建连时均支持 SACK ,其中 D-SACK 的功能实现。

  1. TCP Keep-Alive 无响应场景

无响应的场景没有什么太多要说的,这也是网上经常讨论的,没有数据传输的时候,对端主机宕机或是什么拔掉网线的场景。一端到了规定的时间之后,即发出 TCP Keep-Alive 数据包,对端如果无响应,则每间隔一段时间继续发送探测,持续规定的一定次数之后,中断该连接。在 Linux 内核可以有对应的参数可以设置保活时间、保活探测的次数、保活探测的时间间隔,以下都为默认值:

net.ipv4.tcp_keepalive_time=7200
net.ipv4.tcp_keepalive_intvl=75  
net.ipv4.tcp_keepalive_probes=9
  1. 不是 TCP Keep-Alive 的 TCP Keep-Alive 的场景一

一个特殊的例子,仔细看 No.1-2,再对比下标记成 TCP Keep-AliveTCP Keep-Alive ACK 的 No.134-135,你会发现实际的 Seq Num、ACK Num、TCP Len 以及 SLE SRE 基本都是一模一样的。

No.134-135 是 TCP Keep-AliveTCP Keep-Alive ACK,为什么 No.1-2 在这不是?真实的答案是,No.1-2 也是一对 TCP Keep-AliveTCP Keep-Alive ACK 数据包。原因自然是关于数据包跟踪文件中上下文的关系,对于 No.1-2 数据包,它们是这个 TCP 流中抓取的前两个数据包,从 Wireshark 代码判断条件下,它是无法匹配 TCP Keep-AliveTCP Keep-Alive ACK 的判断条件的,因此 No.1-2 不会标记,但实际确实是。

对比一下案例2,和案例4取自同一个跟踪文件,只不过案例2的TCP流中抓取到了前置数据包 No.123-125,因此后续的 TCP Keep-Alive 均能正常识别,而案例4缺少前置数据包,No.1-2 因此不会标记,空空如也。

  1. 不是 TCP Keep-Alive 的 TCP Keep-Alive 的场景二

另一个特殊的例子,其实原因是一样的,均是在 TCP 流中缺少前置数据包,只不过案例 4 中没有任何标记,而在此案例中会被标识为其它,也影响一定判断。

数据包 No.1-2 的类型实际上也是一对 TCP Keep-AliveTCP Keep-Alive ACK 数据包。因为捕获数据包并未抓到之前的包,Wireshark 无法根据上文判断,所以并未标记成 TCP Keep-Alive 数据包,造成之后的数据包 No.2-4 进行 TCP 分析判断时出现偏差,认为是存在丢包情况。

该案例之前在《丢包?不要轻易下结论续》有详细解释,有兴趣的可以瞅瞅。


总结

看似简单的 TCP Keep-Alive ,其实也有大学问,不是嘛。

相关文章:

TCP Analysis Flags 之 TCP Keep-Alive

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

mfc140u.dll丢失怎么办? mfc140u.dll文件缺失的修复技巧

mfc140u.dll 是 Microsoft Foundation Classes (MFC) 库的一部分&#xff0c;它是 Visual Studio 2015 的组件之一&#xff0c;主要服务于使用 C 编写的 Windows 应用程序。这个动态链接库文件包含了 MFC 14.0 Unicode 版本的实现代码&#xff0c;为应用程序提供运行时支持。当…...

Spring Security使用

文章目录 Spring Security的起点FilterChain重写重写登录验证逻辑增加CSRF Token增加方法权限校验 Spring Security的起点 在AbstractApplicationContext.refresh()方法时&#xff0c;子类ServletWebServerApplicationContext会创建一个ServletContextInitializerBeans这个Bea…...

CSS网页布局综合练习(涵盖大多CSS知识点)

该综合练习就是为这个学校静态网页设置CSS样式&#xff0c;使其变成下面的模样 其基本骨架代码为&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content…...

解决 Hardhat Verify 超时

问题背景 今天在学习使用Hardhat进行verify 合约 到 Ethscan的时候&#xff0c;出现了如下报错 fafafafadeMacBook-Air Web3_Solidity_Study % npx hardhat verify --network sepolia XXXXXXXXXXXXXXXXXXXXXXXX "10" Successfully verifie…...

ACIS创建各种基本体,举例说明

ACIS&#xff08;Advanced CAD Interoperability System&#xff09;是一个广泛使用的三维几何建模内核&#xff0c;它支持创建和操作各种基本的三维几何体。虽然ACIS没有专门的函数来直接创建某些特定的基本体&#xff08;如椭球体&#xff09;&#xff0c;但可以通过一系列变…...

[CISCN 2019华北]PWN1-好久不见7

Partial RELRO 表示部分 RELRO 保护已启用。在这种情况下&#xff0c;只有某些部分&#xff08;如 GOT 中的只读部分&#xff09;是只读的。 NX enabled 表示这个二进制文件启用了 NX 保护&#xff0c;数据段是不可执行的。这可以防止某些类型的代码注入攻击。 这里是ida识别…...

代码随想录day16| 513找树左下角的值 、 路径总和 、 从中序与后序遍历序列构造二叉树

代码随想录day16| 找树左下角的值 、 路径总和 、 从中序与后序遍历序列构造二叉树 513找树左下角的值层序遍历法递归法 路径总和112. 路径总和113. 路径总和 II 从中序与后序遍历序列构造二叉树思路 513找树左下角的值 层序遍历法 使用层序遍历&#xff0c;找到最后一层最左边…...

使用 MMDetection 实现 Pascal VOC 数据集的目标检测项目练习(二) ubuntu的下载安装

首先&#xff0c;Linux系统是人工智能和深度学习首选系统。原因如下: 开放性和自由度&#xff1a;Linux 是一个开源操作系统&#xff0c;允许开发者自由修改和分发代码。这在开发和研究阶段非常有用&#xff0c;因为开发者可以轻松地访问和修改底层代码。社区支持&#xff1a;…...

书生大模型实战营(第四期)——入门岛

第 1 关 Linux 前置基础 闯关任务完成SSH连接与端口映射并运行hello_world.py10min可选任务 1将Linux基础命令在开发机上完成一遍10min可选任务 2使用 VSCODE 远程连接开发机并创建一个conda环境10min 完成SSH连接 创建python文件 建环境 运行 第 2 关 Python 前置基础 Leet…...

压强随着时间的变化

import numpy as np import matplotlib.pyplot as plt# 参数设置 L 50 # 长度 (m) D 4 # 直径 (m) d 0.01 # 洞的直径 (m) P0 101300 # 初始压力 (Pa) P_final 0.3 * P0 # 最终压力 (Pa) R 287 # 理想气体常数 (J/(kgK)) T 20 273.15 # 温度 (K) M 0.029 # 空…...

2024年大厂AI大模型面试题精选与答案解析

前言 随着AI市场&#xff0c;人工智能的爆火&#xff0c;在接下来的金九银十招聘高峰期&#xff0c;各大科技巨头和国有企业将会对AGI人才的争夺展开一场大战&#xff0c;为求职市场注入了新的活力。 为了助力求职者在面试中展现最佳状态&#xff0c;深入理解行业巨头的选拔标…...

Linux开发讲课47--- 详解 Linux 中的虚拟文件系统

虚拟文件系统是一种神奇的抽象&#xff0c;它使得 “一切皆文件” 哲学在 Linux 中成为了可能。 什么是文件系统&#xff1f;根据早期的 Linux 贡献者和作家 Robert Love 所说&#xff0c;“文件系统是一个遵循特定结构的数据的分层存储。” 不过&#xff0c;这种描述也同样适用…...

全球银行常用英语

Earn OCBC$ or 90 Miles or VOYAGE Miles today! Get the most out of your OCBC Card with OCBC Privileges. 今天赚取华侨银行美元或 90 英里或航程英里&#xff01;通过华侨银行特权充分利用您的华侨银行卡。 Check out the rewards catalogue. Apply for a OCBC Credit Car…...

新160个crackme -090-tc.12

运行分析 需要破解注册码 PE分析 Delphi程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida搜不到字符串&#xff0c;根据Deiphi程序的结构&#xff0c;直接打开来到start函数&#xff0c;找到CreateForm函数的参数off_445FC4&#xff0c;双击 逐个查找偏移&…...

Swagger文档-Unable to scan documentation context default报错

文章目录 报错情况&#xff1a; Unable to scan documentation context 管理端接口发生情况一&#xff1a;发生情况三&#xff1a; 报错情况&#xff1a; Unable to scan documentation context 管理端接口 报错日志&#xff1a; 2024-11-03 12:40:27.427 ERROR 3340 --- [ …...

SpringKafka生产者、消费者消息拦截

1 前言 在Spring Kafka中&#xff0c;可以通过配置拦截器来实现对生产者和消费者消息的拦截。拦截器可以用来记录日志、修改消息等等。 2 基于Kafka管理的拦截器 Kafka原生提供的拦截器接口是org.apache.kafka.clients.producer.ProducerInterceptor和 org.apache.kafka.cli…...

Qt报错QOCI driver not loaded且QOCI available的解决方法

参考 Linux Qt 6安装Oracle QOCI SQL Driver插件&#xff08;适用WSL&#xff09; 安装 QOCI 插件完成后运行 Qt 项目报错&#xff1a; qt.sql.qsqldatabase: QSqlDatabase: QOCI driver not loaded qt.sql.qsqldatabase: QSqlDatabase: available drivers: QMIMER QPSQL QODBC…...

python mac vscode 脚本文件的运行

切换到脚本文件的目录下 路径的修改 当前文件组织形式&#xff1a; 脚本文件在文件夹下&#xff1a; 赋予权限&#xff1a;chmod x ./scripts/fscd_test.sh 运行&#xff1a;./scripts/fscd_test.sh...

Linux之du命令

华子目录 du命令常用选项示例注意事项 du命令 du&#xff08;Disk Usage&#xff09;命令是用于在类Unix操作系统&#xff08;如Linux和macOS&#xff09;中显示文件和目录所占用的磁盘空间大小的工具。它可以递归地计算目录和文件的磁盘使用情况&#xff0c;并提供详细的报告…...

WRF-LES与PALM微尺度气象大涡模拟

针对微尺度气象的复杂性&#xff0c;大涡模拟&#xff08;LES&#xff09;提供了一种无可比拟的解决方案。微尺度气象学涉及对小范围内的大气过程进行精确模拟&#xff0c;这些过程往往与天气模式、地形影响和人为因素如城市布局紧密相关。在这种规模上&#xff0c;传统的气象模…...

桌面程序开发框架选择

桌面程序开发框架选择 1、WinForm(Windows Form)优点缺点 2、WPF(Windows Presentation Foundation)优点缺点 3、Electron优点缺点 4、Delphi优点缺点 5、QT优点缺点 6、MFC(Microsoft Foundation Class Library)优点缺点 7、JavaFX优点缺点 8、SwingAWT9、Avalonia10、Flutter…...

Vue项目开发:Vuex使用,表单验证配置,ESLint关闭与常见问题解决方案

文章目录 vuexvue配置form表单验证移除vue中表单验证的两种方法关闭vue项目的eslint代码校验做vue项目出现的问题 vuex Vue提供的状态管理工具&#xff0c;用于统一管理我们项目中各种数据的交互和重用&#xff0c;存储我们需要用到的数据对象属性 state&#xff1a;vuex的基本…...

源鲁杯2024赛题复现Web Misc部分WP

MISC [Round 1] whatmusic 拿到题目&#xff0c;一个password和加密的压缩包 查看password的文件尾 这里会发现是png文件的文件头&#xff0c;逆序输出&#xff0c;并保存为1.png。得到一个图片&#xff0c; 进行CRC爆破&#xff0c;发现宽高被修改&#xff0c;之后拿到压缩…...

【企业微信新版sdk】

wecom 的引入使用 一、引入wecom二、封装函数三、使用测试 一、引入wecom 1、企业微信 WECOM-JSSDK提供了 npm 和 cdn 两种引入途径。1.1、 npm 引入 npm install wecom/jssdk1.2、安装后引入 import * as ww from wecom/jssdk通过 script 标签引入 <script src"ht…...

web安全测试渗透案例知识点总结(下)——小白入狱

目录 [TOC](目录)一、更多详细的实际案例教程案例1&#xff1a;文件上传漏洞利用案例2&#xff1a;目录遍历&#xff08;Path Traversal&#xff09;漏洞检测案例3&#xff1a;暴力破解登录密码案例4&#xff1a;命令注入漏洞案例5&#xff1a;身份认证绕过&#xff08;Passwor…...

【专题】数据库的安全性

1. 数据库安全性概述 数据库存在的不安全因素&#xff1a; 非授权用户对数据库的恶意存取和破坏&#xff1b; 数据库中重要或敏感的数据被泄露&#xff1b; 安全环境的脆弱性。 数据库的安全性与计算机系统的安全性&#xff0c;包括计算机硬件、操作系统、网络系统等的安全…...

【含开题报告+文档+源码】基于Java的房屋租赁服务系统设计与实现

开题报告 随着城市化进程的加速和人口流动性的增加&#xff0c;租房需求不断增长。传统的租赁方式往往存在信息不对称、流程不规范等问题&#xff0c;使得租户和房东的租赁体验不佳。而而房屋租赁系统能够提供便捷、高效的租赁服务&#xff0c;满足租户和房东的需求。房屋租赁…...

数据结构模拟题[十]

数据结构试卷&#xff08;十&#xff09; 一、选择题 (24 分) 1&#xff0e;下列程序段的时间复杂度为&#xff08; &#xff09;。 i0 &#xff0c;s0&#xff1b; while (s<n) {ssi &#xff1b;i &#xff1b;} (A) O(n 1/2 ) (B) O(n 1/3 ) (C) O(n) (D) O(n 2 ) …...

Java基于微信小程序的美食推荐系统(附源码,文档)

博主介绍&#xff1a;✌程序猿徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…...