Forum: Mikrocontroller und Digitale Elektronik uIP + TCP: Problem mit #define UIP_CONF_BUFFER_SIZE


von Caspar B. (caspar)


Lesenswert?

Hallo,

auf meinem LPC1769 läuft FreeRTOS mit dem uIP Stack. Ich mächte gerne 
viele Daten schnell vom PC zum lpc senden. Mit UDP klappt das auch ganz 
ausgezeichnet, mit guten 10 MByte/s. Wenn ich das ganze aber mit tcp 
mache, funktioniert das komischerweise nur, wenn die Puffergröße 
(#define UIP_CONF_BUFFER_SIZE) klein genug, also kleiner 500 ist. Falls 
sie größer ist, funkioniert nur das Übertragen kleiner (<300Byte) 
Datenmengen, annsonsten kommt Datenmüll an.

Hängt das vl mit der Zerstückelung der Pakete zusammen?

Hat das jmd schon mal gesehen und kann mir Tips geben?

VG

caspar

von Caspar B. (caspar)


Lesenswert?

push

von Jürgen (jliegner)


Lesenswert?


von Caspar B. (caspar)


Lesenswert?

Erstmal danke für die Antwort.

Ich denke nicht, da ja der Durchsatz über TCP, trotz des kleinen 
Puffers, so schlecht nicht ist (knapp 2 MegaByte/s). Aber der kleine 
Puffer beeinflußt vl die ausgehandelte Packetgröße. Ich verstehe halt 
einfach nicht was da los ist. Der Durchsatz wird auch besser für einen 
größeren Puffer, bis dann ab ca. 500 Byte irgendetwas schief läuft.

Ich würde halte gerne verstehen was passiert.

In der Tat sehe ich mit Wireshark aber auch während der gesamten 
Übertragung doppelte Acks, sowohl vom PC/Linux also auch vom lpc.

Ping liefert auch ein DUP! .

Vl sagt das jmd was, mir nicht. Das geht ja schon in Richtung dieser 
delayed acks.

UDP hingegen geht immer, mit jeder Puffergröße.

von JojoS (Gast)


Lesenswert?

beim uIP gibt es diesen Workaround gegen das 'nagling', das 
Zusammenfassen kleiner Pakete aus Performancegründen. uIP sendet 
absichtlich alles doppelt um ein sofortiges ACK zu erzwingen. Ich finde 
diese Lösung nicht gut und das kann ein Grund für deine Fehlfunktion 
sein.
Der LPC1769 könnte auch automatisch mehrere Pakete puffern, aber der uIP 
Stack nutzt das offensichtlich nicht. Ich habe da auch eine Anzahl 
Buffer in den Quellen gefunden, aber benutzt wurde die nicht.

von Jürgen (jliegner)


Lesenswert?

nicht nur uIp auch lwIp hat mit Windows Clients ein Problem wegen der 
delayed ACKs. Irgendjemand hat hier schon mal geschreiben, dass die 
WizNet Module auch alles doppelt schicken, da sie das selbe Problem 
haben. Das ist aber nur mit Windows eins. Linux hat damit keine 
Probleme.

von JojoS (Gast)


Lesenswert?

die Beiträge aus dem angegebenen Link habe ich gerade gelesen, laufen ja 
auf das Gleiche hinaus.
Windows verhält sich aber nur regelkonform, den Algorithmus hat der Herr 
Nagle eingeführt und der war auch in vielen Unixen zu finden. Das 
doppelte oder gesplittete Senden ist natürlich ein einfacher Workaround, 
die CM3 Controller hätten aber genug Power für bessere Lösungen. Aber 
wer schreibts...

von Caspar B. (caspar)


Lesenswert?

Ja, besonders schön scheint mir das auch nicht. Aber ist das wirklich 
der Grund für den Datenschrott wenn  UIP_CONF_BUFFER_SIZE > 500 ? Das 
scheint mir unwahrscheinlich ... Sonst (also für  UIP_CONF_BUFFER_SIZE < 
~500) funktioniert es ja tadellos, trotz der vielen dup acks.

Recht krass dass die WizNet Module auch doppelte acks nutzen, irgendwie 
wirkt das wie ein fieser workaround.

Im Grunde sollte der Puffer doch etwa 1500 Byte sein für optimale 
Performance. Und das ist halt nicht möglich bei mir.

von JojoS (Gast)


Lesenswert?

ich habe die Beispiele für LPCXpresso angesehen, in RTOSDemo_RDB läuft 
ein WebServer und da ist UIP_CONF_BUFFER_SIZE = 1480. In 
EthDev_LPC17xx.h werden mehrere EMAC buffer mit 1536 max. Ethernet Frame 
size angelegt. Das Beispiel läuft, aber der Webserver wird auch nicht 
mit grossen Datenmengen bombardiert.
Dann folge doch mal der Datenspur im Debugger.

von Caspar B. (caspar)


Lesenswert?

Hallo,

so, ich habe jetzt nochmal mit dem RTOS-Demo und auch ganz ohne RTOS 
probiert.

Zunächst einmal verschwinden die doppelten (dup) acks in der tcp 
Kommunikation beim Beispiel ohne Betriebssystem (RDB1768cmsis2_uIP), mit 
UIP_CONF_BUFFER_SIZE ~ 1500. Auch Ping sieht so aus wie es soll. Aber: 
Wenn ich sehr große Datenmengen schreibe und im LPC in einen Puffer 
speichere, verschwinden anscheinend einige wenige Packete. Wenn ich nur 
einige 10-100 Byte schicke, ist alles ok. Auch telnet usw. laufen 
fehlerfrei. Das Problem tritt erst auf, wenn ich viele Daten schnell 
sende. Die Netzwerkstatistikausgabe des Webservers zeigt keinerlei 
Fehler an. Das darf doch nicht sein, oder? TCP soll doch gerade 
garantiert die Daten liefern.

Also die Daten werden so empfangen:
1
if(uip_newdata())
2
{
3
    int len = uip_datalen();       
4
    strncpy(puffer,uip_appdata,len);
5
}

Den Puffer schaue ich mir dann z.B. über telnet an. Wenn ich jetzt eine 
feste Zahlenfolge vom PC sende, erscheint die für viele übertragene 
Daten verschoben im Puffer. Hm, vl liegt da auch der Fehler? Hmhm...

Und das Beispiel mit RTOS (RTOSDemo_RDB1769) zeigt schon out-of-the-box 
die doppelten Acks. Sehr sonderbar.


Na, ich such mal weiter. Tips und Hinweise sind willkommen!

VG

caspar

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.