如何建立永久的TCP性别转换器代理?


10

我有一个提供商(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(可克服的)连接

有没有一种方法可以调整命令,使其变得“稳定”并抵抗故障?

Answers:


10

重要的问题是,A对失去连接或拒绝连接有何反应?任何仅仅假设单个TCP连接将永远保持下去的事情将变得脆弱。那只是互联网的本质。

socat[x]inetd服务设置为怎么样?

您将设置xinetd监听PORT-B,并socat -u TCP4-LISTEN:PORT-A,reuseaddr STDIO在B侧连接后立即开始。

xinetd会将来自B侧的传入流量传递到的标准输入socat,并捕获的标准输出socat并将其传递到B侧。

如果B断开连接,则socat可以允许该过程结束;xinetdB再次连接后将开始新的连接。当B断开连接时,A将出现“拒绝连接”错误。

我曾经不得不在旧的HP-UX系统上做类似的事情。


A将尝试在失去连接的间隔上尝试重新连接,因此已覆盖。xinetd似乎可以工作。会尝试回报,谢谢!
dtech

它解决了最重要的问题:服务可以在失败时重新建立连接。谢谢!
dtech

3

现实世界是混乱的。

在现实世界中,有时TCP连接会死掉,例如,如果重新启动状态防火墙或NAT,如果连接在没有流量的情况下连接时间过长,基础连接断开的时间过长,则可能会发生这种情况。

此外,有时当连接断开时,它们不会对称地断开。如果承载大量数据的连接中断,则发送者很可能会在接收者注意到它之前就注意到它已经死亡。这有几个副作用。

  • 如果连接是从发送方发起到接收方的,则新连接可能会进入,而旧连接显然仍然有效。
  • 如果从接收者到发送者发起了连接,则在发送者检测到连接断开与接收者检测到该事实并触发重新连接之间可能会有相当大的延迟。

此外,TCP连接是字节流,而不是消息流,因此当连接断开时,您可能会收到部分消息。

最终的结果使我得出结论,一个健壮的解决方案需要了解应用程序协议,以便您的解决方案可以理解。

  1. 建立新连接时如何拼接流。
  2. 数据接收者连接数据源时是否存储消息不是必需的。
  3. 端到端确认机制是否适合防止消息丢失。
  4. 是否需要某种应用程序级别的“ ping”机制来加快死连接的检测速度。

所有的优点,但在这种情况下,应用程序协议非常简单。部分消息易于检测和丢弃。如果可以足够迅速地重新建立连接,则丢失消息不是大问题。
dtech
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.