文档库 最新最全的文档下载
当前位置:文档库 › P2P之UDP穿透

P2P之UDP穿透

P2P之UDP穿透
P2P之UDP穿透

P2P原理及UDP穿透简单说明

这里我们主要是是简单讲解一下UDP实现NAT的穿透(俗称打洞)

NAT的全称是Network Address Translator中文称之为网络地址转换

NAT分为两大类,NAT和NAPT(Network Address Port Translator)端口地址转换

用于实例,简单的说,实现P2P需要一个中转服务器。也就是需要一个第三方以简单的通迅来讲,首先我们来看一个示例图。

A<——————>B

A与B之间进行的通迅

A的IP地址为222.182.100.1

B的IP地址为222.182.100.2

如果这两个用户都是采用的全球唯一的IP地址,那么他们通迅很简单,也不需要实现P2P。

A<------------------>Nat<-------------------->B

如果其中一方为内网用户,及IP地址不为全球唯一IP

就会出现通过路由器进行通迅。

那么在经过路由器的时候,路由器会出现映射IP地址与端口的情况。

如:A为内网用户。B为外网用户。则B的IP地图为全球唯一IP地址。可以直接通迅。

A的IP地址为:192.168.1.100 端口为1025

经过路由器向B进行通迅,路由器将会产生一个一分钟到几小时不定的一个Session,这个Session映射了内网A的IP地址及其接收信息的端口。

那么路由向B发送信息的时候,IP地址及端口就变成了222.182.100.1:3645(假设)

这个时候实际上A就是在进行路由NAT的穿透

如果我们在B向A发送信息的时候采用192.168.1.100:1025这样的IP和端口,是找不到A的,因为这个IP不是全球唯一IP。

那么B需要的是在收到A的信息的时候,获取其IP地址和端口,那么获取到的就是222.182.100.1:3645这个路由器的映射Session地址。

B现在只需要向这个映射地址发送消息,路由器就会自动将消息发送到对应的A 方去。否则路由器将当作无用包,将这个消息丢弃。

那如,我们现在就实现了局域网向某单个固定外网机器发送消息。

如果再来一台C端,也是外网的IP。C通过222.182.100.1:3645向A发送消息,A是否能收到呢?答案是否定的,A不能收到。为什么?因为路由在映射A 的穿透时就记录了B的地址,也就是除了B向这个映射点发送消息可以通向A,其它的地址是不行的。路由器此时会将其当作无用包消息给丢弃掉。

那怎么办呢?只有A再向C发送一个穿透,C才可以向A发送消息。

以上我们只是说了一点基本的理论。接下来我们要实现什么?不同内网通过internet网进行通迅。

我们举个图例

A<----------->NatA<---------->NatB<---------->B

A的地址是:192.168.1.100端口4000

B的地址是:192.168.1.100端口4000

它们两个都是内网的地址。及局域网内部地址。并不是全球唯一地址。

两个路由:

NatA的地址是:222.182.100.1

NatB的地址是:222.182.100.2

这两个路由是外网的地址,及全球唯一地址。

现在我们要实现A与B的通迅。

因为A与B都不是外网地址。所以A不可能向192.168.1.100发送消息。这消息只会它自己收到,因为这个IP是它自己的。同样B也不可以。

那么A向NatB发送消息,B能收到吗?答案是否定的,不能收到。刚才我们提到过。因为路由没有映射B的地址。A并不知道这个Session就连NatB也不知道这个Session因为B没有向A发送消息,并不产生这个Session。

就算B和A同时向双方的路由发送消息,产生的Session,A和B也得不到。因为在路由上就把这个消息当做为无用包给丢弃掉了。

那么这样的情况我们要进行通迅怎么办呢?

对,就是刚才我们提到的第三方。第三方是个什么方呢?

第三方必须是一个拥有固定外网IP的服务方。及一个外网服务器。全唯一IP地址。

图例:

假定我们这个第三方为C

C IP:222.182.100.3端口4001

A<----------->NatA<--------------->C<-------------------->NatB<------------->B

原理如下

A通过路由向C发送消息,C获取A的在路由上的Session地址,映射的IP和端口

B同样。

这时候C就有了A和B的地址。

C可以和A、B进行通迅,但是A和B还不行。

现在C需要通知A方B的映射IP和端口。也要通知B方A的映射IP和端口。这样A就有了B的映射地址,B也有了A的。但是现在还不能进行通迅。

因为在路由上A和B都只有对C的穿透。并没有相互之前的穿透。

那么A要向B发送消息怎么办呢?需要C向B发送一个消息告诉B方A的地址让B向这个地址发送一个消息,对A进行一个穿透。

这样A就可以向B发送消息了。在A向B发送消息的同时,A也在向B进行穿透。

这样就可以实现相互的通迅了。如果有多个端点,也就以此类推了。

宗上所述就是P2P的UDP实现原理了。TCP也是一样的。提示一点。Session 在路由上是有时限的,一分钟到几小时不定。不同的路由不同的时间,为了保持

这个Session的存在,你需要在固定时间点进行通迅,保持这个穿透,否则就得重新穿透。

值得注意的一点。

路由上的映射有两种情况

第一种情况是:Cone NAT

第二种情况是:Symmetric NAT

我们以上的实现是以Cone Nat为基础的。为什么呢?因为Cone Nat在映射的时候端口是不变的。无论你内网有多少台机器,向外网发送消息在路由上映射的端口都是不变的。

而Symmetric Nat则相反,一个映射一个端口。如果碰到这种情况只有祝你好运了,最好不要猜。

1. NAT 的划分

RFC3489中将NAT的实现分为四大类:

1. Full Cone NAT 完全锥形NAT

2. Restricted Cone NAT 限制锥形NAT(可以理解为IP限制)

3. Port Restricted Cone NAT 端口限制锥形NAT(IP+Port限制)

4.Symmetric NAT 对称NAT

其中完全锥形的穿透性最好,而对称形的安全性最高

1.1 锥形NAT与对称NAT的区别

所谓锥形NAT 是指:只要是从同一个内部地址和端口出来的包,无论目的地址是否相同,NAT 都将它转换成同一个外部地址和端口。

“同一个外部地址和端口”与“无论目的地址是否相同”形成了一个类似锥形的网络结构,也是这一名称的由来。

反过来,不满足这一条件的即为对称NAT 。

1.2 举例说明

假设:

1.NAT 内的主机 A : IP 记为 A ,使用端口 1000

2.NAT 网关:IP 记为 NAT ,用于 NAT 的端口池假设为( 5001-5999 )

3.公网上的主机 B : IP 记为B,开放端口 2000

4.公网上的主机 C :IP 记为C,开放端口 3000

假设主机A先后访问主机B和C

1)如果是锥形NAT:

那么成功连接后,状态必然如下:

A(1000)——> NAT(5001)——> B(2000)

A(1000)——> NAT(5001)——> C(3000)

也就是说,只要是从A主机的1000端口发出的包,经过地址转换后的源端口一定相同。

2)如果是对称形NAT:

连接后,状态有可能(注意是可能,不是一定)如下:

A(1000)——> NAT(5001)——> B(2000)

A(1000)——> NAT(5002)——> C(3000)

两者的区别显而易见。

1.3 三种CONE NAT之间的区别

仍然以上面的网络环境为例,假设A先与B建立了连接:

A(1000)——> NAT(5001)———> B(2000)

1) Port Restricted Cone NAT:

只有B(2000)发往NAT(5001)的数据包可以到达A(1000)

===========================================================

B(2000)——> NAT(5001)———> A(1000)

B(3000)——> NAT(5001)—X—> A(1000)

C(2000)——> NAT(5001)—X—> A(1000)

2) Restricted Cone NAT

只要是从B主机发往NAT(5001)的数据包都可以到达A(1000)==========================================================

B(2000)——> NAT(5001)———> A(1000)

B(3000)——> NAT(5001)———> A(1000)

C(2000)——> NAT(5001)—X—> A(1000)

3) Full Cone NAT

任意地址发往NAT(5001)的数据包都可以到达A(1000)

==========================================================

B(2000)——> NAT(5001)———> A(1000)

B(3000)——> NAT(5001)———> A(1000)

C(3000)——> NAT(5001)———> A(1000)

相关文档