|
LWIP прием длинных пакетов |
|
|
|
Aug 10 2015, 08:26
|
Местный
  
Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002

|
Цитата(doom13 @ Aug 10 2015, 11:50)  Пробуйте посмотреть в направлении опции IP_REASSEMBLY. Включено в opt.h.
|
|
|
|
|
Aug 10 2015, 09:34
|
Местный
  
Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002

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

Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 11 2015, 14:50
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 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 одним присестом - в зависимости от многих условий... Но данные ГАРАНТИРОВАННО придут именно в той последовательности в которой были переданы...
|
|
|
|
|
Aug 12 2015, 04:46
|

Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 12 2015, 05:21
|
Гуру
     
Группа: Свой
Сообщений: 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. Вот тут есть вполне чеканный ответ на этот вопрос. Если в двух словах, то по-разному бывает.
|
|
|
|
|
Aug 14 2015, 05:05
|

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

|
Цитата(scifi @ Aug 12 2015, 11:21)  Короче, TCP/IP - это слишком общий термин. Мы догадываемся, что автор имел в виду TCP, но вдруг ошибаемся? Давайте не будем гадать, а попросим viakon уточнить, о каком именно пакете размером 2059 байт он говорил. Мне почему-то кажется, что это не ARP.  Цитата(scifi @ Aug 12 2015, 11:21)  Если в двух словах, то по-разному бывает. Вопрос не в том, как бывает. Я допускаю, что TCP без DF возможно. Но вот нормально ли это? По вашей ссылке описана ситуация, когда сначала кто-то ломает в сети PMTUD, а потом в результате этого приходится убирать DF. Но когда сломано PMTUD - это уже ненормально... Когда-то много лет назад в какой-то фидошной эхе спорили на эту тему (фрагментация IP пакетов). Я не поленился и поставил на одном из интернет-маршрутизаторов счетчики. Как оказалось, в реальной жизни ни одного (из многих миллионов) пакета (чтобы не было вопросов и догадок - я имею в виду пакета IP с кодом 6 в поле protocol) без флага DF не встретилось (за исключением TCP RST, которые большими не бывают). Это я к тому, как бывает в реальной жизни... Поэтому, повторю, если у viakon пакет с данными передается без флага DF, ему, как минимум, надо обратить на это внимание и задуматься, почему так. Если, как в примере по ссылке, у него PMTUD сломано, так наверное лучше починить сломанное, чем бороться со следствиями...
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Aug 14 2015, 06:54
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(alx2 @ Aug 14 2015, 08:05)  Давайте не будем гадать, а попросим viakon уточнить Он, похоже, потерял интерес к этой теме  Это всё интересно, конечно, про фрагментацию IP пакетов. Но мне-то кажется, что он просто ожидал отправить по TCP пачку данных размером около 2 КБ и принять такую же пачку на другой стороне. А оказалось, что lwip разбил эту пачку на кусочки (потому что сильно сомневаюсь, что MSS больше 2 КБ). Я просто обратил его внимание, что в режиме raw API по-другому и не будет, вот и всё. И фрагментация на уровне IP здесь ни при чём.
|
|
|
|
|
Aug 15 2015, 19:58
|

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

|
А вот вопрос, по практике. У меня на одной железке, начались проблемы со сборкой фрагментированных IP пакетов. В LwIP IP_REASSEEMBLY = 1, и иногда, при приеме например ICMP размером 30Кбайт, стеку не хватает памяти (malloc возвращает NULL), и обмен подвисает, пока стек не очистит очередь IP фрагментов, ожидающих сборки, я взял и отключил IP_REASSEEMBLY, теперь стек не задумывается, но вопрос, чем это не грозит?
|
|
|
|
|
Aug 17 2015, 06:32
|
Местный
  
Группа: Участник
Сообщений: 290
Регистрация: 9-12-05
Из: г. Пермь
Пользователь №: 12 002

|
Цитата(scifi @ Aug 14 2015, 11:54)  Он, похоже, потерял интерес к этой теме  Это всё интересно, конечно, про фрагментацию 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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|