Назад | Перейти на главную страницу

Какое устройство записывает временную метку при анализе сетевого интерфейса с помощью WireShark?

Хорошо, это может показаться тривиальным, но из-за характера тестирования, необходимого для моего приложения, мне нужно получить точные временные метки.

Я использую 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

Вы просто не можете получить точную метку времени при захвате сетевого трафика в указанной вами конфигурации по следующим причинам:

  • В Windows. Linux и FreeBSD вы должны иметь в виду, что временная метка может легко сбиться, по крайней мере, на несколько миллисекунд (и до 10-25 мсек) из-за нагрузки на хост-машину и характера реализации сетевого драйвера и сам сетевой адаптер. В частности, задержкам способствуют обработка сетевых прерываний, а также выделение памяти и другая обработка аппаратных прерываний (например, с вашего жесткого диска). Признавая эту проблему, современные операционные системы обычно используют двухэтапную обработку прерываний. Разделение обработки прерывания на короткие и длинные сегменты дополнительно создает путаницу относительно точного времени, когда тот или иной пакет был получен из-за всех других процессов, которые должны выполняться на той же машине. В результате у вас нет уверенности в том, что касается каких-либо измерений времени, и очень трудно добиться какой-либо точности или точности.
  • Дрейф часов. Если у вас нет специализированного оборудования, ваши временные метки со временем будут дрейфовать. Например, через несколько часов или дней отметки времени на хосте h1 и h2 будут отличаться на секунды или больше. К вашему сведению: дрейф HPET согласно спецификациям Intel (октябрь 2004 г.) составляет от 500 до 2000 ppm или от 0,05% до 0,2%, а более старый RTC еще хуже.
  • Если у вас есть всплеск трафика, который превышает количество буферов, выделенных драйвером сетевого адаптера, вы можете столкнуться с потерей пакетов или неправильной меткой времени из-за аппаратного управления потоком.

Проще говоря, очень сложно протестировать хост, используя winpcap, работающий на том же хосте. Обычно я использую внешнее устройство захвата пакетов с хорошими часами, например USC4060.