Forum: Mikrocontroller und Digitale Elektronik LwIP TCP senderate erhöhen


von Gustav G. (gustavgggg)


Lesenswert?

Ich habe schon wieder ein Problem mit LwIP. Auf dem STM32 möchte ich die 
Datenrate erhöhen. Ich habe feste Datenpakete von 40 Byte Länge. Immer 
wenn ich ein tcp_write aufrufe warte ich nun, bis der sent handler 
aufgerufen wird, was ein ACK vom Empfänger bedeutet, und sende das 
nächste Paket. Wireshark ergibt, dass auch wirklich immer nur 40byte pro 
Transfer ankommen.

Nun habe ich mir gedacht ich kann ja mehr als einmal tcp_write aufrufen 
und  die Anzahl der noch offenen Transfers festhalten. Immer wenn ich 
also tcp_write aufrufe erhöhe ich einen counter und im handler 
verringere ich den. Dann starte ich noch die verbleibenden writes.

Das scheint aber nicht zu funktionieren. Ist es garantiert, dass auf 
jedes tcp_write auch genau einmal der handler aufgerufen wird?

Wie kann ich die Senderate generell erhöhen?

von Stefan F. (Gast)


Lesenswert?

Das nennt sich Window-size und ist konfigurierbar. Das kann der TCP 
Stack vollautomatisch handhaben. Wenn kein ack kommt wird ggf. an der 
unterbrochenen Stelle wiederholt. Wenn das mehfach fehlschlägt wird die 
Verbindung geschlossen.

Wenn du die Fehler lieber selbst behandeln willst, nimm UDP.

Unabhängig davon sind so kleine Pakete suboptimal, weil sie durch fie 
header Daten mehr als doppelt so groß werden.

von Foobar (asdfasd)


Lesenswert?

Der nagle (s. tcp_nagle_disable) wird ordentliche Verzögerungen 
reinbringen, wenn er nur kleine Bröckchen sendet.  Man kann das ggf 
durch tcp_output reduzieren (oder gleich abschalten, s.o.).

Wenn man bei tcp aber hohen Durchsatz haben will, sendet man so viel man 
kann und wartet nicht auf Bestätigung für jedes Byte - das ist TCP mit 
angezogener Handbremse ...

von Klaus (feelfree)


Lesenswert?

Gustav G. schrieb:
> Immer
> wenn ich ein tcp_write aufrufe warte ich nun, bis der sent handler
> aufgerufen wird, was ein ACK vom Empfänger bedeutet, und sende das
> nächste Paket.

Gustav G. schrieb:
> Wie kann ich die Senderate generell erhöhen?

In dem Du das oben zitierte genau nicht machst.

von Gustav G. (gustavgggg)


Lesenswert?

Foobar schrieb:
> Der nagle (s. tcp_nagle_disable) wird ordentliche Verzögerungen
> reinbringen, wenn er nur kleine Bröckchen sendet.  Man kann das ggf
> durch tcp_output reduzieren (oder gleich abschalten, s.o.).
>
> Wenn man bei tcp aber hohen Durchsatz haben will, sendet man so viel man
> kann und wartet nicht auf Bestätigung für jedes Byte - das ist TCP mit
> angezogener Handbremse ...

Die Daten kommen aber vom AD Konverter über die SPI Schnittstelle und 
die kann ich nicht beliebig zwischenspeichern. Ich mache nach jedem 
tcp_write direkt ein tcp_output. Senden so viel ich kann ohne einen 
Handler habe ich zuerst probiert aber das ist alles andere als 
zuverlässig. Ich kann nicht sicher abschätzen, ob LwIP intern noch genug 
speicher für das Paket hat, damit ich die Datenrate selbst drosseln 
kann. Es gibt keinen Befehl, tcp_is_write_possible oder sowas in der 
Art.

von Wastl (hartundweichware)


Lesenswert?

Für kleine Päckchen ist TCP einfach viel zu Overhead-lastig.
Versuch es einmal mit UDP und du wirst sehen dass es viel
flotter geht und auf das "sichere" Übertragen kann man
eventuell leicht verzichten. Bei SPI, I2C, Serial und
dergleichen hat man auch kein Handshake im Sinne von
Datensicherheit und es funktioniert trotzdem prächtig.

von Peter (pittyj)


Lesenswert?

Wenn du wirklich sofort verschicken möchtest, dann nimm UDP. Da wird im 
Normalfall nichts gepuffert, sondern geht sofort raus.

Und wenn du es noch schneller haben möchtest, dann schicke rohe Ethernet 
Pakete raus.
STM bietet dafür die HAL an. In dem Bereich HAL_Eth_... sind _Init() , 
_Start() und _Send().
Und du kannst in die Pakete schreiben, was du willst (eigenes Protokoll 
...) . Die Gegenseite muss nur damit klarkommen.

Hat mich 3 Stunden gekostet, bis ich Senden konnte. Also weniger Zeit, 
als schon in diesem Thread hier verstrichen ist.

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.