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

 
 
> 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
 
Start new topic
Ответов
alx2
сообщение Aug 11 2015, 09:14
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 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
kolobok0
сообщение Aug 11 2015, 14:50
Сообщение #3


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

Группа: Участник
Сообщений: 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
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 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
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 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
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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
viakon
сообщение Aug 17 2015, 06:32
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 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
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 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
viakon
сообщение Aug 17 2015, 09:25
Сообщение #10


Местный
***

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



Цитата(scifi @ Aug 17 2015, 12:42) *
Именно так оно и работает.
И ещё раз повторяю: нужно быть готовым к тому, что эти 2 килобайта придут в виде 2048 пакетов по 1 байту каждый. Экзотика, да, но вполне законно. В этом случае просто подождать не получится - память закончится. Поэтому нужно в отдельном буфере накапливать данные по мере их поступления, не откладывая. И освобождать ненужные буферы сразу.

Как понять что пакет уже весь дошел?
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 17 2015, 09:35
Сообщение #11


Гуру
******

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



Цитата(viakon @ Aug 17 2015, 12:25) *
Как понять что пакет уже весь дошел?

Это уже должен протокол поверх TCP разбираться. Например, в HTTP есть заголовок Content-Length. Скажем, если написано "Content-Length: 2048", то браузер знает, что в ресурсе ровно 2048 байт. Когда все байты пришли - всё готово.
Так что вам виднее, как оно у вас должно работать.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- viakon   LWIP прием длинных пакетов   Aug 10 2015, 04:07
- - doom13   Пробуйте посмотреть в направлении опции IP_REASSEM...   Aug 10 2015, 06:50
|- - viakon   Цитата(doom13 @ Aug 10 2015, 11:50) Пробу...   Aug 10 2015, 08:26
- - doom13   Запускал пример от TI, там к проекту подтянут ещё ...   Aug 10 2015, 09:27
|- - viakon   Цитата(doom13 @ Aug 10 2015, 14:27) Запус...   Aug 10 2015, 09:34
|||- - dmitry-tomsk   Цитата(scifi @ Aug 17 2015, 12:35) Это уж...   Aug 18 2015, 13:16
|||- - Hold   Цитата(dmitry-tomsk @ Aug 18 2015, 20...   Jan 27 2017, 11:17
|||- - Сергей Борщ   QUOTE (Hold @ Jan 27 2017, 13:17) Как пон...   Jan 27 2017, 11:29
|||- - zltigo   Цитата(Сергей Борщ @ Jan 27 2017, 13:29) ...   Jan 28 2017, 15:31
|||- - Сергей Борщ   QUOTE (zltigo @ Jan 28 2017, 17:31) TCP н...   Jan 28 2017, 18:20
|||- - zltigo   Цитата(Сергей Борщ @ Jan 28 2017, 20:20) ...   Jan 28 2017, 21:12
||- - viakon   Цитата(Сергей Борщ @ Jan 27 2017, 16:29) ...   Jan 28 2017, 15:00
|- - kolobok0   Цитата(alx2 @ Aug 12 2015, 07:46) ...Гово...   Aug 18 2015, 19:24
- - scifi   Цитата(viakon @ Aug 10 2015, 07:07) ... п...   Aug 11 2015, 12:40
- - Quasar   А вот вопрос, по практике. У меня на одной железке...   Aug 15 2015, 19:58


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

 


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


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