3

So I was in a middle of making NAT traversal.

The scenario is next: I got two Android phones and I want to connect them(sockets) using HTTP server(both devices are behind NAT).

So far so good, both clients connect to HTTP server, HTTP server records their IP address&PORTS,

however there is a little problem, since I use Java HttpDefaultClient(), it will change the port each time I send request from client to the server. Okay that sounds like simple problem: let's just use Socket() to actually maintain a valid TCP connection into server.

public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException

I will just use this class and put the localPort something random which I will remember. Now I do everything again, this time it seems that port wont change, like I want.

Now after I have opponent's IP&port(he's also behind NAT), theoretically I could drop the SERVER connection and use the same localPort I already used to actually host a clientServer?

unless, and now comes the part where I have question: 1)If I drop the HTTP server socket, will NAT understand that and remove the port mapping?(that's bad) 2) How does actually passing symmetric-cone nat work? 3) does the STUN libraries work somehow differently?

4

3 回答 3

0

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

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

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

于 2012-05-01T17:10:13.140 回答
0

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

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

我将只使用这个类并将 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 从端口 b 向 phone2 发送数据。

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

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

于 2012-06-18T15:27:10.290 回答
0

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

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

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

于 2012-05-08T02:29:32.980 回答