如何捕捉现场的交通,当我打开纳秒的精度?(How do I turn on nanosecond p

2019-09-30 09:01发布

我该如何告诉libpcap的V1.6.2存储纳秒值struct pcap_pkthdr::ts.tv_usec (而不是微秒值)捕捉现场数据包时?

(注:这个问题是类似于如何捕捉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_precision的变种pcap_open_live()pcap_create()

我相信,捕捉具有纳秒分辨率实况数据包应该是可能的,因为更新日志为V1.5.0说(重点煤矿):

添加拍摄时获得纳秒分辨率时间戳和读取捕捉文件的支持

我没有看到pcap_set_tstamp_type()函数和pcap-tstamp手册页 ,其中说:

  • 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()不会被调用?

Answer 1:

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的幂,因为正在使用的时钟不测量向下到微秒或纳秒。



文章来源: How do I turn on nanosecond precision when capturing live traffic?