Я пытаюсь реализовать передачу данных со встроенной платы на ПК. Для этого мне нужно использовать связь с низкой задержкой, и я обязан использовать Ethernet с TCP / IP. Кроме того, я использую стек lwip.
Прежде всего, я отключил алгоритм Нагла, потому что мне нужно отправлять небольшие пакеты данных (10 КБ), и я хочу, чтобы они отправлялись как можно скорее, не дожидаясь промежуточных ACKS. Журнал Wireshark показывает мне, что это работает нормально (все данные отправляются на ПК примерно за 1 мс).
После этого ПК отправляет последний ACK примерно через 200 мс (поскольку размер последнего сегмента не является максимальным).
Проблема в том, что на встроенном процессоре требуется очень много времени, пока lwip не выдаст моему приложению сообщение о том, что все данные были ПОДТВЕРЖДЕНЫ. Когда я уменьшаю TCP_INTERVAL (скажем, до 5), он значительно ускоряется.
Мне интересно, почему lwip так себя ведет? Я бы подумал, что Periodic-TCP-Tasks (которые вызываются в соответствии с TCP_INTERVAL) не имеют ничего общего с обработкой полученных кадров (что на самом деле является другим вызовом в основном).
Я надеюсь, что смогу изложить свою проблему как-нибудь понятно, в противном случае я был бы признателен за обратную связь, чтобы я мог улучшить свой вопрос!
Спасибо!
РЕДАКТИРОВАТЬ:
После дополнительной отладки я обнаружил, что процесс отправки данных приводит к следующим вызовам функций:
- Мои основные вызовы tcp_write (...)
- tcp_tmr () вызывается несколько раз (через функцию LwIP_Periodic_Handle ()). Это происходит семь раз. Во время восьмого звонка:
- вызывается tcp_output (). Во время этого вызова все сегменты, которые были добавлены во время последнего вызова tcp_write (), отправляются путем вызова tcp_output_segment ().
Итак, теперь ясно, что если я уменьшу TCP_INTERVAL, конечно, данные будут отправлены раньше, потому что функция tcp_tmr () вызывается быстрее.
но мой вопрос по-прежнему: это нормальное поведение? Кажется немного странным, что lwIP так долго ждет перед отправкой данных.