slabnoff 0 15 декабря, 2009 Опубликовано 15 декабря, 2009 · Жалоба В общем по ряду причин с привычного UDP перешли на TCP (надоело изобретать собственный велосипед с контролем целостности передачи). Многоканальное измерительное устройство на LPC2387, FreeRTOS, lwIP 1.3.1. До этого с TCP в общем-то опыта применения не было вообще (самодельный встроенный Web-сервер не считаю). В итоге при инициализации устройства (около десятка команд переменного размера, суммарно в устройство уходит около 5 КБайт данных) после посылки нескольких команд, в зависимости от их размера, перед очередной командой возникает задержка на несколько секунд. Итог - инициализация занимает слишком долгое время, а т.к. для некоторых технологических работ (оценка метрологических характеристик например) запускать ее приходится часто есть желание проблему победить. Сдается мне, что где-то как всегда не учел что-то элементарное. Вот лог обмена снятый Вайршарком. 192.168.0.5 - ПК-клиент, 192.168.0.210 - устройство-сервер. Глюк виден например между строками 12-13, 23-24. No. Time Source Destination Protocol Info 1 0.000000 AsustekC_07:5f:ba Broadcast ARP Who has 192.168.0.210? Tell 192.168.0.5 2 0.000185 HitexHol_00:01:09 AsustekC_07:5f:ba ARP 192.168.0.210 is at 00:30:6c:00:01:09 3 0.000193 192.168.0.5 192.168.0.210 TCP interbase > terabase [SYN] Seq=0 Win=65535 Len=0 MSS=1460 4 0.000516 192.168.0.210 192.168.0.5 TCP terabase > interbase [SYN, ACK] Seq=0 Ack=1 Win=1500 Len=0 MSS=1500 5 0.000531 192.168.0.5 192.168.0.210 TCP interbase > terabase [ACK] Seq=1 Ack=1 Win=65535 Len=0 6 0.014791 192.168.0.5 192.168.0.210 TCP interbase > terabase [PSH, ACK] Seq=1 Ack=1 Win=65535 Len=34 7 0.015331 192.168.0.210 192.168.0.5 TCP terabase > interbase [PSH, ACK] Seq=1 Ack=35 Win=1466 Len=36 8 0.015780 192.168.0.5 192.168.0.210 TCP interbase > terabase [PSH, ACK] Seq=35 Ack=37 Win=65499 Len=36 9 0.025764 192.168.0.210 192.168.0.5 TCP terabase > interbase [PSH, ACK] Seq=37 Ack=71 Win=1430 Len=36 10 0.026624 192.168.0.5 192.168.0.210 TCP interbase > terabase [PSH, ACK] Seq=71 Ack=73 Win=65463 Len=1062 11 0.027612 192.168.0.210 192.168.0.5 TCP terabase > interbase [PSH, ACK] Seq=73 Ack=1133 Win=368 Len=38 12 0.170707 192.168.0.5 192.168.0.210 TCP interbase > terabase [ACK] Seq=1133 Ack=111 Win=65425 Len=0 13 4.999088 192.168.0.5 192.168.0.210 TCP interbase > terabase [ACK] Seq=1133 Ack=111 Win=65425 Len=368 14 4.999604 192.168.0.210 192.168.0.5 TCP terabase > interbase [ACK] Seq=111 Ack=1501 Win=1500 Len=0 15 4.999613 192.168.0.5 192.168.0.210 TCP interbase > terabase [PSH, ACK] Seq=1501 Ack=111 Win=65425 Len=694 16 5.000444 192.168.0.210 192.168.0.5 TCP terabase > interbase [PSH, ACK] Seq=111 Ack=2195 Win=806 Len=38 17 5.001312 192.168.0.5 192.168.0.210 TCP interbase > terabase [ACK] Seq=2195 Ack=149 Win=65387 Len=806 18 5.001996 192.168.0.210 192.168.0.5 TCP terabase > interbase [ACK] Seq=149 Ack=3001 Win=1500 Len=0 19 5.002007 192.168.0.5 192.168.0.210 TCP interbase > terabase [PSH, ACK] Seq=3001 Ack=149 Win=65387 Len=256 20 5.002690 192.168.0.210 192.168.0.5 TCP terabase > interbase [PSH, ACK] Seq=149 Ack=3257 Win=1244 Len=38 21 5.003502 192.168.0.5 192.168.0.210 TCP interbase > terabase [PSH, ACK] Seq=3257 Ack=187 Win=65349 Len=1062 22 5.004492 192.168.0.210 192.168.0.5 TCP terabase > interbase [PSH, ACK] Seq=187 Ack=4319 Win=182 Len=38 23 5.203194 192.168.0.5 192.168.0.210 TCP interbase > terabase [ACK] Seq=4319 Ack=225 Win=65311 Len=0 24 9.934619 192.168.0.5 192.168.0.210 TCP interbase > terabase [ACK] Seq=4319 Ack=225 Win=65311 Len=182 25 9.935082 192.168.0.210 192.168.0.5 TCP terabase > interbase [ACK] Seq=225 Ack=4501 Win=1500 Len=0 26 9.935090 192.168.0.5 192.168.0.210 TCP interbase > terabase [PSH, ACK] Seq=4501 Ack=225 Win=65311 Len=508 27 9.935826 192.168.0.210 192.168.0.5 TCP terabase > interbase [PSH, ACK] Seq=225 Ack=5009 Win=992 Len=38 28 9.936495 192.168.0.5 192.168.0.210 TCP interbase > terabase [PSH, ACK] Seq=5009 Ack=263 Win=65273 Len=36 29 9.983857 192.168.0.210 192.168.0.5 TCP terabase > interbase [ACK] Seq=263 Ack=5045 Win=956 Len=0 30 11.662789 192.168.0.210 192.168.0.5 TCP terabase > interbase [PSH, ACK] Seq=263 Ack=5045 Win=956 Len=36 31 11.663321 192.168.0.5 192.168.0.210 TCP interbase > terabase [PSH, ACK] Seq=5045 Ack=299 Win=65237 Len=36 32 11.663917 192.168.0.210 192.168.0.5 TCP terabase > interbase [PSH, ACK] Seq=299 Ack=5081 Win=920 Len=36 33 11.695274 192.168.0.210 192.168.0.5 UDP Source port: pxc-spvr-ft Destination port: pxc-splr-ft 34 11.720256 192.168.0.210 192.168.0.5 UDP Source port: pxc-spvr-ft Destination port: pxc-splr-ft 35 11.745261 192.168.0.210 192.168.0.5 UDP Source port: pxc-spvr-ft Destination port: pxc-splr-ft 36 11.770172 192.168.0.210 192.168.0.5 UDP Source port: pxc-spvr-ft Destination port: pxc-splr-ft 37 11.795267 192.168.0.210 192.168.0.5 UDP Source port: pxc-spvr-ft Destination port: pxc-splr-ft 38 11.820253 192.168.0.210 192.168.0.5 UDP Source port: pxc-spvr-ft Destination port: pxc-splr-ft 39 11.837932 192.168.0.5 192.168.0.210 TCP interbase > terabase [ACK] Seq=5081 Ack=335 Win=65201 Len=0 40 11.845236 192.168.0.210 192.168.0.5 UDP Source port: pxc-spvr-ft Destination port: pxc-splr-ft 41 11.870154 192.168.0.210 192.168.0.5 UDP Source port: pxc-spvr-ft Destination port: pxc-splr-ft 42 11.895245 192.168.0.210 192.168.0.5 UDP Source port: pxc-spvr-ft Destination port: pxc-splr-ft 43 11.920236 192.168.0.210 192.168.0.5 UDP Source port: pxc-spvr-ft Destination port: pxc-splr-ft 44 11.945242 192.168.0.210 192.168.0.5 UDP Source port: pxc-spvr-ft Destination port: pxc-splr-ft 45 11.946038 192.168.0.5 192.168.0.210 TCP interbase > terabase [PSH, ACK] Seq=5081 Ack=335 Win=65201 Len=36 46 11.958027 192.168.0.210 192.168.0.5 TCP terabase > interbase [PSH, ACK] Seq=335 Ack=5117 Win=884 Len=36 47 11.958545 192.168.0.5 192.168.0.210 TCP interbase > terabase [PSH, ACK] Seq=5117 Ack=371 Win=65165 Len=32 48 11.959111 192.168.0.210 192.168.0.5 TCP terabase > interbase [PSH, ACK] Seq=371 Ack=5149 Win=852 Len=36 49 11.959280 192.168.0.210 192.168.0.5 TCP terabase > interbase [FIN, ACK] Seq=407 Ack=5149 Win=852 Len=0 50 11.959289 192.168.0.5 192.168.0.210 TCP interbase > terabase [ACK] Seq=5149 Ack=408 Win=65129 Len=0 51 14.187546 192.168.0.5 192.168.0.210 TCP interbase > terabase [FIN, ACK] Seq=5149 Ack=408 Win=65129 Len=0 52 14.187838 192.168.0.210 192.168.0.5 TCP terabase > interbase [ACK] Seq=408 Ack=5150 Win=851 Len=0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 15 декабря, 2009 Опубликовано 15 декабря, 2009 · Жалоба Прашу пардона, а MSS размером в 1500 байт от устройства не жмет? Размер окна со стороны устройства тоже подозрительный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slabnoff 0 15 декабря, 2009 Опубликовано 15 декабря, 2009 · Жалоба Прашу пардона, а MSS размером в 1500 байт от устройства не жмет? Размер окна со стороны устройства тоже подозрительный. Памяти мало... Все что можно отдано под буферы результатов измерений, которые гоняю по UDP. TCP - чисто командный интерфейс, особой скорости от него не надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 15 декабря, 2009 Опубликовано 15 декабря, 2009 · Жалоба Памяти мало... Судя по тому, что размер окна на стороне устройства все время уменьшается - вы слишком редко вычитываете данные из буфера TCP-сокета в устройстве. Да и с софтом на компе надо смотреть внимательно, ибо тормоз на 5 секунд у Вас именно со стороны компа (5->210). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slabnoff 0 15 декабря, 2009 Опубликовано 15 декабря, 2009 · Жалоба В общем весь глюк действительно был в размере окна... Что в принципе очевидно. Увеличил с 1500 до 3000 - сразу получил выигрыш. В общем теперь стоит 65000 и ничего не тормозит. Но все равно надо бы поизучать вопрос... Эх, плохо я знаю стек TCP/IP. По уменьшению размера окна: алгоритм приема команд допускает прием их пачкой одним пакетом (или притормаживание устройства на такое время, что придет более одной команды сверху). Соответственно из-за некоторой кривости алгоритма приема-сборки-обработки команд (зато очень просто и экономно получилось + ничего копировать не надо) ответ на команду высылается до удаления самой команды из входного буфера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться