2024年8月

或许很多人跟我一样,没有显卡,但又很想玩AI绘图,但本地绘图怕是无缘了,只能借助云GPU的方式了。

今天跟大家分享一下一个简单目前可白嫖无门槛的方法实现无显卡也能玩AI绘图。

方案就是ComfyUI+BizyAir云节点。

ComfyUI介绍

来看看仓库介绍:

image-20240719164925116

最强大和模块化的 stable diffusion 用户界面和后端。

仓库地址:
https://github.com/comfyanonymous/ComfyUI

直接下载:

image-20240719165053940

没有GPU就使用CPU的bat文件:

image-20240719165222764

启动成功就会自动跳转到这个页面:

image-20240719165418833

现在到下一位主角登场了。

BizyAir介绍

仓库介绍:

BizyAir: Comfy Nodes that can run in any environment.
BizyAir:可以在任何环境中运行的Comfy节点。

image-20240719165735470

仓库地址:
https://github.com/siliconflow/BizyAir

开始使用

官方文档有不同的使用方法,具体见:
https://siliconflow.github.io/BizyAir/getting-started/installation.html

打开custom_nodes文件夹:

image-20240719170233169

直接git clone进去:

image-20240719170408959

完成后如下所示:

image-20240719170519805

重新启动ComfyUI,为了方便用户使用,BizyAir自带了几个工具流,以使用可灵的工作流为例:

image-20240719170951257

填入硅基流动的API KEY,注册一个硅基流动账号,在这个位置就有:

image-20240719171405769

image-20240719172429469

填入,如下所示:

image-20240719172450319

这个入门例子就跑起来了:

image-20240719172525532

现在就可以开始自己玩了。

还可以使用免费的LLM完善提示词,比如画一个高达机器人:

image-20240719172827830

可灵的绘图效果:

image-20240719172919572

还是非常nice的。

还可以这么玩,先画一个写实的图片,在根据这个写实的图片来绘图,比如我想玩一只水彩画风格的小猫在敲代码,可以这样玩:

image-20240719173302734

换成赛博朋克风格玩玩:

image-20240719173455325

还是很有意思的,但是这么好用门槛又这么低,后面大概率是不能白嫖的,如果真的需要,也比自己买GPU成本低很多,只是想玩一玩的,趁现在还能白嫖,可以玩一玩。

一人 我饮酒醉
醉把佳人成双对
两眼 是独相随
只求他日能双归
娇女 我轻扶琴
燕嬉 我紫竹林
痴情红颜 心甘情愿
千里把你寻
说红颜 我痴情笑
曲动 我琴声妙
轻狂高傲 懵懂无知
只怪太年少

弃江山 我忘天下
斩断情丝无牵挂
千古留名传佳话
我两年征战已白发
一生征战何人陪
谁是谁非谁相随
戎马一生为了谁
我能爱几回恨几回
败帝王 斗苍天
夺得皇位以成仙
豪情万丈天地间
我续写另类帝王篇
红尘事我已斩断
久征战场人心乱
当年扬名又立万
我为这一战无遗憾
相思 我愁断肠
眼中 我泪两行
多年为你一统天下
我誓要把名扬

烟雨 我平凡事
此生我怀大志
为了佳人回眸一笑
我立下这毒誓

百花绽放出芬芳
回首在此曲流殇
回眸沧海一曲忧歌
感触莉花香

将军出征人在外
归来之日谁还在
兄弟把酒论豪迈
驰骋疆场求一败
这次走我何时归
寒风起 心似灰
冷风吹起樱花飞
触景生情心伤悲

琴声悠悠在回荡
一首忧歌为你唱
沧海桑田难遗忘
酒醒燕归来无恙
百花绽放出芬芳
再次回首曲流伤
回眸感触昙花香
一首忧歌笑沧桑
仰望窗外烟雨朦胧
想你当初那笑容
佳人一别月下逢
牡丹花开百花丛

情以过 义难断
提笔写下江山乱
孤枕难眠梦相伴
花飞花舞花飘散

金紫楼 风起玄
挥舞霸刀几万年
悠悠岁月心缠绵
如何忘记你容颜
恍然如梦烟雨间
雨碎落叶舞翩翩
烟雨飘渺断崖边
待我转世化成仙
为何你要说离别
留我一人寻彩蝶
浮生若梦三字诀
我留下三字这心结

这情花我为你摘
一颗心门为你开
平凡事我了尘埃
寂寒之心谁能猜
一别红颜多年后
多年情 在守候
断情之曲谁人奏
思念红颜人消瘦
海誓山盟烟雨楼
我苦苦相思两处愁
三生三世的缘由
只因一生无所求
梦里梦外千百年
可曾记得那誓言

今生情 来世缘
我难忘二字为红颜
千 百里 相思雨
相思雨 落谷底
红尘往事梦一曲
我期盼三字风云起
脑中浮现一幕幕
一幕幕 江湖路
谁懂我心痛苦处
三生誓言以颠覆

梦里 谁独相思
为何要寻一相知
梦外 我望明月
只为一人情难却

论文揭示了
star operation
(元素乘法)在无需加宽网络下,将输入映射到高维非线性特征空间的能力。基于此提出了
StarNet
,在紧凑的网络结构和较低的能耗下展示了令人印象深刻的性能和低延迟
来源:晓飞的算法工程笔记 公众号

论文: Rewrite the Stars

Introduction


最近,通过元素乘法融合不同的子空间特征的学习范式越来越受到关注,论文将这种范例称为
star operation
(由于元素乘法符号类似于星形)。

为了便于说明,论文构建了一个用于图像分类的
demo block
,如图 1 左侧所示。通过在
stem
层后堆叠多个
demo block
,论文构建了一个名为
DemoNet
的简单模型。保持所有其他因素不变,论文观察到逐元素乘法(
star operation
)在性能上始终优于求和,如图 1 右侧所示。

在这项工作中,论文证明
star operation
具有将输入映射到极高维的非线性特征空间的能力,从而解释
star operation
的强表达能力。论文不依赖直观或假设的高级解释,而是深入研究
star operation
的细节。通过重写和重新表述
star operation
计算过程,论文发现这个看似简单的运算实际可以生成一个新的特征空间,含大约
\((\frac{d}{\sqrt{2}})^2\)
线性独立维度。

与增加网络宽度(又称通道数)的传统神经网络不同,
star operation
类似于在不同通道上进行成对特征乘法的核函数,特别是多项式核函数。当应用到神经网络中并通过多层堆叠时,每一层都会带来隐式维度复杂性的指数增长。只需几层,
star operation
就可以在紧凑的特征空间内实现几乎无限的维度。在紧凑的特征空间内计算,同时受益于隐含的高维度,这就是
star operation
的独特魅力所在。

根据上述见解,论文推断
star operation
本质上更适合高效、紧凑的网络,而不是常规使用的大型模型。为了验证这一点,论文提出了一种概念验证的高效网络
StarNet
,其特点是简洁和高效。
StarNet
非常简单,缺乏复杂的设计和微调的超参数。在设计理念上,
StarNet
与现有网络明显不同,如表 1 所示。利用
star operation

StarNet
甚至可以超越各种精心设计的高效模型,如
MobileNetv3

EdgeViT

FasterNet
等。这些结果不仅从经验上验证了论文对恒星运行的见解,而且强调了其在实际应用中的实用价值。

论文简要总结并强调这项工作的主要贡献如下:

  • 证明了
    star operation
    的有效性,如图 1 所示,揭示了
    star operation
    具有将特征投影到极高维隐式特征空间的能力,类似于多项式核函数。
  • 从分析中汲取灵感,确定了
    star operation
    在高效网络领域的实用性,并提出了概念验证模型
    StarNet
    。无需复杂的设计或精心选择的超参数即可实现高性能,超越了许多高效的设计。
  • 基于
    star operation
    存在大量未探索的可能性,论文的分析可以作为指导框架,引导研究人员远离随意的网络设计尝试。

Rewrite the Stars


Star Operation in One layer

在单层神经网络中,
star operation
通常写为
\((\mathrm{W}_{1}^{\mathrm{T}}\mathrm{X}+\mathrm{B}_{1})\ast(\mathrm{W}_{2}^{\mathrm{T}}\mathrm{X}+\mathrm{B}_{2})\)
,通过逐元素乘法融合两个线性变换的特征。为了方便起见,将权重矩阵和偏置合并为一个实体
\(\mathrm{W} = \Bigg\begin{array}{c}{\mathrm{W}}\{\mathrm{B}}\end{array}\Bigg\)
,同样地,通过
\(\mathrm{X} = \Bigg\begin{array}{c}{\mathrm{X}}\{\mathrm{1}}\end{array}\Bigg\)
,得到
star operation
\((\mathrm{W}_{1}^{\mathrm{T}}\mathrm{X})\ast(\mathrm{W}_{2}^{\mathrm{T}}\mathrm{X})\)

为了简化分析,论文重点关注涉及单输出通道转换和单元素输入的场景。具体来说,定义
\(w\_1, w\_2, x \in \mathbb{R}^{(d+1)\times 1}\)
,其中
\(d\)
为输入通道数。这可以随时进行
\(\mathrm{W}\_1, \mathrm{W}\_2 \in \mathbb{R}^{(d+1)\times(d^{\prime}+1)}\)
扩展以适应多个输出通道,以及处理多元素输入
\(\mathrm{X} \in \mathbb{R}^{(d+1)\times n}\)

一般来说,可以通过以下方式重写
star operation

\[
\begin{array}{l}

{{w_{1}^{\mathrm{T}}x\ast w_{2}^{\mathrm{T}}x}}

&

(1)

\

{{=\left(\sum_{i=1}^{d+1}w_{1}^{i}x^{i}\right)\*\left(\sum_{j=1}^{d+1}w_{1}^{i}w\_{2}^{j}x^{j}\right)}}

&

(2)

\

{{=\sum_{i=1}^{d+1}\sum_{j=1}^{d+1}w_{1}^{i}w_{2}^{j}x^{i}x^{j}}}

&

(3)

\

=\underbrace{{\alpha_{(1,1)}x^{1}x^{1}+\cdots+\alpha_{(4,5)}x^{4}x^{5}+\cdots+\alpha_{(d+1,d+1)}x^{d+1}x^{d+1}}}_{(d+2)(d+1)/2\ \mathrm{items}}

&

(4)

\end{array}

\]

其中
\(i,j\)
作为通道下标,
\(\alpha\)
为个子项的系数:

\[
{\alpha}_{(i,j)}=\left{\begin{array}{c c}{{{w}_{1}^{i}{w}_{2}^{j}}}&{{\mathrm{if}\;i==j,}}\ {{{w}_{1}^{i}{w}_{2}^{j}+{w}_{1}^{j}{w}\_{2}^{i}}}&{{\mathrm{if}\;i!=j.}}\end{array}\right.

\quad\quad(5)

\]

重写
star operation
后,可以将其展开为
\(\frac{(d+2)(d+1)}{2}\)
个不同子项的组合,如等式 4 所示。值得注意的是,除了
\(\alpha\_{(d+1,:)}x^{d+1}x\)
的每个子项(这里是
\(x^{d+1}\)
偏置项)都与
\(x\)
呈非线性关联,表明它们是单独的隐式维度。

因此,在
\(d\)
维度空间中使用计算效率高的
star operation
,可以得到
\({\frac{(d+2)(d+1)}{2}}\approx(\frac{d}{\sqrt{2}})^2\)

\(d\gg 2\)
)的隐式维度特征空间。从而在显著放大特征维度的同时,不会在单层内产生任何额外的计算开销,这个突出的属性与内核函数有着相似的理念。

Generalized to multiple layers

通过堆叠多个层,可以递归地将隐式维度以指数方式增加到几乎无限。

对于宽度为
\(d\)
的初始网络层,应用一次
star operation

\(\sum_{i=1}^{d+1}\sum_{j=1}^{d+1}w_{1}^{i}w_{2}^{j}x^{i}x^{j}\)
),可得到
\(\mathbb{R}^{(\frac{d}{\sqrt{2}})^{2^{1}}}\)
的隐式特征空间内。


\({O}\_{l}\)
表示第
\(l\)

star operation
的输出,可得:

\[
\begin{array}{l l}

{{O_{1}=\sum_{i=1}^{d+1}\sum_{j=1}^{d+1}w_{(1,1)}^{i}w\_{(1,2)}^{j}x^{i}x^{j}\qquad\in\mathbb{R}^{({\frac{d}{\sqrt{2}}})^{2^{1}}}}}

&(6)

\

{{O_{2}=\mathrm{W}_{2,1}^{\mathrm{T}}\mathrm{O}_{1}\ast\mathrm{W}_{2,2}^{\mathrm{T}}O\_{1}}}\qquad\qquad\qquad\,\,{{\in\,\mathbb{R}^{({\frac{d}{\sqrt{2}}})^{2^{2}}}}}

&(7)

\

{{O_{2}=\mathrm{W}_{3,1}^{\mathrm{T}}\mathrm{O}_{2}\ast\mathrm{W}_{3,2}^{\mathrm{T}}O\_{2}}}\qquad\qquad\qquad\,\,{{\in\,\mathbb{R}^{({\frac{d}{\sqrt{2}}})^{2^{3}}}}}

&(8)

\

\cdots

&(9)

\

{{O_{2}=\mathrm{W}_{l,1}^{\mathrm{T}}\mathrm{O}_{l-1}\ast\mathrm{W}_{l,2}^{\mathrm{T}}O\_{l-1}}}\qquad\qquad\quad\,\,{{\in\,\mathbb{R}^{({\frac{d}{\sqrt{2}}})^{2^{l}}}}}

&(10)

\end{array}

\]

也就是说,通过堆叠
\(l\)
层可以隐式获得
\(\mathbb{R}^{({\frac{d}{\sqrt{2}}})^{2^{l}}}\)
维特征空间。例如,给定一个宽度为 128 的 10 层网络,通过
star operation
获得的隐式特征维数近似为
\(90^{1024}\)
,相当于无限维度。因此,通过堆叠多个层,即使只有几个层,
star operation
也可以以指数方式大幅放大隐式维度。

Special Cases

实际上,并非所有
star operation
都遵循公式 1 那样,两个分支都进行变换。例如,
VAN

SENet
包含一个
identity
分支,而
GENet-
\(\theta^{-}\)
无需任何需学习的变换(池化、最近邻插值后乘回原特征)即可运行。

  • Case I: Non-Linear Nature of
    \(\mathrm{W}_{1}\)
    and/or
    \(\mathrm{W}_{2}\)

在实际场景中,大量研究(例如
Conv2Former

FocalNet
等)通过合并激活函数将变换函数
\({\mathrm{W}}_{1}\)
和/或
\({\mathrm{W}}_{2}\)
变为非线性。尽管如此,最重要的其实是看通道间的处理是否像公式 2 那样实现,是则其隐式维度仍然保持不变(大约为
\(\frac{d}{\sqrt{2}})^2\)
)。

  • Case II:
    \(\mathrm{W}\_{1}^{\mathrm{T}}\mathrm{X}\ast \mathrm{X}\)

当移除
\(\mathrm{W}\_{2}\)
变换时,隐式维度从大约
\(\frac{d^{2}}{2}\)
减少到
\(2d\)

  • Case III:
    \(\mathrm{X}\ast \mathrm{X}\)

在这种情况下,
star operation
将特征从特征空间
\({{x}^{1},{x}^{2},\cdots,\;{x}^{d}} \in\mathbb{R}^{d}\)
转换为
\({{x}^{1}{x}^{1},{x}^{2}{x}^{2},\cdots,\;{x}^{d}{x}^{d}} \in\mathbb{R}^{d}\)
的新特征空间。

有几个值得注意的方面需要考虑:

  • star operation
    及其特殊情况通常会(尽管不一定)与空间交互集成,比如通过池化或卷积实现线性变换。但许多这些方法只强调扩大感受野带来的好处,往往忽视隐式高维空间赋予的优势。
  • 组合这些特殊情况是可行的,如
    Conv2Former
    合并了
    Case I

    Case II
    ,以及
    GENet-
    \(\theta^{-}\)
    混合了
    Case I

    Case III
  • 虽然
    Case II

    Case III
    可能不会显著增加单层的隐式维度,但使用线性层(主要用于通道通信)和
    skip
    连接依然可以通过堆叠多个层来实现高隐式维度。

Proof-of-Concept: StarNet


鉴于
star operation
的独特优势—在低维空间中计算的同时产生高维特征,论文确定了其在高效网络架构领域的实用性。因此,论文提出
StarNet
作为概念验证模型,特点是极其简约的设计和显著减少的人为干预。尽管
StarNet
很简单,但它展示了卓越的性能,强调了
star operation
的功效。

StarNet Architecture

StarNet
采用 4 级分层架构,利用卷积层进行下采样,并使用修改后的
demo block
进行特征提取。为了满足效率的要求,将
Layer Normalization
替换为
Batch Normalization
,并将其放置在深度卷积之后(可以在推理时融合)。受到
MobileNeXt
的启发,论文在每个块的末尾加入了一个深度卷积。通道扩展因子始终设置为 4,网络宽度在每个阶段加倍。遵循
MobileNetv2
设计,
demo block
中的
GELU
激活被替换为
ReLU6

Experimental


Star Operation

StarNet

如果本文对你有帮助,麻烦点个赞或在看呗~undefined更多内容请关注 微信公众号【晓飞的算法工程笔记】

work-life balance.

1.简介

按照以前的讲解和分享路数,宏哥今天就应该从外观上来讲解WireShark的界面功能了。

2.软件界面

由上到下依次是标题栏、主菜单栏、主菜单工具栏、显示过滤文本框、打开区、最近捕获并保存的文件、捕获区、捕获过滤文本框、本机所有网络接口、学习区及用户指南等。

2.1启动界面

首次打开
启动 Wireshark 时,会出现以下启动界面,如下图所示:

宏哥将整个界面分为四个部分:

  • 主菜单
  • 主菜单工具栏
  • 过滤工具
  • 接口列表
  • 状态工具栏

2.2主菜单

主菜单:它位于主窗口的顶部,有 11 个项目,宏哥这里不打算详细描述每个项目,而是挑几个重要方面进行介绍。如下图所示:

2.2.1文件菜单

“文件”栏的英文名为“File”,该菜单中包含了打开和合并捕获数据文件项、部分或全部保存/打印/导出捕获数据文件项以及退出应用程序选项等。文件菜单包含基本的 IO 操作集,您可以打开和关闭文件、导入和导出操作,当然也可以从这里退出 Wireshark。

主要是对抓包文件的操作:

①文件打开,保存。

②导出特定分组:可以选择导出全部包,主界面显示的包,主界面选择的包,marked的包,第一个到最后一个marked的包之间的包,设置包序号段的包,保存时不保存忽略的包。

③导出特定格式(pcap,csv,文本txt,XML,json等)导出CSV格式可以excel打开做进一步统计分析。如下图所示:

文件菜单项说明:

菜单项 快捷键 描述
Open…(打开) Ctrl
+
O
这将显示 “文件打开” 对话框,您可以通过该对话框加载捕获文件以进行查看。
Open Recent(打开最近文件) 这使您可以打开最近打开的捕获文件。单击子菜单项之一将直接打开相应的捕获文件。
Merge…(合并) 此菜单项使您可以将捕获文件合并到当前加载的文件中。
Import from Hex Dump…(从Hex转储导入) 此菜单项将打开 “导入文件” 对话框,该对话框使您可以将包含十六进制转储的文本文件导入到新的临时捕获中。
Close(关闭) Ctrl
+
W
该菜单项关闭当前捕获。如果尚未保存捕获,将首先要求您保存(可以通过首选项设置禁用)。
Save(保存) Ctrl
+
S
此菜单项保存当前捕获。如果您尚未设置默认捕获文件名(也许使用
-w <capfile>
选项),则 Wireshark 会弹出 “将捕获文件另存为” 对话框。如果您已经保存了当前捕获的图像,则该菜单项将显示为灰色。正在进行捕获时,您无法保存实时捕获。您必须停止捕获才能保存。
Save As…(另存为) Shift
+
Ctrl
+
S
此菜单项允许您将当前捕获文件保存到所需的任何文件中。它会弹出 “将捕获文件另存为” 对话框。
File Set

List Files(列出文件)
此菜单项允许您显示文件集中的文件列表。它会弹出 “Wireshark 列表文件集” 对话框。
File Set

Next Files(下一文件)
如果当前加载的文件是文件集的一部分,请跳到该集中的下一个文件。如果它不是文件集的一部分或不是该文件集中的最后一个文件,则该项目为灰色。
File Set

Previous Files(上一文件)
如果当前加载的文件是文件集的一部分,请跳到文件集中的前一个文件。如果它不是文件集的一部分或不是该文件集中的第一个文件,则该项目为灰色。
Export Specified Packets…(导出特定分组) 此菜单项允许您将捕获文件中的所有(或部分)数据包导出到文件中。它将弹出 Wireshark 导出对话框。
Export Packet Dissections…(导出分组解析结果) Ctrl
+
H
这些菜单项使您可以将数据包字节窗格中当前选择的字节以多种格式导出到文本文件,包括纯格式,CSV 和 XML。
(导出分组字节流)
(导出PDU到文件)
Strip Headers
导出TSL会话密钥
Export Objects(导出对象) 这些菜单项允许您将捕获的 DICOM,HTTP,IMF,SMB 或 TFTP 对象导出到本地文件中。它弹出一个相应的对象列表
Print…(打印) Ctrl
+
P
此菜单项允许您打印捕获文件中的所有(或某些)数据包。它会弹出 Wireshark 打印对话框。
Quit(退出) Ctrl
+
Q
此菜单项允许您从 Wireshark 退出。如果您以前没有保存过,Wireshark 会要求您保存捕获文件(可以通过首选项设置将其禁用)。
2.2.2编辑菜单

“编辑”栏的英文名为“Edit”,该菜单中包含了查找数据包、设置时间参考、标记数据包、设置配置文件、设置首选项等。需要注意的是,在“编辑”栏中,没有剪切、复制和粘贴等选项。编辑里最常用的就是首选项了,其他基本都是快捷方式,一看即明白,不再多介绍。如下图所示:

编辑菜单项说明:

菜单项 快捷键 描述
Copy(复制) 这些菜单项会将数据包列表,数据包详细信息或当前所选数据包的属性复制到剪贴板。
Find Packet…(查找分组) Ctrl
+
F
该菜单项打开一个工具栏,可让您根据许多条件查找数据包。
Find Next(查找下一个) Ctrl
+
N
该菜单项尝试查找与 “Find Packet…” 中的设置匹配的下一个数据包。
Find Previous(查找上一个) Ctrl
+
B
此菜单项尝试查找与 “查找数据包…” 中的设置匹配的先前数据包。
Mark/Unmark Packet(标记/取消标记 分组) Ctrl
+
M
此菜单项标记当前选择的数据包。有关详细信息。
Mark All Displayed Packets(标记所有显示组) Ctrl
+
Shift
+
M
此菜单项标记所有显示的数据包。
Unmark All Displayed Packets(取消标记所有显示组) Ctrl
+
Alt
+
M
该菜单项取消标记所有显示的数据包。
Next Mark(下一标记) Ctrl
+
Shift
+
N
查找下一个标记的数据包。
Previous Mark(前一标记) Ctrl
+
Shift
+
B
查找先前标记的数据包。
Ignore/Unignore Packet(忽略/取消忽略 分组) Ctrl
+
D
此菜单项将当前选择的数据包标记为已忽略。有关详细信息。
Ignore All Displayed(忽略所有显示分组) Ctrl
+
Shift
+
D
此菜单项将所有显示的数据包标记为已忽略。
Unignore All Displayed(取消忽略所有显示分组) Ctrl
+
Alt
+
B
该菜单项取消标记所有忽略的数据包。
Set/Unset Time Reference(设置/取消设置 时间参考) Ctrl
+
T
该菜单项在当前选择的数据包上设置时间参考。有关时间参考数据包的更多信息。
Unset All Time References(取消设置所有时间参考) Ctrl
+
Alt
+
T
该菜单项将删除数据包上的所有时间参考。
Next Time Reference(下一时间参考) Ctrl
+
Alt
+
N
该菜单项尝试查找下一次参考数据包。
Previous Time Reference(前一时间参考) Ctrl
+
Alt
+
B
该菜单项尝试查找上一个参考时间的数据包。
Time Shift…(时间平移) Ctrl
+
Shift
+
T
打开 “时间转换” 对话框,您可以在其中调整某些或所有数据包的时间戳。
Packet Comment…(分组注释) Ctrl
+
Alt
+
C
打开 “数据包注释” 对话框,您可以在其中添加注释到单个数据包。请注意,保存数据包注释的能力取决于您的文件格式。例如 pcapng 支持注释,而 pcap 不支持注释。
Delete All Packet Comments(删除所有分组注释) 这将从所有数据包中删除所有注释。请注意,保存捕获注释的能力取决于您的文件格式。例如 pcapng 支持注释,而 pcap 不支持注释。
Configuration Profiles…(配置文件) Ctrl
+
Shift
+
A
该菜单项会弹出一个对话框,用于处理配置文件。
Preferences…(首选项) Ctrl
+
Shift
+
P
or
Cmd
+

(MacOS)
该菜单项会弹出一个对话框,允许您为控制 Wireshark 的许多参数设置首选项。您还可以保存您的首选项,以便 Wireshark 在下次启动时使用它们。

  • 标记/取消标记
    :使用此选项或“Ctrl + M”标记/取消标记数据包,当您以后想要检查数据包时,它实际上会有所帮助。
  • 数据包注释
    :您可以使用此选项向选定的数据包添加注释,或者使用快捷键“Ctrl + Alt+C”来执行相同操作。注释有助于与其他人合作,或者在我们以后处理工作时自己记住事情。
  • 配置文件
    :它实际上是根据我们的要求自定义 Wireshark 的好工具,例如,我们可以通过添加新列或重新排列列来组织列。可以添加配置文件,也可以下载配置文件,然后将其导入 Wireshark。配置文件也可以从右下面板更改。
  • 首选项
    :单击它时,将打开一个提示窗口,您可以在其中控制 GUI 的外观、设置捕获选项和其他高级功能,如添加 RSA 密钥、修改协议设置等。此子菜单也可用于自定义我们的配置文件。

  • 协议配置,非常重要,wireshark实际就是分析协议的工具,协议的呈现分析有时需要做选项配置,这块是一个重点
  • 外观,可以配置字体,颜色,布局等信息
  • 过滤器,添加过滤器,过滤时直接点按钮即可

2.2.3视图菜单

“视图”栏的英文是“View”,该菜单主要用来控制捕获数据的显示方式。“视图”栏包括了数据包着色选项、缩放字体选项、在新窗口显示数据包选项、展开/折叠数据包细节选项等。此菜单处理主屏幕上工具的显示、要使用的时间格式、数据包着色选项、缩放选项等。主要是对显示的设置,用的最多的是时间格式设置,其他好多有快捷方式。

例如,您可以用 UTC 来显示时间,而不是以秒为单位显示时间。我们可以对数据包进行着色和脱色,甚至可以更改着色规则。如下图所示:

视图菜单项说明:

菜单项 快捷键 描述
Main Toolbar 此菜单项隐藏或显示主工具栏。
Filter Toolbar 该菜单项隐藏或显示了过滤器工具栏。
Wireless Toolbar 此菜单项隐藏或显示无线工具栏。在某些平台上可能不存在。
Statusbar 此菜单项隐藏或显示状态栏。
Packet List 该菜单项隐藏或显示 “数据包列表” 窗格。
Packet Details 此菜单项隐藏或显示 “数据包详细信息” 窗格。
Packet Bytes 该菜单项隐藏或显示 “数据包字节” 窗格。
Time Display Format

Date and Time of Day: 1970-01-01 01:02:03.123456
选择此项将通知 Wireshark 以日期和时间格式显示时间戳。字段 “时间”,“日期和时间”,“自捕获开始以来的第二秒”,“自先前捕获的分组以来的第二秒” 和 “自先前显示的分组以来的第二秒” 是互斥的。
Time Display Format

Time of Day: 01:02:03.123456
选择此项将通知 Wireshark 以一天中的时间格式显示时间戳。
Time Display Format

Seconds Since Epoch (1970-01-01): 1234567890.123456
选择此选项将指示 Wireshark 从 1970-01-01 00:00:00 起以秒为单位显示时间戳。
Time Display Format

Seconds Since Beginning of Capture: 123.123456
选择此项将指示 Wireshark 以秒为单位显示自捕获格式开始以来的时间戳。
Time Display Format

Seconds Since Previous Captured Packet: 1.123456
选择此项将指示 Wireshark 以秒为单位显示自先前捕获的数据包格式以来的时间戳。
Time Display Format

Seconds Since Previous Displayed Packet: 1.123456
选择此项将指示 Wireshark 以秒为单位显示自先前显示的数据包格式以来的时间戳。
Time Display Format

Automatic (File Format Precision)
选择此项将通知 Wireshark 以使用的捕获文件格式给定的精度显示时间戳。“自动”,“秒” 和 “… 秒” 字段是互斥的。
Time Display Format

Seconds: 0
选择此项将通知 Wireshark 以 1 秒的精度显示时间戳。
Time Display Format

…seconds: 0…
选择此项将通知 Wireshark 以 1 秒,十分之一秒,厘秒,毫秒,微秒或纳秒的精度显示时间戳。
Time Display Format

Display Seconds with hours and minutes
选择此项将使 Wireshark 以秒为单位显示时间戳,并带有小时和分钟。
Name Resolution

Resolve Name
此项允许您仅触发当前数据包的名称解析。
Name Resolution

Enable for MAC Layer
该项目使您可以控制 Wireshark 是否将 MAC 地址转换为名称。
Name Resolution

Enable for Network Layer
该项目使您可以控制 Wireshark 是否将网络地址转换为名称。
Name Resolution

Enable for Transport Layer
该项目使您可以控制 Wireshark 是否将传输地址转换为名称。
Colorize Packet List 此项目使您可以控制 Wireshark 是否应为数据包列表着色。启用彩色将在捕获或加载捕获文件时减慢新数据包的显示速度。
Auto Scroll in Live Capture) 此项允许您指定 Wireshark 在出现新数据包时应滚动数据包列表窗格,因此您始终在查看最后一个数据包。如果未指定,则 Wireshark 只会将新数据包添加到列表的末尾,而不滚动数据包列表窗格。
Zoom In Ctrl
+
+
放大数据包数据(增大字体大小)。
Zoom Out Ctrl
+
-
缩小数据包数据(减小字体大小)。
Normal Size Ctrl
+
=
将缩放级别设置回 100%(将字体大小设置回正常)。
Resize All Columns Shift
+
Ctrl
+
R
调整所有列宽的大小,以使内容适合其中。调整大小可能会花费大量时间,尤其是在加载大捕获文件的情况下。
Displayed Columns 该菜单项会折叠起来,其中包含所有已配置列的列表。现在可以在数据包列表中显示或隐藏这些列。
Expand Subtrees Shift
+
此菜单项在数据包详细信息树中展开当前选定的子树。
Collapse Subtrees Shift
+
此菜单项将在数据包详细信息树中折叠当前选定的子树。
Expand All Ctrl
+
Wireshark 保留所有已展开协议子树的列表,并使用它来确保在显示数据包时已展开正确的子树。此菜单项将扩展捕获中所有数据包中的所有子树。
Collapse All Ctrl
+
该菜单项折叠捕获列表中所有数据包的树状视图。
Colorize Conversation 该菜单项会弹出一个子菜单,可让您根据当前所选数据包的地址为数据包列表窗格中的数据包着色。这使得区分不同对话的分组变得容易。

Colorize Conversation

Color 1-10
这些菜单项基于当前选定的对话启用十个临时滤色器之一。
Colorize Conversation

Reset coloring
该菜单项清除所有临时着色规则。
Colorize Conversation

New Coloring Rule…
该菜单项打开一个对话框窗口,可在其中基于当前选定的对话创建新的永久着色规则。
Coloring Rules… 该菜单项会弹出一个对话框,允许您根据选择的过滤器表达式为数据包列表窗格中的数据包着色。这对于发现某些类型的数据包非常有用
Internals 有关各种内部数据结构的信息。有关更多信息。
Show Packet in New Window 在单独的窗口中显示选定的数据包。单独的窗口仅显示数据包详细信息和字节。有关详细信息。
Reload Ctrl
+
R
此菜单项允许您重新加载当前的捕获文件。
2.2.4跳转菜单

“跳转”栏的英文是“Go”,该菜单主要用来跳转到指定数据包。很少用到,一般都是快捷方式。这实际上是一个数据包管理菜单。您可以使用它来遍历捕获数据包。“下一个数据包”和“上一个数据包”按钮可用于导航屏幕上的显示数据,当然,您可以简单地使用“Ctrl + 上/下”按钮或鼠标滚动来更轻松地进行遍历。如下图所示:

跳转菜单项说明:

菜单项 快捷键 描述
scanf()
背部
scanf()
Alt 键
+
scanf()
跳转到数据包历史记录中最近访问的数据包,就像在 Web 浏览器中的页面历史记录一样。
scanf()
前锋
scanf()
Alt 键
+
scanf()
跳到数据包历史记录中的下一个访问数据包,就像在 Web 浏览器中的页面历史记录一样。
scanf()
转到数据包…
scanf()
Ctrl
+
scanf()
G
调出一个窗口框架,使您可以指定数据包编号,然后转到该数据包。有关详细信息。
scanf()
转到相应的数据包
转到当前选定协议字段的相应数据包。如果所选字段不对应于数据包,则该项目为灰色。
scanf()
上一个数据包
scanf()
Ctrl
+
scanf()
移至列表中的上一个数据包。即使数据包列表没有键盘焦点,也可以使用它移动到上一个数据包。
scanf()
下一个数据包
scanf()
Ctrl
+
scanf()
移至列表中的下一个数据包。即使数据包列表没有键盘焦点,也可以使用它移动到上一个数据包。
scanf()
第一包
scanf()
Ctrl
+
scanf()
跳转到捕获文件的第一个数据包。
scanf()
最后一包
scanf()
Ctrl
+
scanf()
结束
跳转到捕获文件的最后一个数据包。
scanf()
会话中的上一个数据包
scanf()
Ctrl
+
scanf()
移至当前对话中的上一个数据包。即使数据包列表没有键盘焦点,也可以使用它移动到上一个数据包。
scanf()
会话中的下一个数据包
scanf()
Ctrl
+
scanf()
移至当前对话中的下一个数据包。即使数据包列表没有键盘焦点,也可以使用它移动到上一个数据包。
2.2.5 捕获菜单

“捕获”栏的英文是“Capture”,该菜单中包含了开始/停止捕获选项以及编辑包过滤条件选项等。使用它来控制 Capture 的开始和停止位置以及编辑和添加捕获过滤器。主要是对抓包的控制。如下图所示:

捕获菜单项说明:

菜单项 快捷键 描述
Options… Ctrl
+
K
显示 “捕获选项” 对话框,该对话框允许您配置界面和捕获选项。
Start Ctrl
+
E
立即开始使用与上次相同的设置捕获数据包。
Stop Ctrl
+
E
停止当前正在运行的捕获。
Restart Ctrl
+
R
停止当前运行的捕获,然后使用相同的选项重新启动。
Capture Filters… 显示一个对话框,允许您创建和编辑捕获过滤器。您可以命名过滤器并保存以备将来使用。
Refresh Interfaces F5 清除并重新创建接口列表。

捕获选项

配置抓包接口,抓包过滤器,抓包输出分割文件条件,自动停止抓包条件等。

2.2.6分析菜单

“分析”栏的英文是“Analyze”,该菜单中包含了显示包过滤宏、启用协议、配置用户指定的解码方式以及追踪TCP流等选项。这是一个重要工具集,主要是包分析的工具,能大大提个wireshark的分析效率,需重点学习内容。在这里可以添加和编辑显示过滤器以及显示过滤器宏,将数据包解码为特定协议,遵循 TCP 或 UDP 流等,可以选择一个数据包,然后从数据包详细信息窗格中使用“分析”->“应用为”应用过滤器筛选'。如下图所示:

分析菜单项说明:

菜单项 快捷键 描述
Display Filters… 显示一个对话框,允许您创建和编辑显示过滤器。您可以命名过滤器,也可以将其保存以备将来使用。
Display Filter Macros… 显示一个对话框,允许您创建和编辑显示过滤器宏。您可以命名过滤器宏,也可以保存它们以备将来使用。
Apply as Column Shift
+
Ctrl
+
I
将数据包详细信息窗格中的所选协议项作为一列添加到数据包列表中。
Apply as Filter 更改当前的显示过滤器并立即应用。根据所选菜单项的不同,当前的显示过滤器字符串将由 “数据包详细信息” 窗格中的选定协议字段替换或附加。
Prepare a Filter 更改当前的显示过滤器,但不会应用它。根据所选菜单项的不同,当前的显示过滤器字符串将由 “数据包详细信息” 窗格中的选定协议字段替换或附加。
Conversation Filter 为各种协议应用对话过滤器。
Enabled Protocols… Shift
+
Ctrl
+
E
启用或禁用各种协议解剖器。
Decode As… 将某些数据包解码为特定协议。
Follow

TCP Stream
打开一个窗口,显示与所选数据包处于同一 TCP 连接上的所有捕获的 TCP 段。
Follow

UDP Stream
与 “跟随 TCP 流” 相同的功能,但与 UDP “流” 相同。
Follow

TLS Stream
与 “跟随 TCP 流” 相同的功能,但适用于 TLS 或 SSL 流。有关提供 TLS 密钥的说明,请参阅
TLS
上的 Wiki 页面。
Follow

HTTP Stream
与 “跟随 TCP 流” 相同的功能,但适用于 HTTP 流。
Expert Info 打开一个窗口,显示在捕获中找到的专家信息。某些协议解剖器会为显着或异常行为(例如,无效的校验和或重新传输)添加数据包详细信息。这些项目显示在这里。有关更多信息。信息量将取决于协议

作为过滤条件,将包里字段内容作为直接过滤条件,点击可以选择和已有过滤条件关系(布尔运算关系),然后立即会进行过滤。

准备作为过滤条件,功能与上面基本相同,只是不会立即进行过滤,只是准备过滤语法,后面点击执行过滤才会执行
解码为,将包配置用什么协议进行解析
追踪流,鼠标放到的包上,可以进行对应流追踪过滤
专家信息,分析整个包的信息,可以看里面有没异常信息

2.2.7统计菜单

“统计”栏的英文是“Statistics”,可以显示各种统计窗口,这些统计窗口包括捕获文件的属性选项、协议分级选项以及显示流量图选项等。对信令可以做各种统计,属于重点要学习的工具集,里面工具都非常实用,后续再展开分享。它就像一个报告工具。我们可以统计地分解整个数据包捕获,例如,我们可以查看捕获的哪一部分是 IPv6 或 UDP。因此,这将显示各种统计信息,例如捕获文件的属性、流程图、协议层次结构、IPv4 和 IPv6 统计信息等。如下图所示:

统计菜单项说明:

菜单项 快捷键 描述
Capture File Properties 显示有关捕获文件的信息。
Resolved Addresses

Protocol Hierarchy 显示协议统计信息的层次结构树。
Conversations 显示对话列表(两个端点之间的流量)。
Endpoints 显示端点列表(往返于地址的流量)。
Packet Lengths 封包长度
I/O Graphs 显示用户指定的图形(例如,一段时间内的数据包数量)。
Service Response Time
服务响应时间
显示请求和相应响应之间的时间,。
DHCP (BOOTP)
ONC-RPC Programs
29West
ANCP
BACnet
Collectd
DNS
Flow Graph
HART-IP
HPFEEDS
HTTP HTTP 请求 / 响应统计信息
HTTP2
Sametime
TCP Stream Graphs
UDP Multicast Streams
F5
IPv4 Statistics
IPv6 Statistics
2.2.8电话菜单

“电话”栏的英文是“Telephony”,可以显示与电话相关的统计窗口,这些统计窗口包括媒介分析、VoIP通话统计选项以及SIP流统计选项等。在这里,您将找到显示几个与电话相关的统计窗口的选项,如流程图、显示协议层次统计等。如下图所示:

2.2.9无线菜单

“无线”栏的英文是“Wireless”,该栏用来显示蓝牙和无线网络的统计数据。这处理与蓝牙和 IEEE 802.11 标准相关的统计数据的显示。如下图所示:

2.2.10工具菜单

“工具”栏的英文是“Tools”,该栏中包含了Wireshark中能够使用的工具。它包含几个 Wireshark 的工具,例如创建防火墙 ACL 规则。如下图所示:

工具菜单项说明:

菜单项 加速器 描述
Firewall ACL Rules 这使您可以为许多不同的防火墙产品创建命令行 ACL 规则,包括 Cisco IOS,Linux Netfilter(iptables),OpenBSD pf 和 Windows 防火墙(通过 netsh)。支持 MAC 地址,IPv4 地址,TCP 和 UDP 端口以及 IPv4 + 端口组合的规则。假定规则将应用于外部接口。
Lua 这些选项使您可以选择使用 Lua 解释器来构建 Wireshark。
Credentials 这使您可以从当前捕获文件中提取凭证。已经对某些解剖器进行了工具化,以为模块提供用户名和密码,并且将来还会对更多的解剖器进行工具化。窗口对话框为您提供找到凭证的数据包编号,提供凭证的协议,用户名和密码。
2.2.11帮助菜单

“帮助”栏的英文是“Help”,该栏用于为用户提供一些基本的帮助,包括了说明文档选项、网页在线帮助选项以及常见问题选项等。它基本上提供了与帮助相关的方面,如帮助内容的链接、手册页、常见问题解答、Wireshark 的 Wiki 以及指向示例捕获的链接等。这里可以查看wireshark版本和帮助文档信息,也可以在这里最wireshark版本进行升级。如下图所示:

帮助菜单项说明:

菜单项 加速器 描述
Contents F1 该菜单项调出基本的帮助系统。
Manual Pages

该菜单项启动 Web 浏览器,显示本地安装的 html 手册页之一。
Website 该菜单项启动一个 Web 浏览器,该 Web 浏览器显示来自
https://www.wireshark.org/
的网页。
FAQs 此菜单项启动显示各种常见问题的 Web 浏览器。
Downloads 该菜单项启动一个 Web 浏览器,显示从以下位置进行的下载:
https
:
//www.wireshark.org/download.html
Wiki 此菜单项启动 Web 浏览器,该 Web 浏览器显示来自
https://wiki.wireshark.org/ 的首页
Sample Captures 该菜单项将启动一个 Web 浏览器,其中显示了以下示例的示例捕获:
https
:
//wiki.wireshark.org/SampleCaptures
About Wireshark 该菜单项打开一个信息窗口,该窗口提供有关 Wireshark 的各种详细信息,例如其构建方式,加载的插件,使用的文件夹等。

2.3主菜单工具栏

主菜单工具栏提供从菜单快速访问常用项目的功能。该工具栏不能由用户自定义,但是如果需要屏幕上的空间来显示更多数据包数据,则可以使用 “查看” 菜单将其隐藏。

主菜单工具栏:简单来说,Toolbar 实际上是一组最常用的主菜单项的快捷方式。熟悉 Wireshark 后,您会很快记住哪个图标用于什么用途。工具栏中的项目被启用前或禁用显示为灰色,类似于其相应的菜单项。例如,下图中显示了打开文件后的主窗口工具栏,启用了各种与文件相关的按钮,但是由于未进行捕获,因此禁用了 “停止捕获” 按钮。如下图所示:

工具栏图标 工具栏项 菜单项 描述

Start Capture

Start
使用与上次捕获相同的选项开始捕获数据包,如果未设置默认选项,则使用默认选项开始捕获数据包(
5.1.2 开始捕捉
)。

Stop Capture

Stop
停止当前正在运行的捕获(
5.1.2 开始捕捉
)。

Restart Capture

Restart
重新启动当前捕获会话。

Options… Capture

Options…
打开 “捕获选项” 对话框。有关详细信息,请参见
5.1.2 开始捕捉

Open… File

Open…
打开文件打开对话框,使用该对话框可以加载捕获文件以进行查看。在
5.2.1.1 “打开捕获文件” 对话框
中将对其进行详细讨论。

Save As… File

Save As…
将当前捕获文件保存到所需的任何文件中。有关详细信息,请参见
5.2.2.1 “将捕获文件另存为” 对话框
。如果您当前有一个临时捕获文件,则将显示 “保存” 图标。

Close File

Close
关闭当前捕获。如果尚未保存捕获,将要求您先保存。

Reload View

Reload
重新加载当前的捕获文件。

Find Packet… Edit

Find Packet…
根据不同的条件查找数据包。有关详细信息,请参见
5.3.8 查找数据包

Go Back Go

Go Back
跳回数据包历史记录。按住
Alt 键
键(
选项
在 macOS 上)返回到选择历史记录。

Go Forward Go

Go Forward
在数据包历史记录中向前跳转。按住
Alt 键
键(
选项
在 macOS 上)以继续进行选择历史记录。

Go to Packet… Go

Go to Packet…
转到特定的数据包。

Go To First Packet Go

Go To First Packet
跳转到捕获文件的第一个数据包。

Go To Last Packet Go

Go To Last Packet
跳转到捕获文件的最后一个数据包。

Auto Scroll in Live Capture View

Auto Scroll in Live Capture
在进行实时捕获时自动滚动数据包列表(或不捕获)。

Colorize View

Colorize
着色数据包列表(或不着色)。

Zoom In View

Zoom In
放大数据包数据(增大字体大小)。

Zoom Out View

Zoom Out
缩小数据包数据(减小字体大小)。

Normal Size View

Normal Size
将缩放级别设置回 100%。

Resize Columns View

Resize Columns
调整列的大小,使内容适合它们。

2.4过滤工具

过滤工具: 有两个过滤器工具栏:显示过滤器和捕获过滤器。两者之间有区别,但是两者都用于简化您的数据包搜索。如下图所示:

1.显示过滤,在这里输入过滤表达式,对已经抓到的包进行过滤,如果不输入表达式,所有抓取的包都会显示在这里。

2.捕获过滤,这里输入过滤表达式,可以只抓取特定的包,如果没有表达式,所有监听到的包都抓到下来。

工具栏图标 名称 描述

Bookmarks 管理或选择保存的过滤器。

Filter Input 输入或编辑显示过滤器字符串的区域。键入时对过滤器字符串进行语法检查。如果输入不完整或无效的字符串,背景将变为红色,而输入有效的字符串时,背景将变为绿色。在该字段中进行了某些更改之后,请不要忘记按 Apply(应用)按钮(或 Enter / Return 键),以将此过滤字符串应用于显示。此字段也是显示当前应用的过滤器的位置。

Clear 重置当前的显示过滤器并清除编辑区域。

Apply 在编辑区域中应用当前值作为新的显示过滤器。在大型捕获文件上应用显示过滤器可能会花费很长时间。

Recent 从最近应用的过滤器列表中选择。

Add Button 添加一个新的过滤器表达式按钮。

2.5接口列表

接口列表:Wireshark 的起始页列出了设备上所有可用的接口以供捕获,如果您在此处没有看到您的界面,请转到“捕获 > 刷新界面”或按“F5”键刷新界面列表。您还可以管理起始页上的界面列表。为此,请选择捕获过滤器搜索框右侧的下拉菜单。如下图所示:

当前电脑上的网卡及其流量状态。

我们可以通过选中要捕获数据的网卡,填写过滤规则,按快捷键“Ctrl + E”,开始捕获。如果不需要填写捕获过滤规则,直接双击要捕获数据的网卡就可以了。

2.6状态工具栏

状态工具栏则显示软件当前状态与已捕获&显示的分组数量。状态栏显示参考消息。如下图所示:

通常,左侧将显示与上下文相关的信息,中间部分将显示有关当前捕获文件的信息,而右侧将显示所选的配置文件。在文本区域之间拖动手柄以更改大小。

初始状态栏,如下图所示:


未加载捕获文件时(例如,启动 Wireshark 时),将显示此状态栏。

状态栏带有已加载的捕获文件,如下图所示:

The colorized bullet…

左侧显示在当前加载的捕获文件中找到的最高专家信息级别。将鼠标悬停在此图标上将显示专家信息级别的描述,单击该图标将弹出专家信息对话框。有关此对话框和每个专家级别的详细说明,请参见 6.1.3 专家资讯。

The edit icon…

使用左侧的 “ 捕获文件属性” 对话框,可以向捕获文件添加注释。

The left side…

默认情况下显示捕获文件名。当将鼠标悬停并在数据包详细信息和数据包字节窗格中选择项目时,它还会显示字段信息,以及常规通知。

The middle…

显示捕获文件中的当前数据包数量。显示以下值:

Packets

捕获的数据包数。

Displayed

当前显示的包数。

Marked

标记的数据包数。仅当您标记了任何数据包时才显示。

Dropped

丢弃的数据包数量仅在 Wireshark 无法捕获所有数据包时显示。

Ignored

忽略的数据包数仅在您忽略任何数据包时才显示。

The right side…

显示所选的配置文件。单击状态栏的此部分将弹出一个菜单,其中包含所有可用的配置文件,从该列表中进行选择将更改配置文件。

带配置配置文件菜单的状态栏

有关配置文件的详细说明。

具有选定协议字段的状态栏

如果您在 “数据包详细信息” 窗格中选择了协议字段,则会显示此信息。

TIP
括号之间的值(在此示例中为 “ipv6.src”)是所选项目的显示过滤器字段。通过选择不同的数据包详细信息项,您可以更加熟悉显示过滤器字段。
带显示过滤器消息的状态栏

如果您尝试使用可能会导致意外结果的显示过滤器,则会显示该信息。

3.小结

好了,到此宏哥就将WireShark常用界面功能的基本上全都讲解和分享完了,今天时间也不早了,就到这里!感谢您耐心的阅读~~

Java虚拟机栈是线程私有的,它的生命周期和线程同步

一个线程每执行到一个方法,JVM就会创建一个栈帧(用于存储基本数据类型、对象指针和返回值等),并将栈帧压入栈中。

代码示例:

public class Example {
    public static void main(String[] args) {
        Example example = new Example();
        example.m1();
    }

    public void m1() {
        int x = 0;
        m2();
    }
    public void m2() {
        Apple y = new Apple();
        m3();
    }
    public void m3() {
        float z = 1.0f;
    }
}

执行流程:

  • 首先,程序启动,main() 方法入栈。
  • 然后,m1() 方法入栈,声明 int 类型变量 x = 0。注意,无论是 x 还是 0 都存储在栈帧中。
  • 接着,m2() 方法入栈,创建了一个 Apple 对象,并被赋给变量 y。请注意,实际的 Apple 对象是在 Java 堆内存中创建的,而不是线程栈中,只有 Apple 对象的引用以及变量 y 被包含在栈帧里。
  • 最后,m3() 方法入栈,声明 float 类型变量 z = 1.0f。同理,z 和 1.0f 都被存储在栈帧里。

当方法执行完成后,所有的线程栈帧将按照后进先出的顺序逐一出栈,直至栈空为止

img

Java线程栈默认大小是由操作系统决定的,一般为1MB或2MB。如果需要调整线程栈的大小,可以使用
-Xss
参数来设置。在实际开发中,默认的线程栈大小通常已经足够满足需求,只有在遇到线程栈溢出错误时才需要考虑调整大小。

一旦递归过深,线程栈的容量增长超过了允许的栈容量,就会抛出StackOverflowError(栈溢出) 错误。

那么什么是内存泄漏和内存溢出呢?

  • 内存溢出(out of memory):指程序在申请内存时,没有足够的内存空间供其使用。
  • 内存泄露(memory leak):指程序在申请内存后,无法释放已申请的内存空间,进而导致内存逐渐被占光。
  • memory leak 最终会导致 out of memory。

内存溢出异常抛出的原因(包括但不限于):

  • 如果新线程在申请栈时失败了,就会抛出 OutOfMemoryError(内存溢出) 错误。
  • 或者当JVM不能分配给对象的创建空间,也会抛出 OutOfMemoryError 错误。

小结:

  • StackOverflowError:递归过深,递归没有出口。
  • MemoryLeak:申请内存后,无法释放已申请的内存空间。
  • OutOfMemoryError:JVM空间溢出,创建对象速度高于GC回收速度。