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

 
 
> LWIP прием длинных пакетов
viakon
сообщение Aug 10 2015, 04:07
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



LWIP фрагментированные пакеты собирает только если используется операционка? Использую standalone режим из примеров, при передаче пакета 2059 приходят два 1460 и 599. Как их правильно собрать в один? В инете пугают что они могут придти наборот вначале 599 байт.

STM32F107, LWIP 1.4.1, соединение TCP/IP.

Сообщение отредактировал viakon - Aug 10 2015, 05:22
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
doom13
сообщение Aug 10 2015, 06:50
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Пробуйте посмотреть в направлении опции IP_REASSEMBLY. С приёмом не пробовал, но при отправке (IP_FRAG) фрагментация работала.
Go to the top of the page
 
+Quote Post
viakon
сообщение Aug 10 2015, 08:26
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



Цитата(doom13 @ Aug 10 2015, 11:50) *
Пробуйте посмотреть в направлении опции IP_REASSEMBLY.

Включено в opt.h.
Go to the top of the page
 
+Quote Post
doom13
сообщение Aug 10 2015, 09:27
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Запускал пример от TI, там к проекту подтянут ещё lwipopts.h, где IP_REASSEEMBLY = 0. Может у Вас есть что-то похожее?
Go to the top of the page
 
+Quote Post
viakon
сообщение Aug 10 2015, 09:34
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



Цитата(doom13 @ Aug 10 2015, 14:27) *
Запускал пример от TI, там к проекту подтянут ещё lwipopts.h, где IP_REASSEEMBLY = 0. Может у Вас есть что-то похожее?

В lwipopts.h нет такого параметра.
Go to the top of the page
 
+Quote Post
alx2
сообщение Aug 11 2015, 09:14
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(viakon @ Aug 10 2015, 10:07) *
при передаче пакета 2059 приходят два 1460 и 599.

соединение TCP/IP.

А разве в вашем пакете не установлен флаг "Don't fragment"?
Вообще-то при использовании TCP пакетам запрещают фрагментирование, и, если где-то в пути пакет превысил MTU, обратно отправляется icmp fragmentation needed...


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 11 2015, 12:40
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(viakon @ Aug 10 2015, 07:07) *
... при передаче пакета 2059 приходят два 1460 и 599. Как их правильно собрать в один?
... соединение TCP/IP.

Уточните, что имеете в виду.
"Соединение TCP/IP" - имеется в виду соединение TCP? Если так, то при чём тут пакеты? Соединение TCP на высоком уровне - это поток байтов без разбивки на пакеты. В режиме raw API при отправке данных разбивка на пакеты происходит автоматически. При приёме автоматически упорядочиваются принятые пакеты и передаются на верхний уровень в виде цепочки буферов. Да, вам надо работать с этими буферами один за одним. Если у вас там есть кусок данных, размазанный по нескольким буферам, то вам придётся самому собирать его вместе (если это необходимо). Вы должны быть готовы к тому, что данные будут приходить в виде цепочки буферов размером 1 байт каждый.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Aug 11 2015, 14:50
Сообщение #8


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(alx2 @ Aug 11 2015, 12:14) *
..при использовании TCP пакетам запрещают фрагментирование...


1) говоря о TCP не корректно говорить о пакетах. это ПОТОКОВЫЙ протокол..
2) Если Вы имеете ввиду IP пакеты, то выставление флага фрагментации не зависит от уровня более верхнего протокола.


Цитата(viakon @ Aug 10 2015, 07:07) *
LWIP фрагментированные пакеты...при передаче пакета 2059 приходят два 1460 и 599....они могут придти наборот вначале 599 байт....соединение TCP/IP.


у Вас полная каша.
1) как уже прозвучало выше TCP потоковый протокол, там ФИЗИЧЕСКИ НЕТ пакетов. Когда ведут разговор про TCP протокол, то подразумевают
именно то что декларировано RFC. Если ведёте речь о более низких протоколах стэка - то так и пишите IP, EthFrame
2) TCP ГАРАНТИРУЕТ последовательную передачу потока данных. Т.е. всевозможные "наоборот", для данного потока - враньё по определению.


при работе с данным протоколом Вы можете запихать на передатчике 1460+599 и получить 10+300+1740+9, а можете получить сразу 2059
одним присестом - в зависимости от многих условий... Но данные ГАРАНТИРОВАННО придут именно в той последовательности в которой
были переданы...
Go to the top of the page
 
+Quote Post
alx2
сообщение Aug 12 2015, 04:46
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(kolobok0 @ Aug 11 2015, 20:50) *
1) говоря о TCP не корректно говорить о пакетах. это ПОТОКОВЫЙ протокол..

Хорошо. А через какой транспорт передается этот поток? У автора написано "TCP/IP". Говоря об IP корректно говорить о пакетах?

Цитата(kolobok0 @ Aug 11 2015, 20:50) *
2) Если Вы имеете ввиду IP пакеты, то выставление флага фрагментации не зависит от уровня более верхнего протокола.

То есть Вы считаете нормальным, когда IP пакет, несущий данные TCP, не имеет флага Don't fragment?
По-моему это ненормально, о чем я и написал viakon.


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 12 2015, 05:21
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(alx2 @ Aug 12 2015, 07:46) *
Хорошо. А через какой транспорт передается этот поток? У автора написано "TCP/IP". Говоря об IP корректно говорить о пакетах?

Вы, наверное, не в курсе, что такое TCP/IP. Почитайте тут.
Это набор разных протоколов, многие из которых не имеют отношения к TCP, например ARP, ICMP, UDP.
Короче, TCP/IP - это слишком общий термин. Мы догадываемся, что автор имел в виду TCP, но вдруг ошибаемся?

Цитата(alx2 @ Aug 12 2015, 07:46) *
То есть Вы считаете нормальным, когда IP пакет, несущий данные TCP, не имеет флага Don't fragment?
По-моему это ненормально, о чем я и написал viakon.

Вот тут есть вполне чеканный ответ на этот вопрос.
Если в двух словах, то по-разному бывает.
Go to the top of the page
 
+Quote Post
alx2
сообщение Aug 14 2015, 05:05
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(scifi @ Aug 12 2015, 11:21) *
Короче, TCP/IP - это слишком общий термин. Мы догадываемся, что автор имел в виду TCP, но вдруг ошибаемся?

Давайте не будем гадать, а попросим viakon уточнить, о каком именно пакете размером 2059 байт он говорил. Мне почему-то кажется, что это не ARP. sm.gif

Цитата(scifi @ Aug 12 2015, 11:21) *
Если в двух словах, то по-разному бывает.

Вопрос не в том, как бывает. Я допускаю, что TCP без DF возможно. Но вот нормально ли это? По вашей ссылке описана ситуация, когда сначала кто-то ломает в сети PMTUD, а потом в результате этого приходится убирать DF. Но когда сломано PMTUD - это уже ненормально...

Когда-то много лет назад в какой-то фидошной эхе спорили на эту тему (фрагментация IP пакетов). Я не поленился и поставил на одном из интернет-маршрутизаторов счетчики. Как оказалось, в реальной жизни ни одного (из многих миллионов) пакета (чтобы не было вопросов и догадок - я имею в виду пакета IP с кодом 6 в поле protocol) без флага DF не встретилось (за исключением TCP RST, которые большими не бывают). Это я к тому, как бывает в реальной жизни...

Поэтому, повторю, если у viakon пакет с данными передается без флага DF, ему, как минимум, надо обратить на это внимание и задуматься, почему так. Если, как в примере по ссылке, у него PMTUD сломано, так наверное лучше починить сломанное, чем бороться со следствиями...


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 14 2015, 06:54
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(alx2 @ Aug 14 2015, 08:05) *
Давайте не будем гадать, а попросим viakon уточнить

Он, похоже, потерял интерес к этой теме laughing.gif
Это всё интересно, конечно, про фрагментацию IP пакетов. Но мне-то кажется, что он просто ожидал отправить по TCP пачку данных размером около 2 КБ и принять такую же пачку на другой стороне. А оказалось, что lwip разбил эту пачку на кусочки (потому что сильно сомневаюсь, что MSS больше 2 КБ). Я просто обратил его внимание, что в режиме raw API по-другому и не будет, вот и всё. И фрагментация на уровне IP здесь ни при чём.
Go to the top of the page
 
+Quote Post
Quasar
сообщение Aug 15 2015, 19:58
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021



А вот вопрос, по практике. У меня на одной железке, начались проблемы со сборкой фрагментированных IP пакетов. В LwIP IP_REASSEEMBLY = 1, и иногда, при приеме например ICMP размером 30Кбайт, стеку не хватает памяти (malloc возвращает NULL), и обмен подвисает, пока стек не очистит очередь IP фрагментов, ожидающих сборки, я взял и отключил IP_REASSEEMBLY, теперь стек не задумывается, но вопрос, чем это не грозит?
Go to the top of the page
 
+Quote Post
viakon
сообщение Aug 17 2015, 06:32
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002



Цитата(scifi @ Aug 14 2015, 11:54) *
Он, похоже, потерял интерес к этой теме laughing.gif
Это всё интересно, конечно, про фрагментацию IP пакетов. Но мне-то кажется, что он просто ожидал отправить по TCP пачку данных размером около 2 КБ и принять такую же пачку на другой стороне. А оказалось, что lwip разбил эту пачку на кусочки (потому что сильно сомневаюсь, что MSS больше 2 КБ). Я просто обратил его внимание, что в режиме raw API по-другому и не будет, вот и всё. И фрагментация на уровне IP здесь ни при чём.

Интерес не пропал, на данный момент я решил проблему уменьшением размера пакета до 1к, потому как времени на эксперименты уже не было.
Я думаю что все дело в том, что мне приходится пользоваться практически raw ip без участия операционки.
И тут прослеживается следующая логическая цепочка. На компе после содинения TCP послылаются в сокет данные 2059 байт, естественно они разбиваются на 2 пакета. Первый пакет длиной в 1460 полезных байт принимается мироконтроллером, вырабатывается прерывание и вызов LwIP_Pkt_Handle(), вызывает tcp_echoserver_recv (торопился, потому не стал даже переименовывать названия фнкций в примере), где я и получаю эти 1460 байт. Думаю что если подождать с обработкой LwIP_Pkt_Handle() то после прихода второго пакета я получу свои данные но все равно с разбивкой на 2 части в структуре pbuf.
FreeRTOS не хочу использовать мало ОЗУ. А ради эксперимента прикручивать FreeRTOS лениво.

Сообщение отредактировал viakon - Aug 17 2015, 06:33
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 17 2015, 07:42
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(viakon @ Aug 17 2015, 09:32) *
Думаю что если подождать с обработкой LwIP_Pkt_Handle() то после прихода второго пакета я получу свои данные но все равно с разбивкой на 2 части в структуре pbuf.

Именно так оно и работает.
И ещё раз повторяю: нужно быть готовым к тому, что эти 2 килобайта придут в виде 2048 пакетов по 1 байту каждый. Экзотика, да, но вполне законно. В этом случае просто подождать не получится - память закончится. Поэтому нужно в отдельном буфере накапливать данные по мере их поступления, не откладывая. И освобождать ненужные буферы сразу.
Go to the top of the page
 
+Quote Post

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

 


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


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