Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WinPcap, нужна помощ с этой вещицей 
V
    Опции темы
Avashah
Дата 23.6.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Цитата(xvr @  22.6.2009,  15:55 Найти цитируемый пост)
Если хотите ТОЧНО восстановить очередность, надо полагаться не на порядок приема пакетов, а на timestamp в winpcap описателях пакетов. Но нужно засинхронизовать время на компах (см NTP)

Известны ли Вам реализации NTP протокола на .NET языках с открытым кодом? Существут SNTP клиент на C#, однако упрощенный протокол не позволяет получить разницу во времени между двумя машинами с точностью выше чем 1 секунда.
Подозреваю, что в локальной сети можно поднять NTP-сервер и синхронизировать с ним целевые машины. Однако, это не всегда осуществимо.
p.s. Простите, что не в тему

Это сообщение отредактировал(а) Avashah - 23.6.2009, 15:29
PM MAIL   Вверх
xvr
Дата 23.6.2009, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Avashah @ 23.6.2009,  15:24)
Известны ли Вам реализации NTP протокола на .NET языках с открытым кодом? 

Мне неизвестны, однако это не значит, что их нету  smile 
Но точно есть на С
Цитата

Подозреваю, что в локальной сети можно поднять NTP-сервер и синхронизировать с ним целевые машины. Однако, это не всегда осуществимо.
Вполне осуществимо, сервер можно запустить самому. А вот конектится к удаленным NTP серверам явно не всегда осуществимо, может банально не быть доступа в Inet

PM MAIL   Вверх
Avashah
Дата 23.6.2009, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Цитата(xvr @  23.6.2009,  17:05 Найти цитируемый пост)
Вполне осуществимо, сервер можно запустить самому. А вот конектится к удаленным NTP серверам явно не всегда осуществимо, может банально не быть доступа в Inet

Не осуществимо в том смысле, что клиент не допустит установку NTP сервера. А на счет интернета - я так понял, что для синхронизации времени в локальной сети с одной из машин внутри той же сети, интерент и не нужен.
Цитата(xvr @  23.6.2009,  17:05 Найти цитируемый пост)
Но точно есть на С
 
Если есть ссылка, то было бы просто супир!smile

PM MAIL   Вверх
xvr
Дата 23.6.2009, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Avashah @ 23.6.2009,  17:44)
Цитата(xvr @  23.6.2009,  17:05 Найти цитируемый пост)
Вполне осуществимо, сервер можно запустить самому. А вот конектится к удаленным NTP серверам явно не всегда осуществимо, может банально не быть доступа в Inet

Не осуществимо в том смысле, что клиент не допустит установку NTP сервера. 

Но запуск программы он допустит? NTP сервер вполне можно сделать программой. Можно его сделать и не сервером - ведь нужно всего лишь получить точную разницу часов на 2х машинах. NTP протокол (и сорцы сервера и клиента) вполне подойдут
Цитата

А на счет интернета - я так понял, что для синхронизации времени в локальной сети с одной из машин внутри той же сети, интерент и не нужен.
Нужен сервер. C# клиент, на который была ссылка, использовал сервера из Интернета

Цитата

Цитата(xvr @  23.6.2009,  17:05 Найти цитируемый пост)
Но точно есть на С

Если есть ссылка, то было бы просто супир!smile
 http://www.ntp.org/

PM MAIL   Вверх
Avashah
Дата 25.6.2009, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



По поводу структуры отловленного пакета: вот здесь сказано, что "Для выделения границ блоков принятых данных BPF снабжает их заголовком, содержащим время приема и размер блока, а также концевиком для синхронизации блоков данных." То же самое справедливо и для NDIS? Играет ли это какю-либо роль при сравнении уходящего/приходящего пакета? Я имею ввиду, что WinPcap при генерации события отправки/получения пакета передает в pcap_handler заголовок, добавляемый драйвером захвата, и сам пакет (целиком или фрагмент?). Так входит ли во второй параметр тот самый "концевик"? Это конечно напрямую зависит от того, передается ли в callback процедуру пакет целиком или фрагментарно. 
Как Вы думаете, разумно ли сравнивать пакеты по их CRC-сумме? 
Цитата

Нужен сервер. C# клиент, на который была ссылка, использовал сервера из Интернета

Он может получать время с любой доступной машины, как в локальной сети, так и в Internet, лишь бы был открыт 123-й порт. В этом исходниках этого клиента есть несколько проблем, но они решаемы. Проблема в том, что он не дает желаемой точностиsmile 
Цитата

нужно всего лишь получить точную разницу часов на 2х машинах. NTP протокол (и сорцы сервера и клиента) вполне подойдут
Цитата

Да, именно так. Однако, откровенно говоря, С/С++ мне практически незнакомы. Начинал с Delphi, теперь перешел на C#. А под .Net найти открытой реализации NTP клиента пока не удалось.

Это сообщение отредактировал(а) Avashah - 25.6.2009, 10:37
PM MAIL   Вверх
xvr
Дата 25.6.2009, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Avashah @ 25.6.2009,  10:28)
Я имею ввиду, что WinPcap при генерации события отправки/получения пакета передает в pcap_handler заголовок, добавляемый драйвером захвата, и сам пакет (целиком или фрагмент?). 

Пакет целиком, с Ethernet заголовком, но без CRC поля.
Цитата

Это конечно напрямую зависит от того, передается ли в callback процедуру пакет целиком или фрагментарно. 
Пакет целиком
Цитата

Как Вы думаете, разумно ли сравнивать пакеты по их CRC-сумме? 
Если только вы ее сами посчитаете

Цитата

Цитата

Нужен сервер. C# клиент, на который была ссылка, использовал сервера из Интернета

Он может получать время с любой доступной машины, как в локальной сети, так и в Internet, лишь бы был открыт 123-й порт. 
Вам не нужна 'любая' машина, вам нужно засинхронизовать 2 свои машины. Конечно можно засинхронизовать обе машины с 3й в сети, но тогда на машинах нужны клиенты, встроенные в систему, что бы они синхронизировали именно системное время. Кроме того, 123 порт должен не просто 'быть открытым', на нем должен работать NTP сервер
Цитата

В этом исходниках этого клиента есть несколько проблем, но они решаемы. Проблема в том, что он не дает желаемой точностиsmile 
Сам NTP дает гораздо большую точность, чем 1секунда.
Цитата

А под .Net найти открытой реализации NTP клиента пока не удалось.
Как только MS ядро ОС на .net напишет, так сразу  smile 

PM MAIL   Вверх
Avashah
Дата 25.6.2009, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Ну вот смотрите: вышеуказанный клиент, реализующий SNTP протокол, может получить разницу во времени с любой машины, по крайней мере в локальной сети, если она доступна. Т.е. видимо для этого достаточно стандартных средств Windows (возможно, 123 порт слушает служба синхронизации веремни). Никакого сервера там устанавливать не нужно для этого. С клиентом, реализующим NTP протокол, я полагаю, дело обстоит сложнее. Без установки сервера NTP на той машине, с которой будем синхронизироваться, не обойдешься. Но это так, к слову. Я уже понял, что написание NTP клиента под .net весьма проблематично, как и поиск исходников. Остается, либо брать готовое ядро на C/C++ и использовать его, либо пользоваться готовым софтом для синхронизации времени. Один вариант я уже нашел, но он как минимум не очень удобен. В любом случае, спасибо за консультацию!
PM MAIL   Вверх
xvr
Дата 25.6.2009, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Avashah @ 25.6.2009,  14:35)
Ну вот смотрите: вышеуказанный клиент, реализующий SNTP протокол, может получить разницу во времени с любой машины, по крайней мере в локальной сети, если она доступна. Т.е. видимо для этого достаточно стандартных средств Windows (возможно, 123 порт слушает служба синхронизации веремни). 

Да действительно. Сервер там уже есть (живет в w32time.dll в system32)
Цитата

Никакого сервера там устанавливать не нужно для этого. 
Уже стоит
Цитата

С клиентом, реализующим NTP протокол, я полагаю, дело обстоит сложнее. 
Проще. Нам не надо синхронизировать системные часы, поэтому клиент не обязан быть частью системы - мы можем его включить в состав своей программы
Цитата

Без установки сервера NTP на той машине, с которой будем синхронизироваться, не обойдешься. 
Он уже есть

Цитата

Остается, либо брать готовое ядро на C/C++ и использовать его, 
Угу



PM MAIL   Вверх
Avashah
Дата 26.6.2009, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



На сайте разработчиков отдельно не выкладываются ни исходники ядра, ни само ядро NTP клиента (в виде библиотеки, например). Исходя из моих скромных знаний С, могу предположить, что посылку запроса и получение ответа (функции sendrequest и getresponce соответственно) достаточно затруднительно отделить от реализации ntpd. Поправьте меня, если я ошибаюсь.
Кстати, ntpdate не может получить разницу во времени, если на предполагаемом сервере времени не запущен ntpd. Получается, стандартных средств (w32time.dll) недостаточно для ответа? 

Это сообщение отредактировал(а) Avashah - 26.6.2009, 17:04
PM MAIL   Вверх
xvr
Дата 27.6.2009, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Avashah @ 26.6.2009,  14:41)
На сайте разработчиков отдельно не выкладываются ни исходники ядра, ни само ядро NTP клиента (в виде библиотеки, например).

На сайте разработчиков выложены ИСКЛЮЧИТЕЛЬНО исходники этого всего
Цитата

Source releases and patches

The NTP project only produces source code releases of NTP. These releases may be installed using the standard Unix "make" command.
 http://www.eecis.udel.edu/~ntp/ntp_spool/n...tp-4.1.2.tar.gz

Цитата

Исходя из моих скромных знаний С, могу предположить, что посылку запроса и получение ответа (функции sendrequest и getresponce соответственно) достаточно затруднительно отделить от реализации ntpd.
Соответствующие RFC читать не пробовали? На сайте есть ссылки

Цитата

Кстати, ntpdate не может получить разницу во времени, если на предполагаемом сервере времени не запущен ntpd. Получается, стандартных средств (w32time.dll) недостаточно для ответа?
Я не знаю, какую часть функциональности реализует w32time.dll, надо смотреть MSDN

PM MAIL   Вверх
Avashah
Дата 7.7.2009, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



А вот такая деталь: в протоколе TCP фигурирует механизм квитирования - "отчет о доставке" каждого кадра, входящего в TCP пакет.  В WinPcap же событие прихода пакета, как я понял, генерируется для всего пакета (собранного из кадров), а не для каждого кадра в отдельности. Соответственно, на каждое событие отправления TCP пакета будет приходиться несколько событий получения "отчета о доставке", ведь каждая квитанция идет отдельным пакетом.  Верно?
p.s. хотя вероятно неверно. При использовании протокола TCP поток байт, подлежащих передаче, делится на сегменты. Каждый сегмент передается отдельным TCP пакетом (которые и будут "отловлены" WinPcap) со своим номером последовательности (где номер последовательности - это число уже переданных байтов из исходной последовательности + 1), а так же набором флагов SYN и ACK. При получении пакета получатель (Б) информирует отправителя (А) о получении. Это происходит посредством отправки ответного TCP пакета (возможно после обработки исходного, а так же ответ получателя Б сам может являться новым запросом каких-то данных у точки А), где указывается номер подтверждения, равный общему числу полученных байт данных от точки А... Каша в голове. Так что же выступает подтверждением доставки? Если в ответ на пакет из А в Б с номером последовательности N, получаем пакет из Б в А с номером подтверждения > N. Так? Причем, совершенно необязательно, что подтверждение придет сразу же. Так?
При помощи WinPcap мы сможем отследить и запрос и подтверждение. Но сможем ли мы по этим двум пакетам определить (хотя бы приблизительно) время, затраченное на доставку? Ведь на два запроса может придти одно подтверждение.

Это сообщение отредактировал(а) Avashah - 7.7.2009, 12:54
PM MAIL   Вверх
xvr
Дата 7.7.2009, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Avashah @ 7.7.2009,  11:58)
А вот такая деталь: в протоколе TCP фигурирует механизм квитирования - "отчет о доставке" каждого кадра, входящего в TCP пакет.  

Угу
Цитата

В WinPcap же событие прихода пакета, как я понял, генерируется для всего пакета
Для Ethernet пакета, а не TCP пакета. WinPcap работает на более низком уровне, чем даже голый IP (не говоря уже об TCP)
Цитата

Соответственно, на каждое событие отправления TCP пакета будет приходиться несколько событий получения "отчета о доставке", ведь каждая квитанция идет отдельным пакетом.  Верно?
Нет. Квитанция будет 1 штука (максимум) на весь TCP пакет, или даже меньше - TCP поддерживает отправку одной квитанции на несколько пакетов сразу. Кроме того, насколько я помню, в TCP квитанции могут быть инкапсулированны в пакеты данных (хотя могу и ошибаться, кто помнит - поправьте)

PM MAIL   Вверх
Avashah
Дата 7.7.2009, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Не успел отредактировать, уже ответsmile Спасибо. Но вопросы остаются. И добавился еще один - всегда ли квитанция приходит TCP пакетом?
PM MAIL   Вверх
xvr
Дата 7.7.2009, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Avashah @ 7.7.2009,  11:58)
Так что же выступает подтверждением доставки? 

Собственно ответный пакет и выступает. Точнее номер подтвержденного сегмента.
Цитата

Если в ответ на пакет из А в Б с номером последовательности N, получаем пакет из Б в А с номером подтверждения > N. Так? 
Так
Цитата

Причем, совершенно необязательно, что подтверждение придет сразу же. Так?
Так
Цитата

При помощи WinPcap мы сможем отследить и запрос и подтверждение. 
Да.
Цитата

Но сможем ли мы по этим двум пакетам определить (хотя бы приблизительно) время, затраченное на доставку?
Только приблизительно. Мы можем получить одно подтверждение на несколько пакетов. Времена на их доставку будут разные.
Цитата

Ведь на два запроса может придти одно подтверждение.
Да. Можно считать, что время на доставку равно времени получения подтверждения минус время отправки пакета с сегментом. Причем пакетов с сегментами может быть несколько, а пакет с подтверждением - один.

Цитата

И добавился еще один - всегда ли квитанция приходит TCP пакетом?
Всегда, если только пакет не потерялся по дороге (тогда квитанции не будет)

PM MAIL   Вверх
Avashah
Дата 7.7.2009, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Спасибо. Все больше склоняюсь к тому, что задача общего решения не имеет.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0583 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.