如何告诉libpcap v1.6.2在捕获实时数据包时在struct pcap_pkthdr::ts.tv_usec
中存储纳秒值(而不是微秒值)?
(注意:这个问题类似于How to enable nanosecond resolution when capturing live packets in libpcap?,但这个问题很模糊,我决定问一个新问题。)
对于脱机和“死”捕获,可以使用以下函数告诉libpcap用纳秒值填充struct pcap_pkthdr
的ts.tv_usec
成员:pcap_open_dead_with_tstamp_precision()
pcap_open_offline_with_tstamp_precision()
pcap_fopen_offline_with_tstamp_precision()
不幸的是,对于_with_tstamp_precision
或pcap_open_live()
,似乎没有pcap_create()
变体。
我相信以纳秒分辨率捕获实时数据包是可能的,因为v1.5.0的changelog表示(强调我的):
添加在捕获和读取捕获文件时获取纳秒分辨率时间戳的支持
我确实看到了pcap_set_tstamp_type()
函数和pcap-tstamp
man page,它表示: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()
和pcap_activate()
时,目的是不必为了支持新参数而更改这两个调用,并且在引入新参数时引入新的api。
您应该调用pcap_create()
来创建一个尚未激活的句柄,使用适当的调用设置参数,然后尝试使用pcap_activate()
激活句柄。
其中一个适当的调用是pcap_set_tstamp_precision()
,这是您在pcap_create()
和pcap_activate()
之间使用的调用,用于指定您想要纳秒精度的时间戳。默认为微秒精度时间戳,用于向后源和二进制兼容。
请注意,如果无法从要捕获的设备获取纳秒精度的时间戳,pcap_set_tstamp_precision()
将失败,因此必须检查它是否成功或失败,或者在激活pcap_get_tstamp_precision()
后调用pcap_t
,以查看将获得的时间戳精度。
不,“高精度”与你得到的是微秒还是纳秒无关,这与标称微秒或纳秒值是否真的提供了微秒或纳秒的粒度有关,也与您是否总是会得到10的幂倍数的值有关,因为所使用的时钟的测量值不是微秒或纳秒。
关于c - 捕获实时流量时如何打开纳秒精度?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28310922/