转自知乎问题:
udp协议怎么穿透Symmetric NAT?
修改
如题:
udp打洞时,如果两台处于内网的电脑,至少有一台处于内网,属于对称结构(Symmetric),那么怎么为他们点对点建立通道?
除了猜测连接外网的端口(比如有的会是刚用过端口的下几个端口),还有其他办法吗?
相关内容参考:
http://blog.csdn.net/jq0123/article/details/840302
NAT大致分为下面四类
1) Full Cone
这种NAT内部的机器A连接过外网机器C后,NAT会打开一个端口.然后外网的任何发到这个打开的端口的UDP数据报都可以到达A.不管是不是C发过来的.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
任何发送到 NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)
2) Restricted Cone
这种NAT内部的机器A连接过外网的机器C后,NAT打开一个端口.然后C可以用任何端口和A通信.其他的外网机器不行.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
任何从C发送到 NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)
3) Port Restricted Cone
这种NAT内部的机器A连接过外网的机器C后,NAT打开一个端口.然后C可以用原来的端口和A通信.其他的外网机器不行.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
C(202.88.88.88:2000)发送到 NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)
以上三种NAT通称Cone NAT.我们只能用这种NAT进行UDP打洞.
4) Symmetic
对于这种NAT.连接不同的外部目标.原来NAT打开的端口会变化.而Cone NAT不会.虽然可以用端口猜测.但是成功的概率很小.因此放弃这种NAT的UDP打洞. 修改
udp打洞时,如果两台处于内网的电脑,至少有一台处于内网,属于对称结构(Symmetric),那么怎么为他们点对点建立通道?
除了猜测连接外网的端口(比如有的会是刚用过端口的下几个端口),还有其他办法吗?
相关内容参考:
http://blog.csdn.net/jq0123/article/details/840302
NAT大致分为下面四类
1) Full Cone
这种NAT内部的机器A连接过外网机器C后,NAT会打开一个端口.然后外网的任何发到这个打开的端口的UDP数据报都可以到达A.不管是不是C发过来的.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
任何发送到 NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)
2) Restricted Cone
这种NAT内部的机器A连接过外网的机器C后,NAT打开一个端口.然后C可以用任何端口和A通信.其他的外网机器不行.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
任何从C发送到 NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)
3) Port Restricted Cone
这种NAT内部的机器A连接过外网的机器C后,NAT打开一个端口.然后C可以用原来的端口和A通信.其他的外网机器不行.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
C(202.88.88.88:2000)发送到 NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)
以上三种NAT通称Cone NAT.我们只能用这种NAT进行UDP打洞.
4) Symmetic
对于这种NAT.连接不同的外部目标.原来NAT打开的端口会变化.而Cone NAT不会.虽然可以用端口猜测.但是成功的概率很小.因此放弃这种NAT的UDP打洞. 修改
按投票排序
按时间排序
8 个回答
正好,我们已经对UDP打洞问题研究了近一个月,对于两方都是对称nat的情况,至少从可以了解的途径上(比如google,相关论坛)都没找到解决方案,我们自己也进行过测试,不行。
但是对于一端是对称nat,一端是端口限制性Cone nat的情况是可以打洞成功的,特别是我们实验的对称nat的端口变化还是有规律的(加1),我们使用端口猜测的方法进行打洞成功率还是非常高的。对于端口变化无规律的对称nat,这个猜测还是靠算法的设计,你可以看看 A New Method for Symmetric NAT Traversal in UDP and TCP (http://www.goto.info.waseda.ac.jp/~wei/file/wei-apan-v10.pdf)
另外如果你是做应用的话建议不要始终把自己局限于一定要打洞成功的思路上,对于一些路由器是可以通过配置支持穿透的,比如upnp;对于实在打洞不成功的情况你可以通过设计一个中转服务器来完成自己的应用;
但是对于一端是对称nat,一端是端口限制性Cone nat的情况是可以打洞成功的,特别是我们实验的对称nat的端口变化还是有规律的(加1),我们使用端口猜测的方法进行打洞成功率还是非常高的。对于端口变化无规律的对称nat,这个猜测还是靠算法的设计,你可以看看 A New Method for Symmetric NAT Traversal in UDP and TCP (http://www.goto.info.waseda.ac.jp/~wei/file/wei-apan-v10.pdf)
另外如果你是做应用的话建议不要始终把自己局限于一定要打洞成功的思路上,对于一些路由器是可以通过配置支持穿透的,比如upnp;对于实在打洞不成功的情况你可以通过设计一个中转服务器来完成自己的应用;
请参考我于
http://www.zhihu.com/question/20034397 回答的问题:
对于您的问题补充:
对于您的问题补充:
- STUN不能解决Symmetric NAT的问题
- 用TURN也就是Relay Server的话,就要求提前两个要聊天的host都彼此于这个server上留下了一个开开的port,但是这个就会增加management的复杂度,以及用中间电脑来传输的话,速度也会受影响。
frankie xiao 赞同
不知道你要做的是怎么样一个应用。。。
是不是一定要自动打洞?
能否让用户自己配置端口映射或者用UPNP?如某些P2P下载工具,能实现这一条的用户可获得更多资源(多了内网资源),而无法实现者只能分享外网资源。
是不是一定要自动打洞?
能否让用户自己配置端口映射或者用UPNP?如某些P2P下载工具,能实现这一条的用户可获得更多资源(多了内网资源),而无法实现者只能分享外网资源。
崔崔 赞同
关于UDP/TCP打洞的原理可以参考这篇paper:
USENIX '05 — Technical Paper, General Track
最近也在研究P2P网络中的NAT穿透,看到有说用ICE(STUN+TURN)的方式基本上可以解决所有的NAT问题,仅供参考:
STUN : RFC 5389 - Session Traversal Utilities for (NAT) (STUN)
ICE: RFC 5245 - Interactive Connectivity Establishment (ICE): A Methodology for Network Address Translator (NAT) Traversal for Offer/Answer Protocols
USENIX '05 — Technical Paper, General Track
最近也在研究P2P网络中的NAT穿透,看到有说用ICE(STUN+TURN)的方式基本上可以解决所有的NAT问题,仅供参考:
STUN : RFC 5389 - Session Traversal Utilities for (NAT) (STUN)
ICE: RFC 5245 - Interactive Connectivity Establishment (ICE): A Methodology for Network Address Translator (NAT) Traversal for Offer/Answer Protocols
问题圈太小,估计没人回答了要
以下是 我从网上找的资料:
1、<A New Method for Symmetric NAT Traversal in UDP and TCP>: www. http://goto.info.waseda.ac.jp/~wei/file/wei-apan-v10.pdf
这是日本Waseda University 的几个人搞的研究。
2、国内的《一种TCP协议穿透Symmetric NAT方案》-《An Efficient Solution for Symmetric NAT Traversal of TCP》 是中国农大出的论文。
希望有高人还能在做一翻指点。
以下是 我从网上找的资料:
1、<A New Method for Symmetric NAT Traversal in UDP and TCP>: www. http://goto.info.waseda.ac.jp/~wei/file/wei-apan-v10.pdf
这是日本Waseda University 的几个人搞的研究。
2、国内的《一种TCP协议穿透Symmetric NAT方案》-《An Efficient Solution for Symmetric NAT Traversal of TCP》 是中国农大出的论文。
希望有高人还能在做一翻指点。
把4种类型分别标为1234,有两台主机A:portA和B:portB(port都为外网端口,是与打洞服务器通信的端口),以及打洞服务器S,情景是B拿到了A:portA的信息,要与A通信。
(1)、A为类型1;无论B为哪种类型,都可以直接与A:portA tcp连接;
(2)、A为类型2;无论B为哪种类型,在A知道B之前都无法直接连接,B给S发一个打洞请求,S转发该请求到A。若B的类型为1,则A:portA可直接tcp连接到B:portB;若B的类型为2或3,则A:portA和B:portB各自向对方发送一个一字节的udp包,分别在自己的路由器上打洞,从此A:portA和B:portB可进行udp通信;若B为类型4,则portB在与不同的ip:port通信时会不一样,所以A:portA先向B发送一个一字节的udp包,在路由器上打洞,然后等待B:portB先发送数据,A:portA接收到B:portB的数据后,即知道portB,也可互通数据了;
(3)、A为类型3;无论B为哪种类型,在A知道B之前都无法直接连接,B给S发一个打洞请求,S转发该请求到A。若B的类型为1,则A:portA可直接tcp连接到B:portB;若B的类型为2或3,则A:portA和B:portB各自向对方发送一个一字节的udp包,分别在自己的路由器上打下洞,从此A:portA和B:portB可进行udp通信;若B为类型4,则portB在与不同的ip:port通信时会不一样,而A又要求知道portB的才可让B:portB连进来,所以这种情况A只能猜测与A:portA通信的portB,通信概率小;
(4)、A为类型4;无论B为哪种类型,在A知道B之前都无法直接连接,B给S发一个打洞请求,S转发该请求到A。若B的类型为1,则A:portA可直接tcp连接到B:portB;若B的类型为2,则B:portB先向A发送一个一字节的udp包,在路由器上打洞,然后等待A:portA先发送数据,B:portB接收到A:portA的数据后,即知道portA,也可互通数据了;若B的类型为3,见(3)中B为类型4的描述;若B为4,双方无法知道对方的端口,无法通信。
ps:纯手打,根据工作中的理解整理。
(1)、A为类型1;无论B为哪种类型,都可以直接与A:portA tcp连接;
(2)、A为类型2;无论B为哪种类型,在A知道B之前都无法直接连接,B给S发一个打洞请求,S转发该请求到A。若B的类型为1,则A:portA可直接tcp连接到B:portB;若B的类型为2或3,则A:portA和B:portB各自向对方发送一个一字节的udp包,分别在自己的路由器上打洞,从此A:portA和B:portB可进行udp通信;若B为类型4,则portB在与不同的ip:port通信时会不一样,所以A:portA先向B发送一个一字节的udp包,在路由器上打洞,然后等待B:portB先发送数据,A:portA接收到B:portB的数据后,即知道portB,也可互通数据了;
(3)、A为类型3;无论B为哪种类型,在A知道B之前都无法直接连接,B给S发一个打洞请求,S转发该请求到A。若B的类型为1,则A:portA可直接tcp连接到B:portB;若B的类型为2或3,则A:portA和B:portB各自向对方发送一个一字节的udp包,分别在自己的路由器上打下洞,从此A:portA和B:portB可进行udp通信;若B为类型4,则portB在与不同的ip:port通信时会不一样,而A又要求知道portB的才可让B:portB连进来,所以这种情况A只能猜测与A:portA通信的portB,通信概率小;
(4)、A为类型4;无论B为哪种类型,在A知道B之前都无法直接连接,B给S发一个打洞请求,S转发该请求到A。若B的类型为1,则A:portA可直接tcp连接到B:portB;若B的类型为2,则B:portB先向A发送一个一字节的udp包,在路由器上打洞,然后等待A:portA先发送数据,B:portB接收到A:portA的数据后,即知道portA,也可互通数据了;若B的类型为3,见(3)中B为类型4的描述;若B为4,双方无法知道对方的端口,无法通信。
ps:纯手打,根据工作中的理解整理。