首页 > 编程知识 正文

p2p协议原理,udp实现p2p通信

时间:2023-05-05 12:30:09 阅读:107985 作者:1685

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。