|
|
  |
Склеиваются UDP пакеты |
|
|
|
Nov 21 2016, 04:42
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 3-09-04
Из: Russia, Novosibirsk
Пользователь №: 590

|
Всем добрый день. Имеется SIM800C, который раз в 5сек отсылает UDP пакет на сервер, на что сервер ему немедленно отвечает. Большую часть времени работает стабильно, но иногда наблюдается такая картина: -> модем отправил пакет <- пришел ответ -> модем отправил пакет <- пришел ответ -> модем отправил пакет -> модем отправил пакет -> модем отправил пакет <- пришло сразу 3 пакета в одном Сервер при этом пишет, что честно отправил ответ немедленно. По потреблению модема видно, что все эти 15сек. данные действительно не приходят. Такие дикие задержки на сети оператора? Или что-то еще? Ладно бы задержки, но как разделять эти пакеты? Модем не дает никакой информации о том, где один пакет закончился и начался другой, выдает данные одним потоком. Может есть способ от модема добиться больше информации? При этом непонятно - то ли пакеты склеились на стороне оператора (чего быть не должно), то ли пришли с таким коротким интервалом, что модем их выдал одним пакетом.
|
|
|
|
|
Nov 21 2016, 07:15
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(Daniil @ Nov 21 2016, 09:39)  . . . . С модемом общаюсь через com-порт с аппаратным управлением потоком. А каким образом пакет запроса "клиента"/Tx (то что закачивается в SIM через COM-порт) пакуется в UDP ? Вообще, при передаче по сети возможна "переукладка" пакетов во фреймы с разным форматом, в том числе размером данных. Если Вы работаете не в блочном режиме, а "потоком", то "слипание" это вполне закономерно. Тк. формально тракт передачи для "потока" отработал нормально. Надо также учитывать буферизацию на всех этапах.
|
|
|
|
|
Nov 21 2016, 07:32
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (k155la3 @ Nov 21 2016, 10:15)  Если Вы работаете не в блочном режиме, QUOTE UDP (англ. User Datagram Protocol — протокол пользовательских датаграмм) QUOTE Датаграмма (англ. datagram, дейтаграмма) — блок информации, передаваемый протоколом без предварительного установления соединения и создания виртуального канала
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 21 2016, 11:17
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(Daniil @ Nov 21 2016, 06:42)  Имеется SIM800C, который раз в 5сек отсылает UDP пакет на сервер, на что сервер ему немедленно отвечает. Большую часть времени работает стабильно, но иногда наблюдается такая картина: ...
<- пришло сразу 3 пакета в одном
Сервер при этом пишет, что честно отправил ответ немедленно. По потреблению модема видно, что все эти 15сек. данные действительно не приходят.
Такие дикие задержки на сети оператора? Или что-то еще? Ладно бы задержки, но как разделять эти пакеты? Модем не дает никакой информации о том, где один пакет закончился и начался другой, выдает данные одним потоком. Может есть способ от модема добиться больше информации? При этом непонятно - то ли пакеты склеились на стороне оператора (чего быть не должно), то ли пришли с таким коротким интервалом, что модем их выдал одним пакетом. Честно говоря, не понимаю, что вас удивляет? На мой взгляд нормальная ситуация. Вы используете UDP, это протокол с негарантированной доставкой, как СОМ порт: послали данные, а дошли они или нет до адресата, протокол не гарантирует, это ваша забота. У вас же каждые 5 сек отсылаются пакеты без ожидания ответа. В расчете, что "ну уж за 5 секунд, они то дойдут". Откуда такая уверенность? Я при отладке иногда наблюдал, что посланный по GPRS пакет доходил до сервера и обратно почти за 2 минуты  По поводу склеивания нескольких ответов - тоже нормально. Протоколы группы TCP/IP не гарантируют, что адресату придет точно такой-же пакет с заголовками и прочим обрамлением, как вы послали. Гарантируется только, что придут ваши ДАННЫЕ. А они справно приходят. Так что или ожидайте ответов на каждый запрос перед посылкой нового, или разбирайте пачки ответов на приеме.
|
|
|
|
|
Nov 21 2016, 12:23
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Baser @ Nov 21 2016, 14:17)  Протоколы группы TCP/IP не гарантируют, что адресату придет точно такой-же пакет с заголовками и прочим обрамлением, как вы послали. Гарантируется только, что придут ваши ДАННЫЕ. А они справно приходят. Вот этот вопрос мне тоже интересен. То, что TCP может резать/клеить как угодно - известно всем. Потому что это потоковый протокол. И сосок (socket) под него открывается с параметром SOCK_STREAM. Здесь же речь идет об UDP, который по определению протокол передачи датаграмм. И Сосок открывается с параметром SOCK_DGRAM. Насколько я себе понимаю - датаграммы резать/клеить в пути никто не имеет права. И построенные поверх UDP протоколы (DHCP, DNS, NTP) поразумевают наличие определенных данных в определенных местах датаграммы.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 21 2016, 12:42
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Цитата(Baser @ Nov 21 2016, 16:17)  У вас же каждые 5 сек отсылаются пакеты без ожидания ответа. А что, таймаут в 5 секунд недопустим? Ждать 5 минут ответа?  Цитата(Сергей Борщ @ Nov 21 2016, 17:23)  Здесь же речь идет об UDP, который по определению протокол передачи датаграмм. И Сосок открывается с параметром SOCK_DGRAM. Насколько я себе понимаю - датаграммы резать/клеить в пути никто не имеет права. Имеют право или не имеют... Или просто имеют.. Лично наблюдал, когда ОпСоС менял несколько байтов в UDP пакете. При этом длина пакета не поменялась, UDP CRC верное.... Так что, теоретически, и склеить может как 2 пальца изолентой...
|
|
|
|
|
Nov 21 2016, 12:46
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(Сергей Борщ @ Nov 21 2016, 14:23)  Насколько я себе понимаю - датаграммы резать/клеить в пути никто не имеет права. И построенные поверх UDP протоколы (DHCP, DNS, NTP) поразумевают наличие определенных данных в определенных местах датаграммы. Наверное таки да, согласен, я писал применительно к ситуации топикстартера. Он применяет встроенный стек модема, команду AT+CIPSEND, которая формирует UDP пакеты самостоятельно. Она же их и принимает и вытаскивает из них данные. Поэтому на выходе модема пользователем уже получаются чистые данные БЕЗ обрамления пакета. Для DaniilМы в таких случаях внутри своих данных применяем поле с номером пакета, при этом разбор пакетов не представляет сложности. Цитата(Alechek @ Nov 21 2016, 14:42)  А что, таймаут в 5 секунд недопустим? Ждать 5 минут ответа? Зависит от задачи. Если время есть, можно и подождать. А можно через некоторое время посылать повторы. Но в этом случае разборщик ответов должен быть соответствующий.
|
|
|
|
|
Nov 21 2016, 12:50
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Alechek @ Nov 21 2016, 15:42)  Так что, теоретически, и склеить может как 2 пальца изолентой... Теоретически туристы могут писать на памятник Свободы в Риге, что они иногда и делают, несмотря на то, что это запрещено. Вы можете привести ссылку на конкретный стандарт, где написано, что склеивать UDP-пакеты можно?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 21 2016, 13:40
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 3-09-04
Из: Russia, Novosibirsk
Пользователь №: 590

|
Цитата(Baser @ Nov 21 2016, 18:17)  Честно говоря, не понимаю, что вас удивляет? На мой взгляд нормальная ситуация. Вы используете UDP, это протокол с негарантированной доставкой, как СОМ порт: послали данные, а дошли они или нет до адресата, протокол не гарантирует, это ваша забота. У вас же каждые 5 сек отсылаются пакеты без ожидания ответа. В расчете, что "ну уж за 5 секунд, они то дойдут". Откуда такая уверенность? Я при отладке иногда наблюдал, что посланный по GPRS пакет доходил до сервера и обратно почти за 2 минуты  Я знаю что такое UDP и что доставка не гарантирована, но никак не рассчитывал что пакеты будут где-то ходить ТАК долго. Как вообще в таких условиях работают протоколы базирующиеся на UDP? Те же DNS, SNMP, NTP? Например, DNS клиент под винду ждет ответа 10сек ( DNS Client от MS). 2 Baser
Поле с номером пакета у меня уже есть, но оно не спасает, т.к. изначально задумывалось, что ответы могут приходить разной длины. Теперь придется еще и длину пакета добавлять...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|