Warum erhalte ich direkt nach dem Senden eines Pakets eine „TCP-Neuübertragung“?

Warum erhalte ich direkt nach dem Senden eines Pakets eine „TCP-Neuübertragung“?

Ich habe ein Programm (in Python), das Informationen an einen Bus sendet (MQTT, implementiert von mosquitto). Dies ist eine Nachricht vom Typ „Fire and Forget“, d. h. es gibt kein langfristiges Abonnement, sondern nur eine gesendete Nachricht.

Das alles funktioniert, aber mir ist (zufällig) aufgefallen, dass der TCP-Verkehr seltsam ist:

Bildbeschreibung hier eingeben

192.168.10.2ist ein Server, auf dem 172.19.0.20sich ein Docker-Container mit dem MQTT-Server befindet. Der Befehl war tcpdump -i any port 1883 -w mqtt.pcap. Diese beiden Zeilen sind die einzigen für jede Übertragung (für jede Veröffentlichung am MQTT-Bus).

Woran könnte das liegen TCP Retransmission? (im Großen und Ganzen funktioniert alles, mich interessiert nur, warum die Übertragung erneut erfolgt)

Antwort1

Der zuverlässige Dienst von TCP erfordert, dass alle Segmente, die Daten enthalten, vom Empfänger bestätigt werden. Wenn für ein Segment keine Bestätigung (ACK) empfangen wird, muss der Absender das Segment erneut übertragen.

Für jede Verbindung verwaltet TCP eine Variable namens Retransmission Timeout (RTO). Dies ist die Zeitspanne, innerhalb derer eine ACK für das Segment erwartet wird. Wenn TCP vor Ablauf des RTO keine ACK empfängt, wird das Segment erneut übertragen.

Bitte beachten Sie den folgenden Artikel:

https://www.extrahop.com/company/blog/2016/retransmission-timeouts-rtos-application-performance-degradation/

verwandte Informationen