Mam dostawcę (A), który chce przesyłać nam dane za pośrednictwem przychodzącego połączenia TCP. Niestety usługa odbierająca (B) nie może odbierać przychodzących połączeń TCP. Ponadto nie ma statycznego adresu IP, co jest kolejnym wymaganiem.
Jednym ze sposobów rozwiązania tego problemu jest usługa, która łączy przychodzący port TCP A z innym portem TCP B, dzięki czemu konsument może nawiązać połączenie wychodzące z B.
To nie jest wyjątkowy problem [1] [2] , a dzięki socat mogę stworzyć coś bardzo zbliżonego do tego, czego chcę:
socat -d -d -d -u TCP4-LISTEN:PORT-A,reuseaddr TCP4-LISTEN:PORT-B,reuseaddr
Powoduje to jednak następujące problemy:
- Jeśli B rozłączy się, nie będzie można połączyć się ponownie. Dzięki
TCP4-LISTEN:PORT-B,reuseaddr,fork
może łączyć się, ale nie odbiera danych. - B nie może się połączyć, zanim A nie ustanowi połączenia (do pokonania)
- Można ustanowić tylko jedno połączenie z
PORT-B
( do zwielokrotnienia)
Czy istnieje sposób na dostosowanie polecenia, aby stało się ono „trwałe” i odporne na awarie?
Prawdziwy świat jest brudny.
W prawdziwym świecie czasami umierają połączenia TCP, może się to zdarzyć na przykład, jeśli zapora stanowa lub NAT zostanie ponownie uruchomiony, jeśli połączenie będzie trwało zbyt długo bez ruchu, jeśli połączenie podstawowe nie działa zbyt długo.
Co więcej, czasami kiedy połączenia umierają, nie umierają symetrycznie. Jeśli połączenie z dużą ilością danych umrze, prawdopodobnie nadawca zauważy, że nie działa na długo przed tym, jak odbiorca to zrobi. Ma to kilka skutków ubocznych.
Ponadto połączenia TCP są strumieniem bajtów, a NIE strumieniem wiadomości, więc gdy połączenie zostanie przerwane, możesz otrzymać częściową wiadomość.
Wynik netto tego prowadzi mnie do wniosku, że solidne rozwiązanie wymaga zrozumienia protokołu aplikacji, aby twoje rozwiązanie mogło zrozumieć.
źródło