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则相反,一个映射一个端口。如果碰到这种情况只有祝你好运了,最好不要猜。(十有八九猜不到。所以不推荐猜)