Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Передача по UDP.
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Fast Ethernet/Gigabit Ethernet/FibreChannel
b-volkov
Сразу оговариваюсь: только начинаю разбираться с IP, и посему извиняюсь за возможные некорректные формулировки и вопросы.
Изначально стоит задача обмена по UDP между железкой и PC но для "отработки технологии" я попробовал организовать связь между двумя РС. Программировал в Builder XE5 (если это играет какую-то роль) + Winsock. Схема максимально примитивная: на сервере зациклен receivefrom() а клиент выполнят 10 раз подряд sendto() пакета размером 1400 байт.

Нажмите для просмотра прикрепленного файла

На картинке снифера видно, что на все это уходит целых 7мс, т.е. получаем всего 2 мегабайта/с sad.gif. Не маловато для сети 100 Мбит? Предположил, что лишнее время уходит на вызов sendto() и какие-то действия внутри нее и решил передавать данные более крупными кусками - не вышло, передается только один пакет максимального размера. Все-таки UDP должен уметь нарезать передаваемые данные на несколько ethernet-пакетов или за этим только к TCP?
kolobok0
Цитата(b-volkov @ Jan 26 2014, 12:51) *
...Все-таки UDP должен уметь нарезать передаваемые данные на несколько ethernet-пакетов или за этим только к TCP?


UDP распологается над IP. IP может имееть фрагментацию. на приёмной стороне стэк должен уметь так называемо ре-ассемблировать = собирать
по идентификатору IP пакета полный пакет. По приходу конца - проверять наличие собранных кусков и отдавать уровню выше. Либо хранить
некоторое время, перед тем как выкинуть. IP пакеты могут приходить в произвольном порядке.

По умолчанию размер пакета 1500 + изернет фрэйм + CRC его. IP пакет может нести необязательные поля после своего хедера в первом фрагменте.
Для ускорения передачи, можно подкорректировать временные задержки. я сейчас на вскидку не помню названия, но на уровне сокетов есть такие
настройки.

попробуйте сравнить скорость со стандартным пингом. пошлите те-же 14000 раз 100 и посмотрите картину по скорости. у меня с ноута задержки
при стандартном пинге составляют порядка <=10 мкс между уходами пакетов.
АРМ на порядок где то побольше = около 120 мкс. по памяти: всего пинг 7770 писюк-арм около <=2мс в среднем.

b-volkov
С фрагментацией разобрался,пакет передавался полностью, просто у меня фильтр снифера был настроен так, что не показывал остальные фрагменты.

Цитата(kolobok0 @ Jan 27 2014, 00:27) *
Для ускорения передачи, можно подкорректировать временные задержки. я сейчас на вскидку не помню названия, но на уровне сокетов есть такие
настройки.

Увы, ничего похожего в сокете не нашел sad.gif

Цитата(kolobok0 @ Jan 27 2014, 00:27) *
попробуйте сравнить скорость со стандартным пингом. пошлите те-же 14000 раз 100 и посмотрите картину по скорости. у меня с ноута задержки
при стандартном пинге составляют порядка <=10 мкс между уходами пакетов.
АРМ на порядок где то побольше = около 120 мкс. по памяти: всего пинг 7770 писюк-арм около <=2мс в среднем.

Под "стандартным пингом" подразумевается команда "ping" командной строки? Так она отсылает пакеты примерно раз в секунду. Или имелось ввиду, что пинг реализовывать в своей пррограмме?
kolobok0
Цитата(b-volkov @ Jan 31 2014, 11:17) *
... она отсылает пакеты примерно раз в секунду...


Вы каким нить ваиришаком или изереалом смотрите на времена запроса-ответа. с лева второй столбец - так и называется Time sm.gif то что раз в секунду - это понятно...
b-volkov
Цитата(kolobok0 @ Feb 1 2014, 00:05) *
Вы каким нить ваиришаком или изереалом смотрите на времена запроса-ответа. с лева второй столбец - так и называется Time sm.gif то что раз в секунду - это понятно...

Возможно, я Вас не совсем понял, но меня не интересует время между запросом и ответом, я вообще пока не жду никакого ответа.
У меня беда в том, что КОМПЬЮТЕР МЕДЛЕННО отправляет UDP пакеты.


To All:

Так может мне все-таки кто-нибудь ответить, 700 мкс на передачу пакета функцией sendto()( при его, пакета, длительности порядка 15мкс) является нормальным временем?
Если это нормально и есть особенность Winsock, я пойду каким-то другим путем. Если такого быть не должно, то я начну разбираться с причинами.
Заранее спасибо.

krux
если у вас сделан просто цикл, то win его искуственно прерывает (для выполнения других задач)
принудительный context switch производится со скоростью примерно 35 раз в секунду, даже если PC больше делать нечего.

про "700 мкс" вам никто ничего вразумительного не скажет поскольку много неизвестных. начиная от скорости процессора и заканчивая версией драйвера вашей сетевой карты, тем более что PC это не real-time система.

код с event-ами (waitformultipleobjects или подобные аналоги) вместо тупого цикла однозначно будет выполняться оперативнее, но насколько точно вам сможет сказать только профилировщик.
kolobok0
Цитата(b-volkov @ Feb 2 2014, 18:03) *
Возможно, я Вас не совсем понял......


Вы и не пытались.

Для тех кто в танке и ленится сойти, но продолжает орать от боли...sm.gif

Код
    BOOL val = TRUE;
    setsockopt(soc, IPPROTO_TCP, TCP_NODELAY, (const char*)&val, sizeof(val));


Правда это для TCP слоя. Для юдп - задержек не должно быть априори. что послал - то и убежало...

да прибудут с вами знания...
b-volkov
Цитата(krux @ Feb 2 2014, 18:26) *
если у вас сделан просто цикл, то win его искуственно прерывает (для выполнения других задач)
принудительный context switch производится со скоростью примерно 35 раз в секунду, даже если PC больше делать нечего.

про "700 мкс" вам никто ничего вразумительного не скажет поскольку много неизвестных. начиная от скорости процессора и заканчивая версией драйвера вашей сетевой карты, тем более что PC это не real-time система.

PC то она мож и ралтайм... вот Винь...
Но моя проблема не имеет отношения к "задумчивости" винды, поскольку задержки равномерно распределяются между всеми посылками, а быстродействия процессора хватает с запасом на несколко порядков.

Как выяснилось, проблема имеет место на моем рабочем компе и еще одном очень похожем по конфигурации (на обоих Винь 7), но отсутствует на на трех ноутах (два ХР и 8-ка). На ноутах задержки на порядок меньше. Буду копать дальше, железо или ось.

Alexnm
Уважаемый, b-volkov. Вы затронули весьма актуальную (по крайней мере для меня) тему!!! Дело в том, что я напоролся на те же "грабли". Та же "Вынь 7", прога с winsock, udpclient. Нужно управлять девайсом с большой скоростью, а UDP жутко тормозит.

Если Вы найдёте причину, не могли бы Вы поделиться тут решением этой проблемы?

Заранее благодарен.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.