Ich habe einen Anbieter (A), der uns Daten über eine eingehende TCP-Verbindung senden möchte. Leider kann der konsumierende Dienst (B) keine eingehenden TCP-Verbindungen empfangen. Es hat auch keine statische IP, eine weitere Anforderung.
Eine Möglichkeit, dies zu lösen, wäre ein Dienst, der den eingehenden TCP-A-Port mit einem anderen TCP-Port B verbindet, sodass der Verbraucher eine ausgehende Verbindung zu B herstellen kann.
Dies ist kein einzigartiges Problem [1] [2] , und mit socat kann ich etwas sehr nah an das bringen, was ich will:
socat -d -d -d -u TCP4-LISTEN:PORT-A,reuseaddr TCP4-LISTEN:PORT-B,reuseaddr
Dies hat jedoch die folgenden Probleme:
- Wenn B die Verbindung trennt, kann keine erneute Verbindung hergestellt werden. Mit
TCP4-LISTEN:PORT-B,reuseaddr,fork
kann es eine Verbindung herstellen, empfängt jedoch keine Daten. - B kann keine Verbindung herstellen, bevor A eine Verbindung hergestellt hat (überwindbar)
- Es kann nur eine Verbindung hergestellt werden zu
PORT-B
(überwindbar)
Gibt es eine Möglichkeit, den Befehl so anzupassen, dass er "dauerhaft" und widerstandsfähig gegen Fehler wird?
Die reale Welt ist chaotisch.
In der realen Welt sterben manchmal TCP-Verbindungen. Dies kann beispielsweise passieren, wenn eine Stateful Firewall oder NAT neu gestartet wird, wenn die Verbindung ohne Datenverkehr zu lange dauert und die zugrunde liegende Verbindung zu lange unterbrochen ist.
Außerdem sterben Verbindungen manchmal nicht symmetrisch, wenn sie sterben. Wenn eine Verbindung mit vielen Daten unterbrochen wird, wird der Absender wahrscheinlich feststellen, dass sie lange vor dem Empfänger tot ist. Dies hat einige Nebenwirkungen.
Darüber hinaus sind TCP-Verbindungen ein Strom von Bytes, KEIN Strom von Nachrichten. Wenn Ihre Verbindung unterbrochen wird, erhalten Sie möglicherweise eine Teilnachricht.
Das Nettoergebnis davon lässt mich zu dem Schluss kommen, dass eine robuste Lösung ein Verständnis des Anwendungsprotokolls erfordert, damit Ihre Lösung es verstehen kann.
quelle