如何在捕获实时数据包时告诉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()
不幸的是,pcap_open_live()
或pcap_create()
似乎没有_with_tstamp_precision
个变体。
我认为应该可以捕获具有纳秒分辨率的实时数据包,因为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()
,那么这些是默认值?
答案 0 :(得分:2)
pcap_create()
几乎没有为捕获设备设置参数,也没有替代调用来设置这些参数;这是设计的。引入pcap_create()
和pcap_activate()
时的意图是,为了支持新参数,不需要更改这些调用,并且随着新参数的引入将引入新API
您应该调用pcap_create()
来创建尚未激活的句柄,使用适当的调用设置参数,然后尝试使用pcap_activate()
激活句柄。
其中一个适当的调用是pcap_set_tstamp_precision()
,这是您在pcap_create()
和pcap_activate()
之间使用的调用,用于指定您需要纳秒级精度时间戳。默认值为微秒精度时间戳,用于向后源和二进制兼容性。
请注意,如果您无法从正在捕获的设备上获取纳秒精度时间戳,则pcap_set_tstamp_precision()
将失败,因此您必须检查它是成功还是失败,或者调用{{ 1}}激活pcap_get_tstamp_precision()
后,以查看您将获得的时间戳精度。
并且,不,"高精度"与是否获得微秒或纳秒无关,它与标称微秒或纳秒值是否确实提供微秒或纳秒粒度有关,或者您是否总是得到10倍幂的倍数值,因为正在使用的时钟不能测量到微秒或纳秒。