【问题标题】:NAT traversal techniques and ideaNAT穿越技术与思路
【发布时间】:2012-05-11 04:28:48
【问题描述】:

所以我正在做 NAT 遍历。

接下来的场景是:我有两部 Android 手机,我想使用 HTTP 服务器连接它们(套接字)(两个设备都在 NAT 之后)。

到目前为止一切顺利,两个客户端都连接到 HTTP 服务器,HTTP 服务器记录了他们的 IP 地址和端口,

但是有一个小问题,因为我使用Java HttpDefaultClient(),每次我从客户端发送请求到服务器时,它都会改变端口。好吧,这听起来很简单: 让我们使用 Socket() 来实际维护到服务器的有效 TCP 连接。

public Socket(InetAddress地址, 国际港口, InetAddress 本地地址, 诠释本地端口) 抛出 IOException

我将只使用这个类并将 localPort 随机放置,我会记住。 现在我再次做所有事情,这次似乎端口不会改变,就像我想要的那样。

现在我有了对手的 IP 和端口(他也在 NAT 之后),理论上我可以断开 SERVER 连接并使用我已经用于实际托管 clientServer 的相同 localPort?

除非,现在是我有疑问的部分: 1)如果我丢弃 HTTP 服务器套接字,NAT 会理解并删除端口映射吗?(那很糟糕) 2)实际传递对称锥体是如何工作的? 3) STUN 库的工作方式是否有所不同?

【问题讨论】:

    标签: android traversal nat stun


    【解决方案1】:

    我认为您在 Nats 方面遇到了一些问题。我实际上让这个工作了一段时间(使用第三方服务器(我的)和公共 STUN 服务器创建对等 android 连接。

    我强烈建议您阅读RFC5389 - Nat traversal 这很复杂。我还建议您使用 JStun library 之类的东西或像我一样实现自己的。

    我将只使用这个类并将 localPort 随机放置,我会记住。现在我再次做所有事情,这次似乎端口不会改变,就像我想要的那样。

    我的猜测是你在 nat 后面,所以你请求的内部端口被映射到不同的外部端口。

    现在我有了对手的 IP 和端口(他也在 NAT 之后),理论上我可以断开 SERVER 连接并使用我已经用于实际托管 clientServer 的相同 localPort?

    目前还没有,大多数 nat 不仅会记录客户端建立连接的端口,还会记录它们连接的 IP 地址,以便阻止来自其他 IP 的流量。例如,Phone1 在 IP-a 上并从 ip-a 上的 port-b 连接到服务器 nat 将 port-b 转换为 port-c。从服务器的角度来看,电话位于端口 c 上的 IP-a。它将此信息中继到phone2。 nat 将阻止来自 phone2 的所有通信,直到 phone1 从 port-b 向 phone2 发送数据。

    1)如果我丢弃 HTTP 服务器套接字,NAT 会理解并删除端口映射吗?(这很糟糕)2)

    我从经验中学到的一点是,除了您的端口将被映射之外,不要对 nats 端口映射行为抱有任何期望,并且某些 nat 会更改所述映射,因为从您的角度来看,这似乎是愚蠢的原因。这需要大量更新。但一般不会。

    【讨论】:

      【解决方案2】:

      如今,对于大多数(但不是全部)NAT,您可以假设一些一致性和可预测的端口映射行为。 (即不同服务器连接使用同一个本地端口,在NAT上映射到同一个本地端口)。但听起来你想通过 TCP 进行 NAT 遍历,这比 UDP 更难。

      根本问题是大多数 NAT 也充当防火墙。他们不允许来自远程 ip:port 的入站连接。我相信诀窍是在双方同时进行连接。

      您可以在此处阅读有关 TCP 打孔的更多信息:http://en.wikipedia.org/wiki/TCP_hole_punching

      【讨论】:

        【解决方案3】:

        NAT 的工作方式不尽相同,但您可以依靠以下几点: 1) 如果您的客户端认为它在端口 X 上,NAT 会将其转换为不同的端口 2) NAT 通常会允许响应传出数据包的数据包进入。

        STUN 在服务器的帮助下尝试猜测实际的传出端口是什么,然后将地址+端口传递给另一个客户端。这不是很可靠。 TURN 只是通过服务器路由所有内容。这更可靠,尽管它会在服务器上产生 CPU 和带宽成本。

        如果您可以使用现有代码进行 NAT 穿越,您会为自己省去很多麻烦。否则,做类似 TURN through sockets 之类的事情,或者使用类似 Urban Airship 之类的东西。我也使用过二进制 SMS,但这是针对特殊情况的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-06
          • 1970-01-01
          • 2017-03-25
          • 1970-01-01
          • 2023-04-01
          相关资源
          最近更新 更多