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

时间:2015-02-03 23:42:31

标签: c linux pcap libpcap packet-capture

如何在捕获实时数据包时告诉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_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(),那么这些是默认值?

1 个答案:

答案 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倍幂的倍数值,因为正在使用的时钟不能测量到微秒或纳秒。