У меня есть провайдер (A), который хочет отправить нам данные через входящее TCP-соединение. К сожалению, потребительская служба (B) не может получать входящие TCP-соединения. Также у него нет статического IP, еще одно требование.
Одним из способов решения этой проблемы может быть служба, которая соединяет входящий порт TCP A с другим портом TCP B, чтобы потребитель мог установить исходящее соединение с B.
Это не единственная проблема [1] [2] , и с помощью socat я могу сделать что-то очень близкое к тому, что я хочу:
socat -d -d -d -u TCP4-LISTEN:PORT-A,reuseaddr TCP4-LISTEN:PORT-B,reuseaddr
Однако это имеет следующие проблемы:
- Если B отключается, он не может повторно подключиться. С помощью
TCP4-LISTEN:PORT-B,reuseaddr,fork
он может подключиться, но не получает данные. - B не может подключиться, пока A не установил соединение (преодолимо)
- Только одно соединение может быть установлено
PORT-B
(преодолимо)
Есть ли способ настроить команду так, чтобы она стала «постоянной» и устойчивой к сбоям?
Реальный мир грязный.
В реальном мире иногда TCP-соединения умирают, это может произойти, например, если перезагружен брандмауэр с сохранением состояния или NAT, если соединение проходит слишком долго без трафика, если базовое соединение слишком долго не работает.
Кроме того, иногда, когда умирают соединения, они не умирают симметрично. Если соединение, содержащее большое количество данных, умирает, то, вероятно, отправитель заметит, что оно мертво задолго до того, как это сделает получатель. Это имеет несколько побочных эффектов.
Кроме того, TCP-соединения представляют собой поток байтов, а НЕ поток сообщений, поэтому, когда ваше соединение прерывается, вы можете получить частичное сообщение.
Итоговый результат этого приводит меня к выводу, что надежное решение требует понимания протокола приложения, чтобы ваше решение могло его понять.
источник