ibaPDA-Messungen von Automatisierungsgeräten mit TCP/IP zeigen Ausreißer in den Messwerten.
Fehlerbild in ibaPDA
Unvollständige Telegramme oder Ausreißer in den Datenwerten (siehe Beispiele in den folgenden Abbildungen)


Ursache
Der Nagle-Algorithmus (Nagle's algorithm) ist ein Mechanismus zur Verbesserung der TCP-Effizienz, indem er die Anzahl der über das Netz gesendeten kleinen Pakete reduziert und mehrere Datenblöcke sammelt, bevor die Daten über das Netz gesendet werden.
Da die Schnittstelle "Generic-TCP" kein Protokoll auf Anwendungsebene verwendet, kann ibaPDA als Empfänger diese zusammengefassten Nachrichten nicht korrekt verarbeiten. Die Schnittstelle Generic TCP erwartet nur ein Datagramm pro TCP-Telegramm mit stets gleichem Layout und gleicher Länge.
Der Nagle-Algorithmus und die Option Delayed ACK können sich in TCP/IP-Netzwerken jedoch gegenseitig negativ beeinflussen, siehe Probleme mit TCP-Performance durch Delayed Acknowledge:
Der Delayed ACK-Mechanismus versucht, wenn möglich, mehr Daten pro Segment zu senden. Ein Teil des Nagle-Algorithmus hängt aber von einem ACK ab, um Daten zu senden. Delayed ACKs warten also darauf, das ACK zu senden, während der Nagle-Algorithmus darauf wartet, das ACK zu empfangen.
Dies führt zu zufälligen Verzögerungen von 200 ms bis 500 ms bei Segmenten, die sonst sofort gesendet und an den empfangsseitigen Stack von ibaPDA als Anwendung übergeben werden könnten.
Abhilfe
Es wird empfohlen, zunächst den Delayed ACK-Mechanismus zu deaktivieren, siehe Kapitel Probleme mit TCP-Performance durch Delayed Acknowledge erläutert. In einer typischen Echtzeitanwendung schickt der Sender dann die neuen Daten mit einer bestimmten Zykluszeit an ibaPDA, da die vorherigen Daten sofort quittiert wurden. Je nach Implementierung des TCP/IP-Stacks auf der Senderseite kann der Nagle-Algorithmus dennoch aktiv werden und automatisch eine Reihe kleiner Puffernachrichten aggregieren, wodurch der Algorithmus die Übertragung absichtlich verlangsamt.
Dies kann auch sporadisch durch eine kurzzeitige Überlastung auf der Senderseite geschehen, die den Stack dazu veranlasst, einige Nachrichten zusammenzulegen.
Um den puffernden Nagle-Algorithmus zu deaktivieren, verwenden Sie die Socket-Option TCP_NODELAY. Die Socket-Option TCP_NODELAY ermöglicht es dem Netzwerk, die durch den Nagle-Mechanismus verursachten Delays zu umgehen, indem der Nagle-Algorithmus deaktiviert wird und die Daten gesendet werden, sobald sie verfügbar sind.
Die Aktivierung von TCP_NODELAY zwingt einen Socket, die Daten in seinem Puffer zu senden, unabhängig von der Paketgröße. Das TCP_NODELAY-Flag ist eine Option, die für jeden einzelnen Socket aktiviert werden kann und beim Erstellen eines TCP-Sockets angewendet wird.
(Siehe Eigenschaft Socket.NoDelay in .NET-Anwendungen im Namespace System.Net.Sockets)
Hinweis |
|
|---|---|
|
Grundsätzlich können Sie diese TCP-spezifischen Probleme umgehen, indem Sie UDP anstelle von TCP nutzen. Das User Datagram Protocol (UDP) ist ein minimales, nicht verbindungsorientiertes Netzwerkprotokoll ohne Absicherung gegen Telegrammverluste. Dabei wird u. a. auf Empfangsquittierung der gesendeten Daten verzichtet. In stabilen und performanten Netzwerken ist dies meist unkritisch und kann aufgrund der zyklischen Datenübertragung mit ibaPDA vernachlässigt werden. |
|