Mon 29 Feb 2016 02:43:05 PM UTC, original submission:
Dear all,
in my project, I use the lwIP-Stack with FreeRTOS on an ARM-Cortex M4 Mikrocontroller.
There is no problem, to serve a small html-page. (web page load time: 3 ms)
When I try to serve a slightly more complex page (html and two pictures), the following problem can occur resulting
in very slow load time:
In response to a request the webserver sends two data-packets (Con1_data1.1/data1.2) as usual and gets an ACK from
the Browser (Con1_ACK1). If an ACK for another TCP-connection (Con2_ACK1) is received between Con1_data1.1/data1.2
and Con1_ACK1, then Con2_ACK1 is handled correctly.
But now, instead of processing Con1_ACK1 and therefore removing Con1_data1.1/data1.2 from the unacked-list, the
TCP/IP-thread is terminating and still waits for an ACK for Con1_data1.1/data1.2. After timeout (ca. 2 s), the
TCP/IP-thread resends Con1_data1.1, gets an ACK again (Con1_ACK1dup) and removes Con1_data1.1 from the unacked-list
and Con1_data1.2 from the unsent-list and everything seems ok.
After this the next two packets are sent (Con1_data2.1/data2.2) and Con1_ACK2 is received. Now in tcp_receive() the
dupack routine is entered probably because of Con1_ACK1dup ( a) dupacks < 3: do nothing) and the TCP/IP-thread is
terminating without removing Con1_data2.1/data2.2 from the unacked-list. From now on the process is repeating again
with resending Con1_data2.1 after timeout and receiving Con1_ACK2dup as described above.
Once the problem occured, it repeats again and again and one has to do a restart to reset the behaviour.
I used lwip 1.4.1 and also latest source from git.savannah.gnu.org (commit #70f3e5e). In both versions the problem
exists.
Has anybody experienced a similar problem with DupACKs here?
What could be the reason for this behaviour?
Thanks!
|