我想知道当我使用捕获过滤器时 TShark 内部究竟发生了什么。具体来说,假设我有以下过滤器来捕获多播数据:
host 224.0.26.3 && port 12345
wireshark 是否:
- 要求操作系统将接口上的所有数据包复制到其本地缓冲区
- 应用捕获过滤器
- 记录数据
或者
- 要求操作系统仅将来自主机 224.0.26.1 和端口 12345 的接口上的所有数据包复制到其本地缓冲区,然后...
- 记录数据
或者完全是别的东西?
答案1
在大多数操作系统上,它
要求操作系统仅将来自主机 224.0.26.1 和端口 12345 的接口上的所有数据包复制到其本地缓冲区,然后...
记录数据
尽管什么Wireshark和沙克要做的就是运行 dumpcap(Wireshark 的一部分),使用要捕获的接口和要使用的过滤器作为命令行参数,然后 dumpcap 会询问libpcap要求操作系统(或者在 Windows 上为 WinPcap 驱动程序)将所有与过滤器匹配的数据包复制到其本地缓冲区。
在某些操作系统上(例如,Solaris 11 之前的 Solaris、HP-UX 和 IRIX),操作系统无法在内核中进行过滤,因此 libpcap 要求操作系统向其提供所有数据包,然后它(libpcap)自行运行过滤器并仅向其调用者提供与过滤器匹配的数据包 - 对于 Wireshark 和 TShark 而言,为 dumpcap。
答案2
Wireshark 有两种类型的过滤器:显示过滤器和捕获过滤器。
显示过滤器比捕获过滤器更灵活(有些事情捕获过滤器无法做到),因为显示过滤器查看数据后它已被复制到 wireshark 的数据包日志。
如果有大量单独的数据流通过网络接口,但您只想捕获其中的一小部分,则捕获过滤器可以极大地提高性能。如果数据无法匹配捕获过滤器,则永远不会复制到 wireshark。
你可以尝试一下感觉通过执行以下操作来查看 UI 中的性能差异(并观察 CPU 使用率中的性能差异):
- 在本地主机上启动一个快速的网络服务器。
- 开始巨大的HTTP 文件下载(千兆字节数据)。
- 使用捕获过滤器在本地主机网络接口上进行捕获,该过滤器忽略正在进行大量下载的端口。
- 彻底清除捕获过滤器,并将步骤 3 中的性能和 CPU 使用率与在显示过滤器端设置相同类型的过滤器进行比较。
据我所知,Wireshark 将其数据包上限转储到磁盘(因此它不会出现 OOM),因此“太宽”的捕获过滤器出现的瓶颈可能是磁盘子系统必须记录网络接口上发生的所有事情。
这就是为什么,如果你正在对一个非常繁忙的服务器进行 Wireshark 测试,只是为了观察一个特定的流程或进程,那么基本的设置合理的捕获过滤器。否则 wireshark 将引入显著的 CPU 负载和 I/O 吞吐量。
无论如何,在 Windows 上,数据包捕获的实现主要发生在内核端。Wireshark 使用一个名为网卡,一个内核模块,它实际上将你的捕获过滤器编译成本机代码在运行时创建一个极其优化的测试,以确定捕获过滤器是否匹配。如果过滤器不匹配,则数据包永远不会被复制到 wireshark 的进程空间。
pcap 内核端后端的实现可能因平台而异,因此其性能和效率也可能不同。