TCP Analysis Flags 之 TCP ZeroWindow

ops/2024/9/19 20:13:41/ 标签: tcp/ip, 网络, 网络协议, wireshark, tcpdump

前言

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

TCP 分析展示

在 TCP 分析中和 TCP 零窗口相关的实际上有三种信息,分别是:TCP ZeroWindowTCP ZeroWindowProbeTCP ZeroWindowProbeAck 。实际运行环境中,有时是单独出现的,譬如 TCP ZeroWindow ,有时是一起出现的,也就是出现了零窗口,之后就会出现需要为恢复窗口而进行的零窗口探测和零窗口探测确认。

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

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

TCP ZeroWindow 定义

实际在 TCP 分析中,关于 TCP ZeroWindow 相关的定义也相对简单,当接收窗口大小为 0 且 SYN、FIN、RST 均未设置时设置, 是接收方发送,用以通知发送方暂停发送数据。

Set when the receive window size is zero and none of SYN, FIN, or RST are set.The window field in each TCP header advertises the amount of data a receiver can accept. If the receiver can’t accept any more data it will set the window value to zero, which tells the sender to pause its transmission. In some specific cases this is normal — for example, a printer might use a zero window to pause the transmission of a print job while it loads or reverses a sheet of paper. However, in most cases this indicates a performance or capacity problem on the receiving end. It might take a long time (sometimes several minutes) to resume a paused connection, even if the underlying condition that caused the zero window clears up quickly.

具体的代码如下,总的来说这段代码是 Wireshark 分析 TCP 流量时处理零窗口通告情况的一个关键部分,有助于正确解析和显示 TCP 连接的状态和控制信息。如果当接收窗口大小为 0 和 SYN、FIN、RST 均未设置这两个条件同时满足时,则认为该数据包是一个零窗口通告,零窗口通告表示接收方暂时没有可用缓冲区来接收数据,因此通知发送方暂停发送数据。

    /* ZERO WINDOW* a zero window packet has window == 0   but none of the SYN/FIN/RST set*/if( window==0&& (flags&(TH_RST|TH_FIN|TH_SYN))==0 ) {if(!tcpd->ta) {tcp_analyze_get_acked_struct(pinfo->num, seq, ack, TRUE, tcpd);}tcpd->ta->flags|=TCP_A_ZERO_WINDOW;}

Packetdrill 示例

根据上述 TCP ZeroWindow 定义和代码说明,TCP 分析的逻辑很简单,因此通过 packetdrill 比较容易模拟出相关现象。

# cat tcp_zero_window.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, ..., 1000) = 1000
+0 > P. 1:1001(1000) ack 1
+0.1 < . 1:1(0) ack 1001 win 0
# 

经 Wireshark 展示如下,No.6 因为 Win 为 0 且未设置 SYN、FIN、RST 的情况下,标识为 [TCP ZeroWindow]

实例

关于 TCP ZeroWindow 的实例,实际日常抓包中并不是经常会看到,但如果看到了,则代表着本端接收窗口为 0 ,意味着本端因性能或容量等问题而无法接收数据,因此通知发送方暂停发送数据,如果窗口恢复时间较长,TCP 传输速率自然就下降了,再反复出现的话,应用传输就会明显感觉慢。在不同的场景下,也会伴生着出现像是 TCP Window UpdateTCP ZeroWindowProbeTCP ZeroWindowProbeAck 等信息。

  1. TCP Window Full + TCP ZeroWindow + TCP Window Update

一种比较常见的零窗口情景,接收端短暂的出现 Win 为 0 的情形,紧接着就会释放窗口,发出窗口更新的消息。

首先服务器端发送数据,发现客户端接收窗口满了,则在 No.278 上标识 [TCP Window Full] ,此时客户端 No.281 因为 Win 为 0 且未设置 SYN、FIN、RST 的情况下,标识为 [TCP ZeroWindow],之后 12ms 紧接着就发送了 [TCP Window Update] 窗口更新消息,Win 恢复成 4536,该交互过程并没有出现 [TCP ZeroWindowProbe] 等数据包。

  1. TCP Window Full + TCP ZeroWindow + TCP ZeroWindowProbe + TCP Window Update

另外一种零窗口情景,接收端出现 Win 为 0 的情形,发送 TCP ZeroWindow 通知,发送端在经过一段时间后发出 TCP ZeroWindowProbe 数据包,但接收端收到探测后,由于已经打开窗口,因此直接回复 TCP Window Update 数据包。

首先服务器端 No.10 Win 为 0 且未设置 SYN、FIN、RST 的情况下,标识为 [TCP ZeroWindow],之后 286ms 客户端发送了 No.11 [TCP ZeroWindowProbe] 用于确认服务器端接收窗口是否恢复,服务器紧接着回复确认 No.12,表示窗口已恢复 Win 1420,标识为 [TCP Window Update] 数据包。

  1. TCP Window Full + TCP ZeroWindow + TCP ZeroWindowProbe + TCP ZeroWindowProbeAck + TCP Window Update

🤣 大满贯场景,覆盖了 5 种 TCP 分析标志。首先客户端发送数据,发现服务器接收窗口满了,则在 No.4 和 No.6 上标识 [TCP Window Full] ,此时服务器端 No.7 因为 Win 为 0 且未设置 SYN、FIN、RST 的情况下,标识为 [TCP ZeroWindow],之后陷入等待,大概 2 秒+后,客户端发送了 No.8 [TCP ZeroWindowProbe] 用于确认服务器端接收窗口是否恢复,服务器紧接着回复确认 No.9,表示仍处于零窗口未恢复,标识为 [TCP ZeroWindowProbeAck] + [TCP ZeroWindow] ,又再过了 300ms 后,服务器端发送 No.10 Win 此时更新为 14600,表示接收窗口已恢复,标识成 [TCP Window Update] ,至此完成一次完整的零窗口出现、探测及恢复过程。

类似的场景同样如下

总结

👓 不知道总结能不能这样说,正常情况下,有出现 TCP Window Full,不一定会有 TCP ZeroWindow,但有 TCP ZeroWindow, 则之前必有 TCP Window Full 。💯


http://www.ppmy.cn/ops/113122.html

相关文章

MacBook苹果电脑安装JDK8、JDK17教程,环境变量配置 + 快速切换JDK版本

MacBook苹果电脑安装JDK8、JDK17教程&#xff0c;环境变量配置 快速切换JDK版本 MacBook M1 安装JDK及环境变量配置 1、在Oracle官网下载JDK 2、安装JDk 3、配置环境变量 4、快速切换 1.下载JDK&#xff08;官网&#xff09; 1.1官网下载dmg安装包 Java Archive | Oracle J…

GPT代码记录

#include <iostream>// 基类模板 template<typename T> class Base { public:void func() {std::cout << "Base function" << std::endl;} };// 特化的子类 template<typename T> class Derived : public Base<T> { public:void…

大模型分离架构学习记录

1、大模型相关名词 TOE&#xff08;TCP Offload Engine&#xff09;是指TCP卸载引擎。它是一种网络技术&#xff0c;通过将TCP/IP协议栈的一部分处理任务从主机的CPU卸载到网卡&#xff1b; 也就是RDMANVLink :在单台服务器内 8 块 GPU 卡通过 NVLink 连接。不同服务器之间的 …

MySQL——数据库的高级操作(一)数据备份与还原(1)数据的备份

在操作数据库时&#xff0c;难免会发生一些意外造成数据丢失。例如&#xff0c;突然停电、管理员的操作失误都可能导致数据的丢失。为了确保数据的安全&#xff0c;需要定期对数据库进行备份&#xff0c;这样&#xff0c;当遇到数据库中数据丢失或者出错的情况&#xff0c;就可…

vue3+ant design vue 中弹窗自定义按钮设置及以冒号为基准布局

1、自定义弹窗按钮&#xff0c;去除取消和确定按钮。&#xff08;网上很多方法都是说通过插槽来实现&#xff0c;但是试了下不生效&#xff0c;那既然插槽不生效的话&#xff0c;干脆直接写按钮就好了&#xff09; <a-modalv-model:open"open"title"人员信息…

探索Go语言中的Goroutine并发机制

什么是Goroutine 在Go语言中,Goroutine 是程序中最基本的并发单位。事实上,每个Go程序都会自动创建一个goroutine,那就是主goroutine,程序启动时会立即执行。Goroutine是Go语言中处理并发问题的核心工具,因此理解它的工作原理至关重要。 简而言之,Goroutine是并发执行的…

ubuntu20.04编译mesa

依赖 # drm git clone https://gitlab.freedesktop.org/mesa/drm.git meson builddir/ ninja -C builddir/ install# wayland git clone https://gitlab.freedesktop.org/wayland/wayland.git meson setup builddir -Ddocumentationfalse ninja -C builddir/ install编译 sud…

qt绘制时钟

代码 #include "widget.h" #include "ui_widget.h"#include <QWidget> #include <QPaintEvent> //绘图事件 #include <QDebug> //测试 #include <QPainter> //画家 #include <QPen> //笔 #include <QBrush> //画刷 …

Vue路由:Vue router

目录 路由的基本概念 1. 路由 2. 单页应用SPA 3.前端路由的实现方式 3.1Hash模式 3.2History模式 Vue router 4 1.概述 2.安装使用 3.基础用法 3.1路由匹配规则声明 3.2动态路由匹配 3.3路由命名 3.4路由重定向 3.5路由嵌套 3.6命名视图 3.6声明式导航&编程…

python-奖金/贪心的小明

一&#xff1a;奖金 题目描述 企业发放的奖金根据利润提成。利润低于或等于 100000 元的&#xff0c;奖金可提 10%&#xff1b; 利润高于 100000 元&#xff0c;低于 200000 元&#xff08; 100000<I≤200000&#xff09;时&#xff0c;低于 100000 元的部分按 10% 提成&…

adb install失败: INSTALL_PARSE_FAILED_NO_CERTIFICATES

这个错误表明在尝试安装 APK 文件时出现了问题&#xff0c;原因是 APK 文件中的 AndroidManifest.xml 没有签名证书。在 Android 系统中&#xff0c;所有的应用都必须经过签名才能安装到设备上。以下是解决此问题的方法&#xff1a; 方法一&#xff1a;使用 Android Studio 或命…

一个好的云渲染,在动画渲染需要具备哪些条件

在当今快节奏的影视动画行业中&#xff0c;云渲染技术已经成为设计师和公司不可或缺的工具。它不仅减少了对昂贵硬件的依赖&#xff0c;还显著提高了工作效率&#xff0c;缩短了项目周期。云渲染提供高效、稳定、灵活且成本效益高的渲染服务&#xff0c;关键在于以下几个方面&a…

『功能项目』切换职业面板【48】

我们打开上一篇47技能冷却蒙版的项目&#xff0c; 本章要做的事情是切换职业UI面板的功能 首先双击打开Canvas预制体在左上主角面板信息中新建一个button按钮 重命名&#xff08;父物体是按钮Button&#xff0c;子物体Image即可&#xff09; 创建一个Image 设计一下布局 复制三…

【oj刷题】二分查找篇:二分查找算法的原理和应用场景

前言&#xff1a; 二分查找算法&#xff0c;又称折半查找算法&#xff0c;是一种在有序数组中查找特定元素的高效查找方法。它通过将搜索区间不断缩小一半&#xff0c;从而在对数时间内找到目标元素。二分查找是基于分治策略的一种典型应用&#xff0c;能够高效的处理许多问题&…

Unity实战案例全解析:PVZ 植物卡片状态分析

Siki学院2023的PVZ免费了&#xff0c;学一下也坏 卡片状态 卡片可以有三种状态&#xff1a; 1.阳光足够&#xff0c;&#xff08;且cd好了可以种植&#xff09; 2.阳光不够&#xff0c;&#xff08;cd&#xff1f;好了&#xff1a;没好 &#xff08;三目运算符&#xff09;&…

黑马java学习笔记11(阶段二 第三章3-1~3-2)

以下学习笔记记录于&#xff1a;2024.09.11-2024.09.17 文章目录 阶段二 JavaSE进阶第三章 JDK8新特性3-1 JDK8新特性1&#xff09;Lambda表达式66 认识Lambda表达式67 Lambda表达式的省略规则 2&#xff09;方法引用68 静态方法的引用、实例方法的引用69 特定类型方法的引用70…

门控循环单元(GRU)

困死了。。。 参考视频&#xff1a;56 门控循环单元&#xff08;GRU&#xff09;【动手学深度学习v2】 GRU&#xff1a;门控循环单元&#xff0c;与LSTM类似&#xff0c;解决RNN中不能长期记忆和反向传播中的梯度等问题。但结构比LSTM简单。 关注一个序列&#xff0c;不是每个观…

完整gpt应用(自用)

qrc.py 把gpt_qrc.qrc转化成gpt_qrc.py pyrcc5 -o icons_rc.py icons.qrc <RCC><qresource prefix"img"><file>img/53.png</file><file>img/ai.png</file><file>img/关闭.png</file><file>img/最小化.png&l…

网络安全学习路线,史上最全网络安全学习路线整理

很多小伙伴在网上搜索网络安全时&#xff0c;会出来网络安全工程师这样一个职位&#xff0c;它的范围很广&#xff0c;只要是与网络安全挂钩的技术人员都算网络安全工程师&#xff0c;一些小伙伴就有疑问了&#xff0c;网络安全现在真的很火吗&#xff1f; 那么无涯就带大家看…

PG表空间

目录标题 PG表空间PostgreSQL表空间的最佳实践是什么&#xff1f;如何在PostgreSQL中创建和管理自定义表空间&#xff1f;PostgreSQL表空间对数据库性能的具体影响有哪些&#xff1f;在PostgreSQL中&#xff0c;如何迁移数据到不同的表空间以优化存储布局&#xff1f;PostgreSQ…