Хорошо, это может показаться тривиальным, но из-за характера тестирования, необходимого для моего приложения, мне нужно получить точные временные метки.
Я использую WireShark для анализа пакетов.
Предположим, у меня есть сеть с 2 хостами h1 и h2.
h1 и h2 связаны друг с другом через интерфейсы h1-eth0 и h2-eth0 соответственно.
Когда я запускаю Wireshark на хосте h1 для захвата интерфейса h1-eth0, могу ли я быть абсолютно уверен в том, что записываемые метки времени соответствуют системному времени хоста h1?
Хотя это должно быть так, помимо ваших полезных замечаний, было бы действительно полезно, если бы я мог получить ссылку, цитирующую то же самое (это просто для того, чтобы я мог формализовать свое заявление).
[ЗАКЛЮЧИТЕЛЬНЫЕ ЗАМЕЧАНИЯ]: справочная страница для модуля временных меток tcpdump. PCAP-TSTAMP.
ПРИМЕЧАНИЕ. Страница руководства написана самим Гаем Харрисом. :)
Цитата:
При захвате трафика каждому пакету присваивается отметка времени, представляющая для входящих пакетов время прибытия пакета, а для исходящих пакетов - время передачи пакета. Это время является приблизительным временем прибытия или передачи.
Предположим, у меня есть сеть с 2 хостами h1 и h2.
h1 и h2 связаны друг с другом через интерфейсы h1-eth0 и h2-eth0 соответственно.
Когда я запускаю Wireshark на хосте h1 для захвата интерфейса h1-eth0, могу ли я быть абсолютно уверен в том, что записываемые метки времени соответствуют системному времени хоста h1?
Если вы запустите Wireshark (или tcpdump, или WinDump, или snoop, или Microsoft Network Monitor, или Sniffer, или OmniPeek, или Commview, или любой другой Другой сниффер; ответ не относится к Wireshark ...) на хосте h1 пакеты поступают из механизма захвата в сетевом стеке ОС, работающей на хосте h1, а временные метки соответствуют либо времени, когда пакет был временем - отмечен этим сетевым стеком (т. е. меткой времени хоста h1) или, в некоторых случаях, временем, когда пакет был отмечен сетевым адаптером, подключенным к хосту h1 (или, в HP-UX, временем, когда libpcap читает пакет из сетевой стек на хосте h1, поскольку механизм захвата HP-UX сам по себе не устанавливает отметку времени для пакетов).
Таким образом, метка времени наиболее близка к времени хоста на машине, на которой вы запускаете программу сниффера. Оно делает не обязательно соответствовать точному времени, с точностью до микросекунды или наносекунды, когда пакет прибыл на сетевой адаптер хоста h1 (если только сетевой адаптер не ставит метки времени для пакетов; большинство из них не поддерживает это). Между моментом, когда пакет прибыл на сетевой адаптер, и временем, когда он был отмечен отметкой времени, может быть задержка, которая может включать:
Итак, если я могу быть абсолютно уверен в том, что записываемые метки времени соответствуют системному времени хоста h1? » вы имеете в виду «могу ли я быть абсолютно уверенным в том, что записываемые метки времени соответствуют с высокой точностью системному времени хоста h1 на момент прибытия пакета?», ответ будет «не обязательно, даже если вы работаете на хосте. h1 ". Это ближе ко времени, когда пакет прибыл на хост h1, чем ко времени, когда пакет был отправлен с хоста h2, но если вам нужно знать высокоточные и высокоточные значения меток времени, вам понадобится либо специализированный аппаратное обеспечение, которое ставит метки времени для пакетов на сетевом адаптере или специально настроенный путь кода приема (что может означать, что вам придется взломать код драйвера интерфейса и код сетевого стека; такой специально настроенный путь кода приема не является, например , параметр конфигурации для ядра Linux или параметр реестра для ядра Windows).
(Кстати, ответ Митча применим только к Windows; нет такой процедуры, как KeQuerySystemTime
на моем персональном компьютере, например - пакеты имеют отметку времени со значением, возвращаемым подпрограммой с именем microtime
.)
Имейте в виду, что Wireshark - это программа просмотра, а winpcap - приложение для захвата.
На основе кода и полезный пост в их списке рассылки, метка времени получена из KeQuerySystemTime в системах, отличных от x86, и из комбинации KeQuerySystemTime и rdtsc инструкция на не-x86 системах.
В любом случае, ваша точность должна быть выше 100 нс относительно системных часов.
Официальное описание: http://wiki.wireshark.org/Timestamps
Вы просто не можете получить точную метку времени при захвате сетевого трафика в указанной вами конфигурации по следующим причинам:
Проще говоря, очень сложно протестировать хост, используя winpcap, работающий на том же хосте. Обычно я использую внешнее устройство захвата пакетов с хорошими часами, например USC4060.