Симптомы ясно указывают на то, что существует узкое место обработки приема на стороне клиента.
Трассировка показывает, что приемный буфер в клиентском сетевом стеке (очевидно, LwIP) заполняется. В частности, размер окна в подтверждениях от клиента уменьшается по мере того, как серия пакетов принимается от сервера, пока приемный буфер не заполнится полностью и не будет "" ZeroWindow "отправляется от клиента к серверу, чтобы запросить прекращение отправки данных.
Обычно это указывает на то, что приложение, считывающее данные из сокета, недостаточно быстро истощает приемный буфер, чтобы позволить сетевому стеку идти в ногу с поступающими пакетами.
Частые повторные передачи с сервера в сочетании с задержанными ACK от клиента позволяют предположить, что условия на клиенте также негативно влияют на обработку низкоуровневых принимаемых пакетов в сетевом стеке.
Вы упомянули, что клиентский хост был встроенным устройством, а также прокомментировали, что ваше приложение заблокировано с помощью lwip_read (). Ожидание предполагает, что другой ресурс ввода-вывода или ЦП или узкое место планирования может препятствовать тому, чтобы ваш поток чтения получил достаточно времени ЦП, чтобы не отставать от передачи файла. Однако задержанные ACK предполагают, что может быть более широкая проблема. Не зная больше о встроенном устройстве, трудно продолжить поиск неисправностей.
LwIP также имеет особые ограничения, связанные с обслуживанием сетевых вызовов, которые могут применяться к вашей реализации - см. Эту страницу ловушек LwIP .
Я надеюсь, что эта информация полезна для решения вашей проблемы.