TShark 是一款开源的命令行网络流量分析工具。它由 Wireshark 的开发者创建,并具备 Wireshark 的大部分功能。它通常被用作 Wireshark 的命令行版本。然而,它也可以像 tcpdump 一样使用。因此,它是进行全面数据包分析的首选工具。
分析技巧
命令行数据包分析提示
TShark 是一款基于文本的工具,适用于数据恢复、深度数据包分析以及脚本自动化。这种强大的功能和灵活性源于其自身的特性。命令行界面由于生成/处理后的数据可以流水线式地传输给其他工具,因此可以使用这些工具。下面列出了数据包分析中最常用的工具。
| Tool/Utility | Purpose and Benefit |
|---|---|
| capinfos | 该程序可提供指定捕获文件的详细信息。建议在开始调查之前查看捕获文件的摘要。 |
| grep | 有助于搜索纯文本数据。 |
| cut | 有助于从指定的数据源中截取部分数据行。 |
| uniq | 过滤重复的行/值。 |
| nl | 查看显示的行数。 |
| sed | 流媒体编辑器。 |
| awk | 用于辅助模式搜索和处理的脚本语言。 |

主要参数
主要参数I
命令行界面和参数
TShark 是一款基于文本(命令行)的工具。因此,对获取的结果进行深入且连续的分析非常容易。它内置了多个选项,可帮助分析人员开展此类调查。然而,了解参数至关重要;你需要掌握内置选项及其相关参数,才能控制输出,避免被 TShark 的详细输出信息淹没。下表解释了最常用的参数。请注意,TShark 需要超级用户权限才能嗅探实时流量并列出所有可用接口。
| 参数 | 说明 | 示例 |
|---|---|---|
-h |
显示帮助信息,列出 TShark 最常用的功能和命令选项。 | tshark -h |
-v |
显示 TShark 和底层 Wireshark 的版本信息。 | tshark -v |
-D |
列出当前系统中可用于抓包的网络接口(网卡)。 | tshark -D |
-i |
指定用于抓包的网络接口,可以使用接口编号或接口名称。 | tshark -i 1``tshark -i ens55 |
| 无参数 | 在默认网络接口上实时抓取并显示网络流量,功能类似于 tcpdump。 |
tshark |
让我们查看给定虚拟机中 TShark 实例的版本信息。

嗅探
网络嗅探是 TShark 的核心功能之一。一台计算机节点可以拥有多个网络接口,这些接口允许主机与网络通信并嗅探网络流量。特定的接口可能与特定的任务/作业相关联。因此,选择嗅探接口的功能可以帮助用户确定并设置合适的嗅探接口。
让我们来看看给定环境中可用的接口

嗅探可以指定接口,也可以不指定。如果指定了接口,TShark 会使用该接口嗅探流量。 如果没有指定接口,TShark 会使用第一个可用的接口,通常在终端中显示为 1。 不指定接口参数相当于默认 -i 1使用默认的嗅探接口。还可以使用 - i 参数设置不同的嗅探接口。TShark 总会在嗅探开始时回显所使用的接口名称。
主要参数II
| 参数 | 说明 | 示例 |
|---|---|---|
-r |
读取抓包文件(Input)。不进行实时抓包,而是分析已经保存的 .pcap 或 .pcapng 文件。 |
tshark -r demo.pcapng |
-c |
指定处理的数据包数量。达到指定数量后自动停止抓包或读取。 | tshark -c 10 |
-w |
将抓取到的网络流量保存到文件中(Output),便于后续使用 Wireshark 或 TShark 分析。 | tshark -w sample-capture.pcap |
-V |
详细模式(Verbose)。显示每个数据包的完整协议解析信息,类似 Wireshark 的「Packet Details」窗口。 | tshark -V |
-q |
静默模式(Quiet)。不在终端显示每个数据包的内容,常用于统计分析或配合其他参数使用。 | tshark -q |
-x |
以十六进制(Hex)和 ASCII 格式显示数据包原始内容。适合查看数据包的底层字节数据。 | tshark -x |
读取捕获文件
TShark 还可以处理 PCAP 文件。可以使用-r参数来处理文件并分析数据包。还可以使用参数来限制显示的数据包数量-c。

写入数据
TShark 还可以将嗅探到的或过滤后的数据包写入文件。可以使用该-w参数将嗅探到的流量保存到文件。此选项有助于分析人员从文件/流量中提取特定数据包并保存以供进一步分析。它还允许分析人员仅与更高级别的调查人员共享可疑数据包/范围。

显示数据包字节数
TShark 可以以十六进制和 ASCII 格式显示数据包详情。可以使用参数查看数据包转储-x。 使用此参数后,所有数据包都将以十六进制和 ASCII 格式显示。因此,可能难以一眼发现异常,所以在减少数据包数量后使用此选项会更加高效。

详细信息
TShark 默认的数据包处理和嗅探操作仅提供一行信息,不显示详细内容。这种默认方式便于追踪已处理/嗅探的数据包数量;不过,TShark 也可以根据指令为每个数据包提供详细信息。详细信息的显示方式与 Wireshark 的"数据包详情面板"类似。由于详细信息会显示大量的数据包详情,因此建议仅对特定数据包使用此选项,而不是对一系列数据包使用。

详细模式会提供完整的数据包详情,这使得分析变得困难(每个数据包都会产生冗长而复杂的终端输出)。然而,它仍然有助于进行深入的数据包分析和脚本编写,这也是 TShark 的优势所在。请记住,详细模式的最佳使用时机是在过滤数据包之后。你可以将上面的输出与下面的屏幕截图进行比较,看看有哪些脚本编写、数据包提取和关联分析的机会!

查看第 9 个数据包的"窗口大小值"是多少?
ini
tshark -r demo.pcapng -Y frame.number==9 -V | grep "window size"
查看第 25 个数据包的"Ack"值是多少?
ini
tshark -r demo.pcapng -Y frame.number==9 -V | grep "Ack*"
捕获条件参数
TShark 可以配置为统计数据包数量并在特定点停止,或者以循环结构运行。最常用的参数说明如下。
| 参数 | 条件类型 | 说明 | 达到条件后的行为 | 示例 |
|---|---|---|---|---|
-a |
Autostop(自动停止) | 定义单次抓包的停止条件 | 停止抓包并退出 | 见下方 |
-b |
Ring Buffer(环形缓冲区) | 定义循环抓包条件 | 创建新文件并继续抓包 | 见下方 |
-a 自动停止(Autostop)
| 参数 | 功能 | 说明 | 示例 |
|---|---|---|---|
-a duration:X |
按时间停止 | 抓包 X 秒后自动停止 | tshark -w test.pcap -a duration:60 |
-a filesize:X |
按文件大小停止 | 文件达到 X KB 后停止抓包 | tshark -w test.pcap -a filesize:1000 |
-a files:X |
按文件数量停止 | 达到 X 个输出文件后停止 | tshark -w test.pcap -a filesize:1000 -a files:3 |
-b 环形缓冲区(Ring Buffer)
| 参数 | 功能 | 说明 | 示例 |
|---|---|---|---|
-b duration:X |
按时间切换文件 | 每 X 秒创建一个新抓包文件并继续抓包 | tshark -w test.pcap -b duration:60 |
-b filesize:X |
按文件大小切换文件 | 文件达到 X KB 后创建新文件继续抓包 | tshark -w test.pcap -b filesize:1000 |
-b files:X |
限制文件数量 | 达到 X 个文件后覆盖最旧文件并继续抓包 | tshark -w test.pcap -b filesize:1000 -b files:3 |
捕获条件参数仅在"捕获/嗅探"模式下有效。如果尝试读取数据,将会收到错误消息。
数据包过滤参数
TShark 中的数据包过滤分为两个维度:实时(捕获)过滤和捕获后(显示)过滤。这两个维度可以通过两种不同的方法进行过滤:使用预定义的语法或 Berkeley 数据包过滤器
| 过滤器类型 | 中文说明 | 使用阶段 | 作用 | 是否可在抓包过程中修改 |
|---|---|---|---|---|
| 捕获过滤器(Capture Filter) | 实时过滤规则,只捕获并保存符合条件的流量。 | 抓包前 | 减少保存到文件的数据包数量,降低存储和处理开销。 | ❌ 不可以,需要在开始抓包前设置 |
| 显示过滤器(Display Filter) | 抓包后过滤规则,仅控制哪些数据包显示出来。 | 抓包后分析 | 不影响原始数据,只减少当前可见的数据包,方便分析。 | ✅ 可以随时修改 |
捕获过滤器用于在捕获文件中仅保留特定类型的流量,而不是所有流量。捕获过滤器的过滤功能有限,其目的是按范围、协议和方向进行过滤。这听起来像是批量/原始过滤,但它仍然能够生成文件大小合理的有序捕获文件。显示过滤器则会在不修改数据包的情况下深入分析捕获文件。
| 参数 | 目的 |
|---|---|
-f |
捕获过滤器。与BPF语法和 Wireshark 的捕获过滤器。 |
-Y |
显示过滤器。与Wireshark 的显示过滤器相同。 |
捕获过滤器
可以点击此处阅读更多关于捕获过滤器语法的信息。
TShark 捕获过滤器限定符(Qualifier)速查表
| 限定符类型 | 可用选项 | 中文说明 | 示例 |
|---|---|---|---|
| Type(目标类型) | host |
按主机 IP 或主机名过滤 | tshark -f "host 10.10.10.10" |
net |
按网段过滤 | tshark -f "net 10.10.10.0/24" |
|
port |
按单个端口过滤 | tshark -f "port 80" |
|
portrange |
按端口范围过滤 | tshark -f "portrange 80-100" |
|
| Direction(方向) | src |
仅匹配源地址/源端口 | tshark -f "src host 10.10.10.10" |
dst |
仅匹配目标地址/目标端口 | tshark -f "dst host 10.10.10.10" |
|
| Protocol(协议) | arp |
ARP 协议 | tshark -f "arp" |
ether |
以太网(MAC)过滤 | tshark -f "ether host F8:DB:C5:A2:5D:81" |
|
icmp |
ICMP 协议 | tshark -f "icmp" |
|
ip |
IPv4 协议 | tshark -f "ip" |
|
ip6 |
IPv6 协议 | tshark -f "ip6" |
|
tcp |
TCP 协议 | tshark -f "tcp" |
|
udp |
UDP 协议 | tshark -f "udp" |
|
ip proto <编号> |
按 IP 协议号过滤 | tshark -f "ip proto 1" |
使用terminator终端实例,在单个终端中实现分屏显示。
- 首先,在终端-1中运行给定的 TShark 命令,开始嗅探流量。
- 然后,在 Terminal-2 中运行给定的 curl 命令来制造网络噪声。
- 在终端 1 中查看嗅探到的数据包结果

可以使用下表练习 TShark 捕获过滤器。
| 过滤类型 | 说明 | 产生测试流量 | 捕获过滤器 |
|---|---|---|---|
| Host Filtering | 捕获与指定主机之间的所有流量 | curl google.com |
tshark -f "host google.com" |
| IP Filtering | 捕获与指定 IP 地址之间的所有流量 | nc 10.10.10.10 4444 -vw 5 |
tshark -f "host 10.10.10.10" |
| Port Filtering | 捕获与指定端口相关的流量 | nc 10.10.10.10 4444 -vw 5 |
tshark -f "port 4444" |
| Protocol Filtering | 捕获指定协议的流量 | nc -u 10.10.10.10 4444 -vw 5 |
tshark -f "udp" |
包含 SYN 字节的数据包数量是多少?
bash
tshark -r demo.pcapng -Y "tcp.flags.syn==1" | wc -l
发送到 IP 地址"10.10.10.10"的数据包数量是多少?
bash
tshark -r demo.pcapng -Y "ip.dst==10.10.10.10" | wc -l
包含 ACK 字节的数据包数量是多少?
bash
tshark -r demo.pcapng -Y "tcp.flags.ack==1" | wc -l
显示筛选器
可以参考官方的显示过滤器参考文档。
TCP 过滤器
| 过滤条件 | 说明 | 示例 |
|---|---|---|
tcp |
所有 TCP 包 | tshark -r demo.pcapng -Y 'tcp' |
tcp.port == 80 |
源或目标端口 80 | tshark -r demo.pcapng -Y 'tcp.port == 80' |
tcp.srcport == 80 |
源端口 80 | tshark -r demo.pcapng -Y 'tcp.srcport == 80' |
tcp.dstport == 80 |
目标端口 80 | tshark -r demo.pcapng -Y 'tcp.dstport == 80' |
tcp.len > 0 |
有负载数据的 TCP 包 | tshark -r demo.pcapng -Y 'tcp.len > 0' |
tcp.window_size_value |
TCP 窗口大小字段 | tshark -r demo.pcapng -Y 'tcp.window_size_value > 10000' |
TCP Flags 过滤器
| 过滤条件 | 含义 | 示例 |
|---|---|---|
tcp.flags.syn == 1 |
SYN 包 | tshark -r demo.pcapng -Y 'tcp.flags.syn == 1' |
tcp.flags.ack == 1 |
ACK 包 | tshark -r demo.pcapng -Y 'tcp.flags.ack == 1' |
tcp.flags.fin == 1 |
FIN 包 | tshark -r demo.pcapng -Y 'tcp.flags.fin == 1' |
tcp.flags.rst == 1 |
RST 包 | tshark -r demo.pcapng -Y 'tcp.flags.rst == 1' |
tcp.flags.push == 1 |
PSH 包 | tshark -r demo.pcapng -Y 'tcp.flags.push == 1' |
tcp.flags.urg == 1 |
URG 包 | tshark -r demo.pcapng -Y 'tcp.flags.urg == 1' |
TCP Analysis 过滤器(考试常考)
| 过滤器 | 中文含义 |
|---|---|
tcp.analysis.retransmission |
TCP 重传 |
tcp.analysis.fast_retransmission |
快速重传 |
tcp.analysis.spurious_retransmission |
多余重传 |
tcp.analysis.lost_segment |
丢失的数据段 |
tcp.analysis.out_of_order |
乱序包 |
tcp.analysis.duplicate_ack |
重复 ACK |
tcp.analysis.zero_window |
接收窗口为 0 |
tcp.analysis.window_update |
窗口更新 |
tcp.analysis.keep_alive |
KeepAlive |
tcp.analysis.keep_alive_ack |
KeepAlive 响应 |
常见 TCP 组合
| 过滤条件 | 含义 |
|---|---|
tcp.flags.syn == 1 && tcp.flags.ack == 0 |
第一次握手(SYN) |
tcp.flags.syn == 1 && tcp.flags.ack == 1 |
第二次握手(SYN/ACK) |
tcp.flags.ack == 1 && tcp.len == 0 |
纯 ACK |
tcp.flags.fin == 1 |
连接关闭 |
tcp.flags.rst == 1 |
连接重置 |
tcp.analysis.retransmission |
TCP 重传 |
tcp.analysis.lost_segment |
丢包 |
tcp.analysis.duplicate_ack |
重复 ACK |
IP 过滤器
| 过滤条件 | 说明 |
|---|---|
ip |
所有 IPv4 包 |
ip.addr == 10.10.10.10 |
源或目标 IP |
ip.src == 10.10.10.10 |
源 IP |
ip.dst == 10.10.10.10 |
目标 IP |
ip.ttl < 10 |
TTL 小于 10 |
ip.proto == 6 |
TCP |
ip.proto == 17 |
UDP |
ip.proto == 1 |
ICMP |
ICMP 过滤器
| 过滤条件 | 说明 |
|---|---|
icmp |
所有 ICMP |
icmp.type == 8 |
Echo Request(Ping 请求) |
icmp.type == 0 |
Echo Reply(Ping 响应) |
DNS 过滤器
| 过滤条件 | 说明 |
|---|---|
dns |
所有 DNS |
dns.flags.response == 0 |
DNS 查询 |
dns.flags.response == 1 |
DNS 响应 |
dns.qry.type == 1 |
A 记录 |
dns.qry.type == 28 |
AAAA 记录 |
dns.qry.name contains "google" |
查询名称包含 google |
HTTP 过滤器
| 过滤条件 | 说明 |
|---|---|
http |
所有 HTTP |
http.request |
HTTP 请求 |
http.response |
HTTP 响应 |
http.request.method == "GET" |
GET 请求 |
http.request.method == "POST" |
POST 请求 |
http.response.code == 200 |
HTTP 200 |
http.response.code == 404 |
HTTP 404 |
练习题
IP 地址为"65.208.228.223"的数据包数量是多少?
bash
tshark -r demo.pcapng -Y 'ip.addr==65.208.228.223' | wc -l
TCP 端口 3371的数据包数量是多少 ?
bash
tshark -r demo.pcapng -Y 'tcp.port==3371' | wc -l
源地址为"145.254.160.237"的数据包数量是多少?
bash
tshark -r demo.pcapng -Y 'ip.src==145.254.160.237' | wc -l
标记为 Duplicate(重复)*的数据包,它的包号(Frame Number)是多少?
arduino
tshark -r demo.pcapng -Y "tcp.analysis.duplicate_ack" -T fields -e frame.number