P2P原理和UDP透明的简要说明博客分类:P2P
转载: http://and ylin 02.iteye.com/blog/444666
本文来自cnntec.com的AZ猫着。 如果需要转发,请注明来自cnntec.com
Peer-To-Peer简称为P2P
在中文里被称为对等网络。
用于QQ、MSN等的交流。
文件传输、分布式数据计算等。
在这里主要简单说明UDP实现NAT的穿透,俗称打孔
当然TCP和那个很像。 这样就可以类推了。
NAT首先显示在路由器上。 详情请在网上查一下资料
NAT的全名在网络地址转换器中文中称为网络地址转换
NAT大致分为两种,NAT和networkaddressporttranslator (napt )当然是端口地址转换。
为了用于实例,简单地说,实现P2P需要中继服务器。 也就是说需要第三者。 (稍后我们为什么需要第三者)
在简单的交流中,我们先看一下样品图。
在A——————B A和b之间进行的通信
的IP地址是222.182.100.1
的IP地址是222.182.100.2
如果两个用户都采用了世界上唯一的IP地址,他们通信简单,也不需要实现P2P。
a------------ NAT-----b
如果一方是内部网的用户,且IP地址不是世界上唯一的IP
进行通过路由器的通信。
通过路由器时,路由器可能会映射IP地址和端口。
例如,a是内部网的用户。 b是外联网用户。 B的IP映射是世界上唯一的IP地址。 可以直接通信。
的IP地址为192.168.1.100端口为1025
通过路由器与b进行通信时,路由器会在1分钟到几小时内生成不定的会话。 此会话映射内部网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的路由器的映射会话地址。
b只要向该映射地址发送消息,路由器就会自动向对应的A端发送消息。 否则,路由器将此消息作为无用的数据包丢弃。
这样,我们现在实现了向有局域网的一个固定外网机发送消息。
如果再来一台C端的话,也是外网的IP。 通过222.182.100.1:3645向a发送信息,a能接受吗? 答案是否定的。 a不能收下。 为什么? 因为路由在地图a的穿透时记录了b的地址,也就是说b向这个地图点发送信息和a是相通的,但是其他的地址是不行的。 路由器将其作为无用的数据包消息丢弃。
我该怎么办? 只有a再向c发送一个突破,c才能向a发送消息。
以上只是说了一点基本理论。 接下来要实现什么? 不同的内部网通过互联网进行通信。
另外,举个图例吧
a-------nata------ NAT B----b
的地址是192.168.1.100端口4000
的地址是192.168.1.100端口4000
两个都是内部网的地址。 以及局域网的内部地址。 不是世界上唯一的地址。
两条路线:
北约的地址是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则相反,一个映射一个端口。如果碰到这种情况只有祝你好运了,最好不要猜。(十有八九猜不到。所以不推荐猜)