Как включить точность в наносекундах при захвате живого трафика?

Как указать libpcap v1.6.2 сохранять значения в наносекундах в struct pcap_pkthdr::ts.tv_usec (вместо значений в микросекундах) при захвате пакетов в реальном времени?

(Примечание: этот вопрос похож на Как включить наносекундное разрешение при захвате живых пакетов в libpcap? но этот вопрос достаточно расплывчатый, поэтому я решил задать новый вопрос.)

Для автономных и «мертвых» захватов можно использовать следующие функции, чтобы указать libpcap заполнить член struct pcap_pkthdr ts.tv_usec значениями в наносекундах:

К сожалению, не существует _with_tstamp_precision вариантов для pcap_open_live() или pcap_create().

Я считаю, что захват живых пакетов с разрешением в наносекунды должен быть возможен, поскольку журнал изменений для v1. 5.0 говорит (выделено мной):

Добавлена ​​поддержка получения меток времени с разрешением в наносекунды при захвате и чтении файлов захвата.

Я видел функцию pcap_set_tstamp_type() и pcap-tstamp справочная страница, в которой говорится:

  • PCAP_TSTAMP_HOSThost: Отметка времени, предоставленная хостом, на котором выполняется захват. Точность этой отметки времени не указана; он может быть синхронизирован или не синхронизирован с часами операционной системы хоста.
  • PCAP_TSTAMP_HOST_LOWPREChost_lowprec: Отметка времени, предоставленная хостом, на котором выполняется захват. Это отметка времени низкой точности, синхронизированная с часами операционной системы хоста.
  • PCAP_TSTAMP_HOST_HIPREChost_hiprec: Отметка времени, предоставленная хостом, на котором выполняется захват. Это высокоточная метка времени; он может быть синхронизирован или не синхронизирован с часами операционной системы хоста. Это может быть дороже, чем PCAP_TSTAMP_HOST_LOWPREC.
  • PCAP_TSTAMP_ADAPTERadapter: метка времени, предоставляемая сетевым адаптером, на котором выполняется захват. Это высокоточная метка времени, синхронизированная с часами основной операционной системы.
  • PCAP_TSTAMP_ADAPTER_UNSYNCEDadapter_unsynced: метка времени, предоставляемая сетевым адаптером, на котором выполняется захват. Это высокоточная метка времени; он не синхронизирован с часами операционной системы хоста.

Означает ли здесь фраза «высокоточная метка времени», что значения в наносекундах хранятся в поле ts.tv_usec заголовка? Если это так, PCAP_TSTAMP_HOST говорит «не указано», так как же во время выполнения определить, содержит ли поле ts.tv_usec микросекунды или наносекунды? И какой из них используется по умолчанию, если pcap_set_tstamp_type() никогда не вызывается?


person Richard Hansen    schedule 03.02.2015    source источник


Ответы (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, потому что используемые часы не измеряют до микросекунды или наносекунды.

person Community    schedule 04.02.2015
comment
Разве я не могу просто проверить возвращаемое значение pcap_set_tstamp_precision(), чтобы убедиться, что оно не удалось, вместо вызова pcap_get_tstamp_precision()? - person Richard Hansen; 04.02.2015
comment
Я обновил обе справочные страницы, чтобы упомянуть функции. Обновления появятся в одном из будущих выпусков; когда это появится в вашем любимом дистрибутиве/*BSD/OS X/Solaris/и т. д. другое дело. - person ; 05.02.2015