如何告诉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_dead_with_tstamp_precision()
pcap_open_offline_with_tstamp_precision()
pcap_fopen_offline_with_tstamp_precision()
不幸的是,对于_with_tstamp_precisionpcap_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/

10-11 22:13