【问题标题】:How do I turn on nanosecond precision when capturing live traffic?捕获实时流量时如何打开纳秒精度?
【发布时间】:2025-11-24 16:45:01
【问题描述】:

我如何告诉 libpcap v1.6.2 在捕获实时数据包时将纳秒值存储在 struct pcap_pkthdr::ts.tv_usec(而不是微秒值)中?

(注意:这个问题类似于How to enable nanosecond resolution when capturing live packets in libpcap?,但这个问题太模糊了,我决定问一个新问题。)

对于离线和“死”捕获,可以使用以下函数告诉 libpcap 用纳秒值填充 struct pcap_pkthdrts.tv_usec 成员:

很遗憾,pcap_open_live()pcap_create() 似乎没有 _with_tstamp_precision 变体。

我相信以纳秒分辨率捕获实时数据包应该是可能的,因为 v1.5.0 的 changelog 说(强调我的):

添加对获取纳秒分辨率时间戳的支持在捕获时和读取捕获文件

我确实看到了pcap_set_tstamp_type() 函数和pcap-tstamp man page,上面写着:

  • PCAP_TSTAMP_HOSThost:正在执行捕获的主机提供的时间戳。此时间戳的精度未指定;它可能与主机操作系统的时钟同步,也可能不同步。
  • PCAP_TSTAMP_HOST_LOWPREChost_lowprec:正在执行捕获的主机提供的时间戳。这是一个低精度的时间戳,与主机操作系统的时钟同步。
  • PCAP_TSTAMP_HOST_HIPREChost_hiprec:正在执行捕获的主机提供的时间戳。这是一个高精度的时间戳;它可能与主机操作系统的时钟同步,也可能不同步。获取可能比PCAP_TSTAMP_HOST_LOWPREC 更昂贵。
  • PCAP_TSTAMP_ADAPTERadapter:正在执行捕获的网络适配器提供的时间戳。这是一个高精度时间戳,与主机操作系统的时钟同步。
  • PCAP_TSTAMP_ADAPTER_UNSYNCEDadapter_unsynced:正在执行捕获的网络适配器提供的时间戳。这是一个高精度的时间戳;它与主机操作系统的时钟不同步。

这里的短语“高精度时间戳”是否意味着纳秒值存储在标头的ts.tv_usec 字段中?如果是这样,PCAP_TSTAMP_HOST 表示“未指定”,那么我如何在运行时确定 ts.tv_usec 字段是微秒还是纳秒?如果从未调用过pcap_set_tstamp_type(),那么哪些是默认值?

【问题讨论】:

    标签: c linux pcap libpcap packet-capture


    【解决方案1】:

    pcap_create() 几乎没有为捕获设备设置参数,并且没有其他调用来设置这些参数;这是设计使然。在引入 pcap_create()pcap_activate() 时,其意图是不必更改这些调用以支持新参数,并且在引入新参数时引入新的 API。

    您应该调用pcap_create() 来创建一个尚未激活的句柄,使用适当的调用设置参数,然后尝试使用pcap_activate() 激活句柄。

    其中一个适当的调用是pcap_set_tstamp_precision(),这是您在pcap_create()pcap_activate() 之间使用的调用,用于指定您需要纳秒级精度的时间戳。默认是微秒精度的时间戳,用于向后源代码和二进制兼容性。

    请注意,如果您无法从正在捕获的设备获取纳秒级精度的时间戳,pcap_set_tstamp_precision() 将失败,因此您必须检查它是成功还是失败或在激活 @987654331 后调用 pcap_get_tstamp_precision() @ 以查看您将获得的时间戳精度。

    而且,不,“高精度”与您是否获得微秒或纳秒无关,它与标称的微秒或纳秒值是否真的提供微秒或纳秒的粒度,或者您是否总是会得到值有关这是 10 次方的倍数,因为所使用的时钟不会精确到微秒或纳秒。

    【讨论】:

    • 我不能只检查pcap_set_tstamp_precision()的返回值,看看它是否失败,而不是调用pcap_get_tstamp_precision()吗?
    • 我已经更新了两个手册页以提及这些功能。更新将出现在未来的某个版本中;什么时候会出现在 Your Favorite Distribution/*BSD/OS X/Solaris/etc 中。是另一回事。
    最近更新 更多