捕获实时流量时如何开启纳秒精度?

2024-05-22

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

(Note: This question is similar to How to enable nanosecond resolution when capturing live packets in libpcap? https://stackoverflow.com/questions/25502139/how-to-enable-nanosecond-resolution-when-capturing-live-packets-in-libpcap but that question is vague enough that I decided to ask a new question.)

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

  • pcap_open_dead_with_tstamp_precision() http://www.tcpdump.org/manpages/pcap_open_dead.3pcap.html
  • pcap_open_offline_with_tstamp_precision() http://www.tcpdump.org/manpages/pcap_open_offline.3pcap.html
  • pcap_fopen_offline_with_tstamp_precision() http://www.tcpdump.org/manpages/pcap_open_offline.3pcap.html

不幸的是,似乎没有_with_tstamp_precision的变种pcap_open_live() http://www.tcpdump.org/manpages/pcap_open_live.3pcap.html or pcap_create() http://www.tcpdump.org/manpages/pcap_create.3pcap.html.

我相信以纳秒分辨率捕获实时数据包应该是可能的,因为变更日志 http://www.tcpdump.org/libpcap-changes.txtv1.5.0 说(强调我的):

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

我确实看到了pcap_set_tstamp_type() http://www.tcpdump.org/manpages/pcap_set_tstamp_type.3pcap.html函数和pcap-tstamp手册页 http://www.tcpdump.org/manpages/pcap-tstamp.7.html,其中说:

  • 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()从未被调用过?


pcap_create()几乎没有为捕获设备设置参数,并且没有其他调用来设置这些参数;这是设计使然。当时的意图pcap_create() and pcap_activate()引入的优点是,无需更改这两个调用即可支持新参数,并且随着新参数的引入,将引入新的 API。

你应该打电话pcap_create()要创建尚未激活的句柄,请使用适当的调用设置参数,然后尝试使用以下命令激活该句柄pcap_activate().

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

捕获实时流量时如何开启纳秒精度? 的相关文章

随机推荐