所以我正在做NAT穿越。
接下来的场景是:我有两部Android手机,我想用HTTP服务器连接它们(套接字)(两台设备都在NAT之后)。
到目前为止,两个客户端都连接到了HTTP服务器,HTTP服务器记录了它们IP地址和端口,
但是有一个小问题,因为我使用的是Java HttpDefaultClient(),所以每次我从客户端向服务器发送请求时,它都会改变端口。好吧,这听起来像是一个简单的问题:让我们只使用Socket()来实际维护到服务器的有效TCP连接。
公共套接字( InetAddress地址,int端口,InetAddress localAddr,int localPort)抛出IOException
我将使用这个类,并将localPort随机放入一些我会记住的东西。现在我又做了所有的事情,这一次端口似乎不会改变,就像我想要的那样。
现在我有了对手的IP和端口(他也在NAT后面),理论上我可以丢弃服务器连接,并使用我已经用来实际托管clientServer的相同localPort?
除非,现在是我有问题的地方:1)如果我删除HTTP服务器套接字,NAT会理解并删除端口映射吗?(这很糟糕) 2)传递对称锥形nat实际是如何工作的? 3) STUN库是否以某种方式不同地工作?
发布于 2012-05-02 01:10:13
NAT的工作方式不尽相同,但您可以依靠以下几点: 1)如果您的客户端认为它在端口X上,则NAT会将其转换为不同的端口。2) NAT通常会传入数据包,以响应传出的数据包。
在服务器的帮助下,STUN尝试猜测实际的输出端口是什么,然后将address+port传递给另一个客户端。它并不是非常可靠。TURN just通过服务器路由所有的东西。这更可靠,尽管它会在服务器上产生CPU和带宽成本。
如果您可以使用现有代码进行NAT穿越,您将省去很多麻烦。否则,做一些事情,如通过插座,或使用类似城市飞艇。我也使用了二进制SMS,但这是针对特殊情况的。
发布于 2012-05-08 10:29:33
如今,对于大多数(但不是所有) not,您可以假定一些一致性和可预测的端口映射行为。(即,对不同的服务器连接使用相同的本地端口,映射到NAT上的相同本地端口)。但是听起来您想要在TCP上进行NAT穿越,这是一个比UDP更难的问题。
最根本的问题是,大多数NAT还充当防火墙。它们不允许来自远程ip:端口的入站连接。我相信诀窍是在两端同时进行连接。
你可以在这里阅读更多关于TCP打洞的内容:http://en.wikipedia.org/wiki/TCP_hole_punching
发布于 2012-06-18 23:27:10
我认为您遇到了一些关于Nats的问题。实际上,我用了一段时间(使用第三方服务器(我的)和公共STUN服务器创建了一个点对点的android连接。
我强烈建议你阅读RFC5389 - Nat traversal,它很复杂。我还建议你使用像JStun library这样的东西,或者像我一样实现你自己的东西。
我将使用这个类,并将localPort随机放入一些我会记住的东西。现在我又做了所有的事情,这一次端口似乎不会改变,就像我想要的那样。
我的猜测是您在nat后面,所以您请求的内部端口被映射到不同的外部端口。
现在我有了对手的IP和端口(他也在NAT后面),理论上我可以断开服务器连接,并使用我已经用来实际托管clientServer的相同localPort?
目前还没有,大多数nat不仅记录客户端进行连接的端口,还记录它们连接到的IP地址,以便阻止来自其他ip的流量。例如,Phone1在IP-a上,并在端口b上从ip-a连接到服务器。nat将端口-b转换为端口-c。从服务器的角度来看,电话位于端口c上的IP-a。它将此信息转发给phone2。nat将阻止来自phone2的所有通信,直到phone1从端口B向phone2发送数据为止。
1)如果我丢弃HTTP服务器套接字,NAT会理解并删除端口映射吗?(这很糟糕) 2)
我从经验中学到的一点是,除了你的端口将被映射之外,我不希望从not端口映射行为中得到任何东西,一些not会改变所说的映射,这在你看来似乎是愚蠢的原因。这需要大量的更新。但总体而言不是。
https://stackoverflow.com/questions/10401200
复制相似问题