答案1
这些症状清楚地表明存在客户端接收处理瓶颈。
跟踪显示客户端网络堆栈(显然是 LwIP)中的接收缓冲区正在填充 - 具体来说,随着从服务器接收到一系列数据包,来自客户端的确认中的窗口大小正在缩小,直到接收缓冲区完全填满并且从客户端向服务器发送“ZeroWindow”以请求其停止发送数据。
这通常表明从套接字读取的应用程序没有足够快地耗尽接收缓冲区,从而让网络堆栈跟不上到达的数据包。
服务器的频繁重传,加上客户端的延迟确认,表明客户端的条件也对网络堆栈中较低级别的接收数据包处理产生了负面影响。
您提到客户端主机是嵌入式设备,还评论说您的应用似乎在 lwip_read() 处被阻止。等待表明另一个 IO 或 CPU 资源或调度瓶颈可能会阻止您的读取线程获得足够的 CPU 时间来跟上文件传输。然而,延迟的 ACK 表明可能存在更广泛的问题。如果不了解有关嵌入式设备的更多信息,很难进一步排除故障。
LwIP 还具有与服务网络调用相关的特殊限制,这些限制可能适用于您的实现 - 请参阅此 LwIP 陷阱页面。
我希望这些信息有助于解决您的问题。