【发布时间】:2025-11-24 16:45:01
【问题描述】:
我如何告诉 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(),那么哪些是默认值?
【问题讨论】:
标签: c linux pcap libpcap packet-capture