реклама на сайте
подробности

 
 
> TCP или UDP?, Подскажите способ реализации
gladov
сообщение Dec 28 2007, 06:36
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687



Поздравляю всех с наступающими праздниками!!! santa2.gif

А вопрос у меня такой. Есть классическая ситуация - некоторое устройство управляется компом по сети, причем находятся они в одной локалке, т.е. все быстро и условно надежно. Устройство получает от компа команды, возвращает результаты замеров, статусы и проч. Встает вопрос что использовать: TCP или UDP?

В пользу TCP говорит тот факт, что не надо проверять доставку (а иногда важная команда должна быть обязательно доставлена, причем выполнена только один раз). Тут появляется большое "но". Фактически, те данные, которые я буду передавать (например, команды) - это пакеты. Т.е. явная пакетная передача данных. А TCP потоковый! Он мне даже не скажет, где одна команда закончилась и новая началась. Т.е. мне надо вводить некий механизм синхронизации чтобы отлавливать начало очередного пакета.
Первое что в голову приходит - самому на своем уровне добавлять в пакет его длину. Но если одна из сторон хоть раз ошибется или сетка сглючит и длина пакета окажется неправильной, то я никогда уже не поймаю начало очередного пакета.
Можно вместо длины (или вместе с ней) пометить сигнатурой начало пакета, а в самом пакете делать байт-стаффинг чтобы она там не повторилась. Не нравится - как-то тяжеловесно получается.
Можно сделать по UDP, но там придется городить подтверждение доставки и контроль на недублирование пакетов. Тоже гемор.
Короче, варианты решения я вижу, но все они мне не нравятся. Мне кажется, что есть какое-то простое и красивое решение, а я заблудился в трех соснах. Т.к. ситуация классическая для большинства встроенных систем, поделитесь плз опытом, кто как решает подобные задачи.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Postoroniy_V
сообщение Dec 28 2007, 07:57
Сообщение #2


МедвеД Инженер I
****

Группа: Свой
Сообщений: 816
Регистрация: 21-10-04
Пользователь №: 951



Цитата(gladov @ Dec 28 2007, 15:36) *
Поздравляю всех с наступающими праздниками!!! santa2.gif

А вопрос у меня такой. Есть классическая ситуация - некоторое устройство управляется компом по сети, причем находятся они в одной локалке, т.е. все быстро и условно надежно. Устройство получает от компа команды, возвращает результаты замеров, статусы и проч. Встает вопрос что использовать: TCP или UDP?

В пользу TCP говорит тот факт, что не надо проверять доставку (а иногда важная команда должна быть обязательно доставлена, причем выполнена только один раз). Тут появляется большое "но". Фактически, те данные, которые я буду передавать (например, команды) - это пакеты. Т.е. явная пакетная передача данных. А TCP потоковый! Он мне даже не скажет, где одна команда закончилась и новая началась. Т.е. мне надо вводить некий механизм синхронизации чтобы отлавливать начало очередного пакета.
Первое что в голову приходит - самому на своем уровне добавлять в пакет его длину. Но если одна из сторон хоть раз ошибется или сетка сглючит и длина пакета окажется неправильной, то я никогда уже не поймаю начало очередного пакета.
Можно вместо длины (или вместе с ней) пометить сигнатурой начало пакета, а в самом пакете делать байт-стаффинг чтобы она там не повторилась. Не нравится - как-то тяжеловесно получается.
Можно сделать по UDP, но там придется городить подтверждение доставки и контроль на недублирование пакетов. Тоже гемор.
Короче, варианты решения я вижу, но все они мне не нравятся. Мне кажется, что есть какое-то простое и красивое решение, а я заблудился в трех соснах. Т.к. ситуация классическая для большинства встроенных систем, поделитесь плз опытом, кто как решает подобные задачи.

а можно подробнее что значит А TCP потоковый! 07.gif кто заставляет Вас посылать больше чем нужно? smile.gif
тут почитайте http://en.wikipedia.org/wiki/Transmission_Control_Protocol

имхо TCP тут самое оно, особенно если (а иногда важная команда должна быть обязательно доставлена, причем выполнена только один раз).


--------------------
Cogito ergo sum
Go to the top of the page
 
+Quote Post
gladov
сообщение Dec 29 2007, 21:35
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687



Цитата(Postoroniy_V @ Dec 28 2007, 10:57) *
а можно подробнее что значит А TCP потоковый! 07.gif

Это значит, что работа с TCP сокетом полностью аналогична работе с файлом, т.е. делаю тот же read() которому Я говорю, сколько байт вычитать из сокета, а не ОН МНЕ сообщает, сколько пришло. Конечно, можно его попросить не блокироваться и отдавать не столько, сколько я попросил, а столько, сколько пришло сейчас, но тогда будет срабатывать на недоконца доставленные пакеты (фрагменты).

Цитата(Postoroniy_V @ Dec 28 2007, 10:57) *
кто заставляет Вас посылать больше чем нужно? smile.gif

Вопрос не ясен. Я посылаю именно столько, сколько нужно, а вот приемник совсем не знает сколько ему сейчас нужно принять.

Цитата(Postoroniy_V @ Dec 28 2007, 10:57) *

Читал, и не только это.

Цитата(Rst7 @ Dec 28 2007, 11:18) *
Не волнуйтесь, этот вопрос возьмет на себя TCP. Он гарантирует, что все будет доставлено в нужном порядке.

Порядок безусловно будет соблюден, но кто гарантирует, что байт с длиной будет принят правильно? Знаете, что ТСР проверяет целостность данных даже не по CRC? Там контрольная сумма считается гораздо проще и давно признана ненадежной.

Цитата(tag @ Dec 28 2007, 11:28) *
...вы противоречите сами себе. Если TCP гарантирует доставку это значит что

Значит, что фрагмент данных будет доставлен и что он окажется в нужном месте потока, но, повторюсь, НЕ ГАРАНТИРУЕТ достоверность доставленных данных. Да, вероятность мала, но она есть!

Цитата(tag @ Dec 28 2007, 11:28) *
Просто вначале пакета (сообщения) на передающей стороне вставляете длину данных и на приемной стороне выбираете (извлекаете) из сокета столько байт сколько указано в этом поле длины. Естесственно в следующей порции данных первым будет поле длины.

Это и ежику понятно, только вот что вы будете делать, если побьется очередной байт с длиной пакета? Если бы из-за этого я потерял один пакет - ерунда. Но связь будет оборвана ПОЛНОСТЬЮ. Отсюда и идея с байт-стаффингом.
И, кстати, битые байты в пакетах ТСР ситуация не гипотетическая. Коллега на эти грабли наступал. Случается крайне редко, но бывает.


Цитата(iosifk @ Dec 28 2007, 12:30) *
Вот что Вы хотели спросить:
У Вас есть команды определенной длины. Длина команды на нижнем уровне должна быть не более 1,5К. Из этой длины вычитаем то, что займет TCP, и все что останется - это и будет максимальной длиной ВАШЕЙ КОМАНДЫ. Теперь ВСЯ ваша команда гарантированно влезет в один пакет. Таким образом, передавая пакет, вы будете в нем иметь полную синхронизацию с Вашими командами, т.е там будет все, начиная от ВАШЕГО заголовка и кончая ВАШЕЙ CRC. Если у Вас команды длинные, то можно их передавать по частям - команда "накопить действия", "проверить статус накопленног", "выполнить накопленные действия"

Почти согласен, но не будем забывать про "окно" в ТСР. Грубо, это размер свободного приемного буфера, который передается приемником передатчику вместа с Аками. Так вот мы имеем дело с микроконтроллером, который не обладает мегабайтами памяти для выделения достаточного количества буферов. Что ему делать? Конечно уменьшать окно. В процессе работы окно иногда уменьшается до нескольких байт! И независимо от настройки MTU пакет будет порван. Есть даже такое понятие как "синдром глупого окна", когда даже с нормальными объемами памяти размер этого окна очень сильно уменьшается из-за сложившихся обстоятельств. Конечно, совеременные реализации ТСР в операционках защищены от подобного эффекта, но я работаю и с мелкими реализациями ТСР для встроенных систем. Как они себя ведут с размерами окна я не знаю.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- gladov   TCP или UDP?   Dec 28 2007, 06:36
|- - Postoroniy_V   Цитата(gladov @ Dec 30 2007, 06:35) Это з...   Dec 30 2007, 05:37
|- - tag   Цитата(gladov @ Dec 30 2007, 00:35) Читал...   Jan 10 2008, 07:36
|- - gladov   Цитата(tag @ Jan 10 2008, 10:36) ...есть ...   Jan 10 2008, 10:56
- - Rst7   ЦитатаНо если одна из сторон хоть раз ошибется или...   Dec 28 2007, 08:18
- - tag   ...вы противоречите сами себе. Если TCP гарантируе...   Dec 28 2007, 08:28
- - iosifk   Цитата(gladov @ Dec 28 2007, 09:36) Поздр...   Dec 28 2007, 09:30
- - KRS   Цитата(gladov @ Dec 28 2007, 09:36) А TCP...   Dec 28 2007, 11:20
- - Rst7   ЦитатаПорядок безусловно будет соблюден, но кто га...   Dec 30 2007, 12:54
- - Aprox   Может, я чего-то не понимаю в тонкостях задачи, но...   Jan 9 2008, 12:23
|- - Rst7   Цитата(Aprox @ Jan 9 2008, 14:23) Может, ...   Jan 10 2008, 06:44
|- - vvs157   Цитата(Rst7 @ Jan 10 2008, 09:44) Это хор...   Jan 10 2008, 12:03
||- - Rst7   Цитата(vvs157 @ Jan 10 2008, 14:03) Испол...   Jan 10 2008, 12:39
||- - vvs157   Цитата(Rst7 @ Jan 10 2008, 15:39) Вот тут...   Jan 10 2008, 16:58
|- - Aprox   Цитата(Rst7 @ Jan 10 2008, 09:44) Это хор...   Jan 10 2008, 17:17
- - Rst7   ЦитатаВопрос традиций Вот и я думаю, зачем челове...   Jan 11 2008, 06:28
|- - vvs157   Цитата(Rst7 @ Jan 11 2008, 09:28) Вот и я...   Jan 11 2008, 12:20
||- - Rst7   Цитата(vvs157 @ Jan 11 2008, 14:20) Весьм...   Jan 11 2008, 12:39
||- - gladov   Цитата(Rst7 @ Jan 11 2008, 15:39) Давай м...   Jan 11 2008, 20:56
||- - vvs157   Цитата(gladov @ Jan 11 2008, 23:56) Полно...   Jan 11 2008, 21:37
||- - Kirill Frolov   Цитата(gladov @ Jan 11 2008, 23:56) Полно...   Jan 12 2008, 08:46
||- - Aprox   Цитата(gladov @ Jan 11 2008, 23:56) Полно...   Jan 14 2008, 08:36
||- - blackfin   Цитата(Aprox @ Jan 14 2008, 11:36) ... до...   Jan 14 2008, 08:52
||- - Aprox   Цитата(blackfin @ Jan 14 2008, 11:52) Ага...   Jan 14 2008, 10:48
|- - Aprox   Цитата(Rst7 @ Jan 11 2008, 09:28) HTML ст...   Jan 11 2008, 13:45
- - Kirill Frolov   Цитата(gladov @ Dec 28 2007, 09:36) В пол...   Jan 11 2008, 14:01
- - Rst7   ЦитатаКогда начинаются разговоры, о том дескать, ч...   Jan 12 2008, 09:31
|- - vvs157   Цитата(Rst7 @ Jan 12 2008, 12:31) А может...   Jan 12 2008, 21:36
|- - Kirill Frolov   Цитата(Rst7 @ Jan 12 2008, 12:31) Я тоже ...   Jan 13 2008, 08:20
- - blackfin   Цитата(Kirill Frolov @ Jan 11 2008, 17:01...   Jan 12 2008, 09:36
- - Rst7   ЦитатаНа телнет неделю? Об этом - чуть ниже, не В...   Jan 13 2008, 12:31
|- - Kirill Frolov   Цитата(Rst7 @ Jan 13 2008, 15:31) Допусти...   Jan 13 2008, 17:47
|- - vvs157   Цитата(Rst7 @ Jan 13 2008, 15:31) А Вы за...   Jan 13 2008, 21:00
- - Rst7   ЦитатаУгу. Ошибка. Такое в реальной жизни не работ...   Jan 13 2008, 18:35
- - Rst7   Цитатагадить потребителю тоже не подобает серьезны...   Jan 14 2008, 06:32
- - Rst7   ЦитатаНа "низшей меге" реализовать полно...   Jan 14 2008, 09:09
|- - blackfin   Цитата(Rst7 @ Jan 14 2008, 12:09) Ну это ...   Jan 14 2008, 09:52
- - GL_basik   Вставлю свои 5 копеек.... Если надо бытро и легко ...   Jan 17 2008, 10:07
|- - Aprox   Цитата(GL_basik @ Jan 17 2008, 13:07) Вст...   Jan 17 2008, 16:12
|- - Dog Pawlowa   Без рассмотрения: - структуры прибора - объема пе...   Jan 17 2008, 16:35
|- - blackfin   Цитата(Aprox @ Jan 17 2008, 19:12) По это...   Jan 17 2008, 16:52
|- - Aprox   Цитата(blackfin @ Jan 17 2008, 19:52) Сра...   Jan 18 2008, 08:21
|- - blackfin   Цитата(Aprox @ Jan 18 2008, 11:21) Необхо...   Jan 18 2008, 09:01
|- - Aprox   Цитата(blackfin @ Jan 18 2008, 12:01) При...   Jan 18 2008, 16:13
|- - blackfin   Цитата(Aprox @ Jan 18 2008, 19:13) Делаю ...   Jan 19 2008, 10:38
|- - Aprox   Цитата(blackfin @ Jan 19 2008, 13:38) Нов...   Jan 20 2008, 16:29
- - Rst7   ЦитатаПо этой причине, конструкторам малых систем...   Jan 17 2008, 16:27
- - GL_basik   Если есть время сначала создавать устройство, пото...   Jan 18 2008, 09:09
- - Rst7   Цитатано ограничение на максимальное кол-во хостов...   Jan 19 2008, 13:46
|- - blackfin   Цитата(Rst7 @ Jan 19 2008, 16:46) Это отк...   Jan 19 2008, 17:23
- - Rst7   ЦитатаА что, существуют switch'и на большее чи...   Jan 19 2008, 18:27
- - prottoss   Привет всем! Прочитал в теме про упоминание A...   Feb 8 2008, 13:22
|- - Aprox   Цитата(prottoss @ Feb 8 2008, 16:22) Прив...   Feb 9 2008, 15:04
|- - Aprox   Цитата(Aprox @ Feb 9 2008, 18:04) Я польз...   Feb 10 2008, 08:13
|- - prottoss   Цитата(Aprox @ Feb 10 2008, 15:13) дабы н...   Feb 10 2008, 09:21
- - Rst7   ЦитатаВозможно у кого нибудь есть наработки по это...   Feb 8 2008, 13:42
|- - prottoss   Цитата(Rst7 @ Feb 8 2008, 20:42) Наработо...   Feb 8 2008, 13:51
- - prottoss   Все оказалось на много проще, чем я думал....пока ...   Feb 8 2008, 15:46
- - Rst7   ЦитатаКогда все отработаю, естественно встанет воп...   Feb 10 2008, 13:00


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 23:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01439 секунд с 7
ELECTRONIX ©2004-2016