Pktmon 命令格式
适用于:Windows Server 2022、Windows Server 2019、Windows 10、Azure Stack Hub、Azure、Azure Stack HCI(版本 21H2 和 20H2)
数据包监视器 (Pktmon) 是适用于 Windows 的内置跨组件网络诊断工具。 此工具可以用于数据包捕获、数据包丢弃检测、数据包筛选和计数。 此工具在虚拟化场景(如容器网络和 SDN)中特别有用,因为它提供了网络堆栈中的可见性。 在 Windows 10 和 Windows Server 2019(版本 1809 及更高版本)上,可以通过 pktmon.exe 命令直接使用数据包监视器。 可以使用本主题了解如何了解 pktmon 语法、命令格式设置和输出。 有关命令的完整列表,请参阅 pktmon 语法。
快速入门
使用以下步骤开始一般方案:
确定捕获所需的数据包类型,例如与数据包关联的特定 IP 地址、端口或协议。
检查语法以应用捕获筛选器,并为上一步中标识的数据包应用筛选器。
C:\Test> pktmon filter add help C:\Test> pktmon filter add <filters>
启动捕获并启用数据包日志记录。
C:\Test> pktmon start -c
重现正在诊断的问题。 查询计数器以确认是否存在预期流量,并获取流量在计算机中的流动方式的高级视图。
C:\Test> pktmon counters
停止捕获并检索 txt 格式的日志进行分析。
C:\Test> pktmon stop C:\Test> pktmon etl2txt <etl file>
有关分析 txt 输出的说明,请参阅分析数据包监视器输出。
捕获筛选器
强烈建议在开始任何数据包捕获之前应用筛选器,因为当你专注于单个数据包流时,排查与特定目标的连接问题会更容易。 捕获所有网络流量可能会使输出的干扰性过强,无法分析。 对于要报告的数据包,它必须与至少一个筛选器中指定的所有条件匹配。 一次最多支持 32 个筛选器。
例如,以下筛选器集将捕获以 IP 地址 10.0.0.10 为源或目标的任何 ICMP 流量,并捕获端口 53 上的任何流量。
C:\Test> pktmon filter add -i 10.0.0.10 -t icmp
C:\Test> pktmon filter add -p 53
筛选功能
数据包监视器支持按 MAC 地址、IP 地址、端口、EtherType、传输协议和 VLAN ID 进行筛选。
涉及到 MAC 地址、IP 地址或端口筛选器时,数据包监视器不会区分源或目标。
若要进一步筛选 TCP 数据包,可以选择提供一个列表,其中列出要匹配的 TCP 标志。 支持的标志包括 FIN、SYN、RST、PSH、ACK、URG、ECE 和 CWR。
- 例如,以下筛选器将捕获 IP 地址 10.0.0.10 发送或接收的所有 SYN 数据包:
C:\Test> pktmon filter add -i 10.0.0.10 -t tcp syn
- 如果向任何筛选器添加了 [-e] 标志,则数据包监视器除了可以将筛选器应用于外部数据包之外,还可以将筛选器应用于封装的内部数据包。 支持的封装方法包括 VXLAN、GRE、NVGRE 和 IP-in-IP。 自定义 VXLAN 端口是可选的,默认为 4789。
有关详细信息,请参阅 pktmon filter 的语法。
数据包和常规事件捕获
通过将 [-c] 参数与 start 命令一起使用,数据包监视器可以捕获数据包。 这将启用数据包捕获和日志记录以及数据包计数器。 若要仅启用数据包计数器而不记录数据包,请在 start 命令中添加 [-o] 参数。 有关数据包计数器的详细信息,请参阅下面的数据包计数器部分。
可以通过 [--comp] 参数选择要监视的组件。 可以是仅限 NIC,也可以是组件 ID 列表,默认为所有组件。 还可以使用 [--type] 参数按数据包传播状态(丢弃或流动的数据包)进行筛选。
在捕获数据包的同时,数据包监视器还能捕获常规事件(如 ETW 和 WPP 事件),方法是声明 [-t] 参数并通过 [-p] 参数指定提供程序。 使用“pktmon stop”可停止所有数据收集。
例如,以下命令将仅捕获网络适配器的数据包:
C:\Test> pktmon start -c --comp nics
以下命令将仅捕获通过组件 4 和 5 的丢弃数据包,并记录它们:
C:\Test> pktmon start -c --comp 4,5 --type drop
此命令将捕获来自“Microsoft-Windows-TCPIP”提供程序的数据包和日志事件:
C:\Test> pktmon start --capture --trace -p Microsoft-Windows-TCPIP
数据包日志记录功能
数据包监视器支持多种日志记录模式:
- Circular:达到最大文件大小时,新数据包会覆盖最早的数据包。 此为默认日志记录模式。
- Multi-file:当达到最大文件大小时,将创建新的日志文件。 日志文件按顺序编号:PktMon1.etl、PktMon2.etl 等。应用此日志记录模式以保留所有日志,但要谨慎使用存储。 注意:使用每个日志文件的文件创建时间戳来指示捕获中特定时间范围。
- Real-time:数据包实时显示在屏幕上。 不会创建任何日志文件。 使用 Ctrl+C 可停止监视。
- Memory:事件写入循环内存缓冲区。 可通过 [-s] 参数来指定缓冲区大小。 停止捕获后,缓冲区内容将写入日志文件。 对于干扰很大的情况,则使用此日志记录模式,以在极短的时间内在内存缓冲区中捕获大量流量。 使用任何其他日志记录模式,某些流量可能会丢失。
通过 [-p] 参数指定要记录的数据包量。 通过将 [-p] 参数设置为 0,可记录每个数据包的整个数据包,无论其大小如何。 默认值为 128 字节,这应该能够包括大多数数据包的标头。
通过 [-s] 参数指定日志文件的大小。 这是在循环日志记录模式下文件的最大大小,超过此大小后,数据包监视器会开始使用较新的数据包覆盖较旧的数据包。 这也是多文件日志记录模式下每个文件的最大大小,超过此大小后,数据包监视器将创建新文件以记录下一个数据包。 还可以使用此参数设置内存日志记录模式的缓冲区大小。
有关详细信息,请参阅 pktmon start 的语法。
数据包分析和格式设置
数据包监视器以 ETL 格式生成日志文件。 可以通过多种方法来设置 ETL 文件格式以进行分析:
- 将日志转换为文本格式(默认选项),并使用文本编辑器工具(如 TextAnalysisTool.NET)对其进行分析。 数据包数据将以 TCPDump 格式显示。 按照以下指南了解如何分析文本文件中的输出。
- 将日志转换为 pcapng 格式,以使用 Wireshark* 对其进行分析
- 使用网络监视器*打开 ETL 文件
注意
*使用上面的超链接了解如何在 Wireshark 和网络监视器中解析和分析数据包监视器日志。
有关详细信息,请参阅 pktmon format 的语法。
分析数据包监视器输出
数据包监视器按网络堆栈的每个组件捕获数据包的快照。 因此,每个数据包将有多个快照(在下图中由蓝色框中的线条表示)。 这些数据包快照中的每一个都由几条线(红框和绿框)表示。 至少有一行包括关于以时间戳开始的数据包实例的一些数据。 之后,至少有一行(下图中以粗体显示)以文本格式显示解析的原始数据包(没有时间戳)。如果数据包是封装的,则可能是多行,如绿色框中的数据包。
要关联相同数据包的所有快照,请监视 PktGroupId 和 PktNumber 值(以黄色突出显示)。同一数据包的所有快照都应具有这两个共同的值。 Appearance 值(以蓝色突出显示)用作同一数据包的每个后续快照的计数器。 例如,数据包的第一个快照(数据包首次出现在网络堆栈中的位置)的 appearance 值为 1,下一个快照的 appearance 值为 2,依此类推。
每个数据包快照都有一个组件 ID(上图中带下划线的部分),表示与快照关联的组件。 要解析组件名称和参数,请在日志文件底部的组件列表中搜索此组件 ID. 下图显示了组件表的一部分,以黄色突出显示“组件 1”(这是捕获上述最后一个快照的组件)。 具有 2 条边的组件将在每条边上报告 2 个快照(例如,上图中具有外观 3 和外观 4 的快照)。
在每个日志文件的底部,过滤器列表如下图所示(以蓝色突出显示)。 每个筛选器显示指定的参数(下面示例中的协议 ICMP),其余参数显示为零。
对于丢弃的数据包,表示数据包被丢弃的快照的任何行之前会出现“drop”一词。 每个丢弃的数据包还提供一个 dropReason 值。 此 dropReason 参数提供数据包丢弃原因的简短描述。例如,MTU 不匹配、筛选后的 VLAN 等。
数据包计数器
数据包监视计数器提供整个网络堆栈中网络流量的高级视图,而无需分析日志,这可能是一个昂贵的过程。 启动数据包监视器捕获后,通过使用 pktmon counters 查询数据包计数器来检查流量模式。 使用 pktmon reset 将计数器重置为零,或使用 pktmon stop 停止所有监视。
- 计数器是通过绑定堆栈来排列的,其中网络适配器位于顶层,协议位于底层。
- TX/RX:计数器分为两列,分别用于发送 (Tx) 和接收 (Rx) 方向。
- 边缘:当数据包跨越组件边界(边缘)时,组件会报告数据包传播。 每个组件可以具有一个或多个边缘。 微型端口驱动程序通常具有单个上边缘,协议具有单个下边缘,筛选器驱动程序具有上边缘和下边缘。
- 丢弃:同一表中报告了数据包丢弃计数器。
在以下示例中,启动了新的捕获,然后使用 pktmon counters 命令以在捕获停止之前查询计数器。 计数器显示单个数据包从网络堆栈中发出,从协议层一直到物理网络适配器,其响应从另一个方向返回。 如果 ping 或响应丢失,则很容易通过计数器检测到。
在下一个示例中,在“计数器”列下报告丢弃数。 通过使用“pktmon counters --json”请求 JSON 格式的计数器数据来检索每个组件的上次删除原因,或者分析输出日志以获取更详细的信息。
如这些示例所示,计数器可以通过图表提供大量信息,用户只需一瞥即可进行分析。
有关详细信息,请参阅 pktmon counters 语法。
网络堆栈布局
通过命令 pktmon list 检查网络堆栈布局。
此命令显示按适配器绑定排列的网络组件(驱动程序)。
典型的绑定包括:
- 单个网络接口卡 (NIC)
- 一些(可能是零)筛选器驱动程序
- 一个或多个协议驱动程序(TCP/IP 或其他)
每个组件都由数据包监视器组件 ID 唯一标识,该 ID 用于针对单个组件进行监视。
注意
ID 不是持久的,可能会在重新引导和数据包监视器的驱动程序重新启动时发生变化。
出现在数据包监视器输出中的某些 ID 可能不会出现在组件列表中。 这是由于将一些组件聚合到单个 ID 中,以便更轻松地选择和显示这些组件。 要查找这些组件的原始 ID,请使用 pktmon list --json 并在输出中查找 SecondaryId 属性。
有关详细信息,请参阅 pktmon list 语法。