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 语法

快速入门

使用以下步骤开始一般方案:

  1. 确定捕获所需的数据包类型,例如与数据包关联的特定 IP 地址、端口或协议。

  2. 检查语法以应用捕获筛选器,并为上一步中标识的数据包应用筛选器。

    C:\Test> pktmon filter add help
    C:\Test> pktmon filter add <filters>
    
  3. 启动捕获并启用数据包日志记录。

    C:\Test> pktmon start -c
    
  4. 重现正在诊断的问题。 查询计数器以确认是否存在预期流量,并获取流量在计算机中的流动方式的高级视图。

    C:\Test> pktmon counters
    
  5. 停止捕获并检索 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 的语法

分析数据包监视器输出

数据包监视器按网络堆栈的每个组件捕获数据包的快照。 因此,每个数据包将有多个快照(在下图中由蓝色框中的线条表示)。 这些数据包快照中的每一个都由几条线(红框和绿框)表示。 至少有一行包括关于以时间戳开始的数据包实例的一些数据。 之后,至少有一行(下图中以粗体显示)以文本格式显示解析的原始数据包(没有时间戳)。如果数据包是封装的,则可能是多行,如绿色框中的数据包。

Example of Packet Monitor's txt log output

要关联相同数据包的所有快照,请监视 PktGroupId 和 PktNumber 值(以黄色突出显示)。同一数据包的所有快照都应具有这两个共同的值。 Appearance 值(以蓝色突出显示)用作同一数据包的每个后续快照的计数器。 例如,数据包的第一个快照(数据包首次出现在网络堆栈中的位置)的 appearance 值为 1,下一个快照的 appearance 值为 2,依此类推。

每个数据包快照都有一个组件 ID(上图中带下划线的部分),表示与快照关联的组件。 要解析组件名称和参数,请在日志文件底部的组件列表中搜索此组件 ID. 下图显示了组件表的一部分,以黄色突出显示“组件 1”(这是捕获上述最后一个快照的组件)。 具有 2 条边的组件将在每条边上报告 2 个快照(例如,上图中具有外观 3 和外观 4 的快照)。

在每个日志文件的底部,过滤器列表如下图所示(以蓝色突出显示)。 每个筛选器显示指定的参数(下面示例中的协议 ICMP),其余参数显示为零。

Example of Packet Monitor's txt log output components

对于丢弃的数据包,表示数据包被丢弃的快照的任何行之前会出现“drop”一词。 每个丢弃的数据包还提供一个 dropReason 值。 此 dropReason 参数提供数据包丢弃原因的简短描述。例如,MTU 不匹配、筛选后的 VLAN 等。

Example of a dropped packet log

数据包计数器

数据包监视计数器提供整个网络堆栈中网络流量的高级视图,而无需分析日志,这可能是一个昂贵的过程。 启动数据包监视器捕获后,通过使用 pktmon counters 查询数据包计数器来检查流量模式。 使用 pktmon reset 将计数器重置为零,或使用 pktmon stop 停止所有监视。

  • 计数器是通过绑定堆栈来排列的,其中网络适配器位于顶层,协议位于底层。
  • TX/RX:计数器分为两列,分别用于发送 (Tx) 和接收 (Rx) 方向。
  • 边缘:当数据包跨越组件边界(边缘)时,组件会报告数据包传播。 每个组件可以具有一个或多个边缘。 微型端口驱动程序通常具有单个上边缘,协议具有单个下边缘,筛选器驱动程序具有上边缘和下边缘。
  • 丢弃:同一表中报告了数据包丢弃计数器。

在以下示例中,启动了新的捕获,然后使用 pktmon counters 命令以在捕获停止之前查询计数器。 计数器显示单个数据包从网络堆栈中发出,从协议层一直到物理网络适配器,其响应从另一个方向返回。 如果 ping 或响应丢失,则很容易通过计数器检测到。

Example of a packet counter with perfect flow

在下一个示例中,在“计数器”列下报告丢弃数。 通过使用“pktmon counters --json”请求 JSON 格式的计数器数据来检索每个组件的上次删除原因,或者分析输出日志以获取更详细的信息。

Example of a packet counter with a dropped packet

如这些示例所示,计数器可以通过图表提供大量信息,用户只需一瞥即可进行分析。

有关详细信息,请参阅 pktmon counters 语法

网络堆栈布局

通过命令 pktmon list 检查网络堆栈布局。

Example of the networking stack layout

此命令显示按适配器绑定排列的网络组件(驱动程序)。

典型的绑定包括:

  • 单个网络接口卡 (NIC)
  • 一些(可能是零)筛选器驱动程序
  • 一个或多个协议驱动程序(TCP/IP 或其他)

每个组件都由数据包监视器组件 ID 唯一标识,该 ID 用于针对单个组件进行监视。

注意

ID 不是持久的,可能会在重新引导和数据包监视器的驱动程序重新启动时发生变化。

出现在数据包监视器输出中的某些 ID 可能不会出现在组件列表中。 这是由于将一些组件聚合到单个 ID 中,以便更轻松地选择和显示这些组件。 要查找这些组件的原始 ID,请使用 pktmon list --json 并在输出中查找 SecondaryId 属性。

有关详细信息,请参阅 pktmon list 语法