LWIP: Как именно TCP_INTERVAL относится к приему сообщений ACK?

Я пытаюсь реализовать передачу данных со встроенной платы на ПК. Для этого мне нужно использовать связь с низкой задержкой, и я обязан использовать 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 так долго ждет перед отправкой данных.


person Kai Neumann    schedule 16.08.2014    source источник
comment
Ах, блин - я имел ввиду 10 КБ, значит 10000 байт   -  person Kai Neumann    schedule 18.08.2014
comment
Я не знаком с lwip напрямую, но похоже, что он предназначен для работы таким образом, периодически собирая записи и отправляя. Это может снизить накладные расходы на рабочие потоки, которые могут писать неэффективно. Возможно, UDP будет лучшим выбором? Также обратите внимание, что TCP не ожидает ACK, если окно отправки не заполнено, и что реализациям разрешено задерживать отправку пакетов ACK, чтобы ответить на несколько входящих пакетов данных в одном ответе (снижение сетевой нагрузки ).   -  person Brian White    schedule 27.03.2015


Ответы (1)


Так как вы это делаете. Мои основные вызовы tcp_write (...) используют tcp_output () сразу после tcp_write

или используйте tcp_write () в обратном вызове tcp_recv

person Sushant    schedule 08.12.2015