如何告诉 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_HOST
—host
:由正在执行捕获的主机提供的时间戳。该时间戳的精度未指定;它可能会也可能不会与主机操作系统的时钟同步。
-
PCAP_TSTAMP_HOST_LOWPREC
—host_lowprec
:由正在执行捕获的主机提供的时间戳。这是一个低精度时间戳,与主机操作系统的时钟同步。
-
PCAP_TSTAMP_HOST_HIPREC
—host_hiprec
:由正在执行捕获的主机提供的时间戳。这是一个高精度的时间戳;它可能会也可能不会与主机操作系统的时钟同步。获取成本可能比PCAP_TSTAMP_HOST_LOWPREC
.
-
PCAP_TSTAMP_ADAPTER
—adapter
:由正在进行捕获的网络适配器提供的时间戳。这是一个高精度时间戳,与主机操作系统的时钟同步。
-
PCAP_TSTAMP_ADAPTER_UNSYNCED
—adapter_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(使用前将#替换为@)