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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> LPC1788, lWIP
ar__systems
сообщение Sep 17 2013, 17:31
Сообщение #1


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Продолжаю мучать LWIP.

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

Во первых, почему-то все мои фреймы имеют ошибку Frame Check Sequence.

Во-вторых очень много Retransmitoв. Такое ощущение что клиент мгновенно начинает слать повторные запросы. Это может быть связано с первой проблемой?

В приложении Wireshark trace запроса.
Прикрепленные файлы
Прикрепленный файл  lpc1788.zip ( 72.42 килобайт ) Кол-во скачиваний: 31
 
Go to the top of the page
 
+Quote Post
=F8=
сообщение Sep 22 2013, 05:52
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954



Цитата(ar__systems @ Sep 17 2013, 20:31) *
но подключил плату к роутеру а не напрямую, и начались новые проблемы...


Что значит к роутеру? Плату в lan роутера, wan роутера в лок. сеть? Если так то плата ни причем, контрольные суммы ethernet в этом случае генерит роутер.
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Sep 22 2013, 16:36
Сообщение #3


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(=F8= @ Sep 22 2013, 00:52) *
Что значит к роутеру? Плату в lan роутера, wan роутера в лок. сеть? Если так то плата ни причем, контрольные суммы ethernet в этом случае генерит роутер.

Нет, и комп и плата были подключены к LAN портам роутера. С контрольными суммами разобрался, эту ошибку исправил. Была ошибка в драйвере.

Я правильно понимаю, что wireshark не всегда правильно отображает порядок следования пакетов? Или это роутер их местами путает? Тогда к повторным запросам вопров нет.

Сейчас я пришел к тому, что у меня вопрос к следующему коду:
Код
while (  FS > 0 ) {
            size_t read_bytes = 0;
            const int CurrChunkSize = ( FS > sizeof(data_buff) )  ? sizeof(data_buff) : FS;
            
            result = f_read(&file, data_buff, CurrChunkSize, &read_bytes);
            xprintf("Read chunk from FS, about to send...\n", resource+2);

            netconn_write(_conn, data_buff, CurrChunkSize, NETCONN_COPY);
            DELAY_Ms(2); //
            FS -= CurrChunkSize;
        };


Может мне стоит повнимательнее посмотреть на netconn_write, как она работает - пока что если я убираю DELAY_Ms, то все падает на втором netconn_write.
Go to the top of the page
 
+Quote Post
=F8=
сообщение Sep 22 2013, 18:05
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954



Цитата
Я правильно понимаю, что wireshark не всегда правильно отображает порядок следования пакетов? Или это роутер их местами путает? Тогда к повторным запросам вопров нет.

Роутер тут скорей всего нипричем. В любом случае изменение порядка следования пакетов в tcp соединении это не преступление - принимающая сторона должна(если позволяют ресурсы) принять все пакеты, высторить их по-порядку и отправить ask.
У меня тоже бывало нарушение порядка пакетов, но к ретрансмитам это не приводило. Кстати попробуйте, для проверки, установить в конфигурации TCP_WND (1 * TCP_MSS) (ищите в lwipopts.h если его там нет то или добавьте или меняйте непосредственно в opt.h) это уберет окно и порядок пакетов точно не будет нарушен.
Да, и смотрите за кодом возврата netconn_write - там ведь может быть и разрыв соединения и нехватка памяти.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 22 2013, 18:46
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



а кто же причем? конечно рутер, если по вайфаю слать то вообще бардак с порядком пакетов будет... Но как было сказано ТСР следит за очередностью пакетов. И ретрансмиты понятное следование другого порядка пакетов потому что в обмене всегда идет указатель какой кусок данных записывается, и если не сохранены данные Н, а приходят Н+1, принимающая сторона их отвергнет и попросит повторить Н пакет.

А вот от окна отказываться не стоит, без него все грустно и медленно становится...

кстати если подтверждение пакета (сегмента) не приходит за заданное время будет ретрансмит, может время жизни пакетов увеличить?
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Sep 23 2013, 02:23
Сообщение #6


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(Golikov A. @ Sep 22 2013, 13:46) *
а кто же причем? конечно рутер, если по вайфаю слать то вообще бардак с порядком пакетов будет... Но как было сказано ТСР следит за очередностью пакетов. И ретрансмиты понятное следование другого порядка пакетов потому что в обмене всегда идет указатель какой кусок данных записывается, и если не сохранены данные Н, а приходят Н+1, принимающая сторона их отвергнет и попросит повторить Н пакет.

А вот от окна отказываться не стоит, без него все грустно и медленно становится...

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

Да, комп у меня по вайфаю с роутером общается. Да, за результатом netconn-write надо следить, это недосмотр. Время жизни - насколько я понимаю, у меня первые ретрансмиты исходят из клиента, а не из моей платы. Кроме того, время жизни вроде меряется в кол-ве сегментов которые он может пересечь, т.е. кол-во роутеров на пути от клиента к серверу, вроде это ни на что повлиять не сможет.

Спасибо.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 23 2013, 07:42
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



вроде это просто время а не число скачков...

вай-фай злобный менятель пакетов местами)... для ТСР - это тормозилка, пакеты могут только последовательно приниматься....
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Sep 23 2013, 15:40
Сообщение #8


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(Golikov A. @ Sep 23 2013, 02:42) *
вроде это просто время а не число скачков...

вай-фай злобный менятель пакетов местами)... для ТСР - это тормозилка, пакеты могут только последовательно приниматься....

Я где-то читал, что TTL изначально задумывался как время, но потом стали использовать как hop count. каждый роутер при передаче пакета вычитает один и отдает дальше. Если ноль, то выкидывают пакет.

Подключил к свичу комп напрямую, без вайфая - все чисто. Никаких дубликатов. Что ж так странно вайфай работает, зачем он пакеты местами путает? Сама по себе поремена пакетов местами мой сервер не должна смущать, т.к. мы получаем все запросы одно-пакетные - SYN, ACK, GET HTTP. То, что ACKи приходят в случайном порядке, это ок для lwip?
Цитата
пакеты могут только последовательно приниматься....

В общем случае, это видимо не верно. Ничто не мешает стэку принять пакеты и упорядочить их самостоятельно. Вы имеете ввиду для lwip?
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 23 2013, 18:31
Сообщение #9


Гуру
******

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



Цитата(ar__systems @ Sep 23 2013, 19:40) *
В общем случае, это видимо не верно. Ничто не мешает стэку принять пакеты и упорядочить их самостоятельно. Вы имеете ввиду для lwip?

Это он воду мутит, негодяй. В lwip есть настройка, которая включает/выключает обработку пакетов TCP вне очереди. Вроде бы называется OOSEQ (Out Of Sequence).
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 23 2013, 19:09
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



не! тут надо разделить протоколы.

TCP/IP - этот протокол гарантирует последовательность приема данных, отсутствие повторов и пропусков. И добивается он этого как раз строго последовательным приемом. В каждой посылке идет адрес не принятой части и подтверждается принятая.
то есть к примеру
в начале идет пакет 10 байт в нем написа с 0 байта, 0 подтверждено
в ответ на этот пакет идет к примеру 5 байт обратно и в них уже стоит с 0 байта, 10 подтверждено
в ответ на это ... с 10 байта, 5 подтверждено.

если будет подтверждено прием 10 байт, и придет пакет с 20 байта, то ТСР скажет ай ай ай, и попросит повторить с 10, оттуда и появляется ретрансмит в случае перестановки пакетов.

ТСР не может принять с 20 байта, а потом ждать когда дошлют с 10 по 20, потому что у него есть проверка на повторные данные.
то есть если подтверждено 15 байт, то любые попытки послать пакет с 5 байта игнорируются, а это может работать только если до 15 байта нет дырок.

Это как бы принцип работы ТСР.

Но есть же еще UDP, у него нет не начала не конца, он может терять пакет и переставлять его как хочет. Видимо вайфай обрабатывает пакеты по их длине или еще как - то, и какие то уходят быстрее, если они УДП пакеты то и славно, а если ТСР, то ТСР сам все поправит. Думаю так.

Кстати надеяться на то что пакеты пойду одним пакетом можно только если у вас длина данных меньше 56 байт по моему, все что больше может быть рутером разбито, там есть атрибут запрета разбития пакетов, но не вссе его могут обрабатывать... макс длинна пакета около 1500 байт, а в вайфай кажется больше 560 не лезет...

Отсюда резюме! Если ТСР то все получится правильно не зависимо от длины пакетов. Если УДП, то надо накладывать протокол на данные внутри. как то так
Go to the top of the page
 
+Quote Post
=F8=
сообщение Sep 23 2013, 19:20
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954



Цитата(Golikov A. @ Sep 22 2013, 21:46) *
Но как было сказано ТСР следит за очередностью пакетов. И ретрансмиты понятное следование другого порядка пакетов потому что в обмене всегда идет указатель какой кусок данных записывается, и если не сохранены данные Н, а приходят Н+1, принимающая сторона их отвергнет и попросит повторить Н пакет.

Это где Вы такое вычитали? Во-первых принимающая сторона не просит повторить, это отправитель сам повторяет передачу если не дожидается ASK от получателя. Во-вторых принимающая сторона не отбрасывает H+1, а ждет H. Точней говоря отбрасывают только самые усеченные версии стеков которым просто некуда складировать пакеты.

Цитата
если будет подтверждено прием 10 байт, и придет пакет с 20 байта, то ТСР скажет ай ай ай, и попросит повторить с 10, оттуда и появляется ретрансмит в случае перестановки пакетов.


В каждом пакете содержится порядковый номер в в потоке в байтах. Если к примеру пришел пакет с номером 100 длинной 50 байт, если в потоке нет разрывов то получатель отправляет подтверждение приема 150 байт, затем, к примеру, приходит пакет с номером 200 длинной 50 байт, то TCP понимает, что 50 байт где-то потерялось и ждет их. Затем когда пакет с номером 150 длинной 50 приходит получатель отправляет отправителю подтверждение приема 250 байт(Один раз!).
Сори напутал, порядковый номер это номер первого байта пакета, а не последнего. Отредактировал.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 23 2013, 19:23
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Golikov A. @ Sep 23 2013, 23:09) *
если будет подтверждено прием 10 байт, и придет пакет с 20 байта, то ТСР скажет ай ай ай, и попросит повторить с 10, оттуда и появляется ретрансмит в случае перестановки пакетов.

Вот именно что получатся лишние ретрансмиты при случайной задержке пакета. Нормальная реализация не должна сразу говорить "ай ай ай", т.к. перестановка - это вариант нормы.
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Sep 23 2013, 20:27
Сообщение #13


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(Golikov A. @ Sep 23 2013, 14:09) *
если будет подтверждено прием 10 байт, и придет пакет с 20 байта, то ТСР скажет ай ай ай, и попросит повторить с 10, оттуда и появляется ретрансмит в случае перестановки пакетов.

ТСР не может принять с 20 байта, а потом ждать когда дошлют с 10 по 20, потому что у него есть проверка на повторные данные.

Я с TCP/IP очень мало знаком, зато все знания свежайшие. При всем уважении, вы заблуждаетесь. TCP (и я говорю именно про TCP) прекрасно позволяет принимать пакеты вне очереди и упорядочивать. Более того, у него нет механизма запросить еще раз какой-то пакет. Он может отказаться ACKать данные с 20 байта пока 10-20 не получены, только и всего.

Цитата
Кстати надеяться на то что пакеты пойду одним пакетом можно только если у вас длина данных меньше 56 байт по моему, все что больше может быть рутером разбито, там есть атрибут запрета разбития пакетов, но не вссе его могут обрабатывать... макс длинна пакета около 1500 байт, а в вайфай кажется больше 560 не лезет...


Прекрасно через wifi передаются пакеты длинной 1500 и никто их не дробит. Т.е. это конечно не значит, что они не могут дробиться по пути, просто в данном месте ваша информация не соответсвует действтельности.

Цитата(scifi @ Sep 23 2013, 13:31) *
Вроде бы называется OOSEQ (Out Of Sequence).

TCP_QUEUE_OOSEQ

Да, спасибо, она по умолчанию включена.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 24 2013, 05:48
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Сдаюсь сдаюсьsm.gif...

Вы все действительно правы. И я погорячился насчет того что при появлении дырки в данных БУДЕТ ретрансмит. Правильнее будет сказать что НЕ БУДЕТ подтверждения С 20 байта пока НЕ БУДЕТ приняты данные с 0 до 20. При наличии достаточной памяти стэк действительно может придержать полученные сегменты пока не придет сегмент в дырку и поставить их всех по порядку.

А если памяти не достаточно, если памяти всего на 1 сегмент? Контроллер будет вынужден отбрасывать прочие сегменты, потому что у него просто не будет места их хранить, ждет то он вполне определенный сегмент.


Цитата
Прекрасно через wifi передаются пакеты длинной 1500 и никто их не дробит. Т.е. это конечно не значит, что они не могут дробиться по пути, просто в данном месте ваша информация не соответсвует действтельности.


где то я читал спецификацию, возможно это была спецификация на какой то конкретный wi-fi рутер или семейство, там было указано что сегменты более 5хх байт не пролазят. Не знаю почему сейчас мне кажется что это про все вай фаи идет речь, как то вот так в голове отложилось.

Но в любом случае в стандарте нет гарантии что весь максимально возможный пакет пойдет разом, есть только одно что любой пакет меньше 56 (теперь уже и в этой цифре сомневаюсь) быть не может, если данных меньше они нулями добиваются, и следовательно это минимальный пакет - не делим, все что больше - гарантий нет!

Вот посыпаю голову пеплом... наверное мои знания путаются между стандартом и конкретными реализациями в условиях ограниченных ресурсов.... постараюсь больше так не умничать wink.gif


Go to the top of the page
 
+Quote Post
ar__systems
сообщение Sep 24 2013, 11:51
Сообщение #15


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(Golikov A. @ Sep 24 2013, 00:48) *
А если памяти не достаточно, если памяти всего на 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 Текстовая версия Сейчас: 16th June 2025 - 15:11
Рейтинг@Mail.ru


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