`
wandejun1012
  • 浏览: 2737756 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

P2P原理及UDP穿透简单说明

    博客分类:
  • p2p
 
阅读更多

本文章出自cnntec.com的AZ猫著,如需要转发,请注明来自cnntec.com
【转自:】http://andylin02.iteye.com/blog/444666


Peer-To-Peer缩写P2P
中文称之为对等联网。
用途于交流,比如QQ,MSN等等。
文件传输、分布式数据计算等等。

这里我们主要是是简单讲解一下UDP实现NAT的穿透(俗称打洞)
当然TCP与之相似,可以以此类推。

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

分享到:
评论

相关推荐

    P2P之UDP穿透NAT的原理与实现

    关于UDP穿透NAT的中文资料在网络上是很少的,仅有&lt;&lt;P2P之UDP穿透NAT的原理与实现(shootingstars)&gt;&gt;这篇文章有实际的参考价值。 本人近两年来也一直从事P2P方面的开发工作,比较有代表性的是个人开发的BitTorrent下载...

    P2P之UDP穿透NAT的原理与实现资料+源代码

    对于初学者来说,理解并分析这些代码可以帮助深入理解P2P网络和UDP穿透NAT的工作原理。 总之,P2P中的UDP穿透NAT是解决网络隔离问题的关键技术,通过理解其原理和实现方法,开发者可以构建更加健壮和高效的分布式...

    P2p之UDP穿透NAT的原理与实现代码

    在提供的压缩包中,"P2P之UDP穿透NAT的原理与实现源代码"很可能是用某种编程语言(如C++、Python或Java)实现的示例代码,包含具体的打洞算法和信令交互逻辑。通过阅读和理解这些代码,可以更深入地了解UDP穿透NAT的...

    P2P之UDP穿透NAT的原理与C#实现(C#源码) 已调试成功

    以上是P2P之UDP穿透NAT的基本原理和C#实现方法的概述。在实际应用中,还需要考虑到网络环境的多样性,可能需要结合其他NAT穿透技术,如TURN,来提高成功率。通过理解和实践这些技术,可以构建出更加稳定和高效的P2P...

    P2P 之 UDP穿透NAT的原理与实现

    P2P 之 UDP穿透NAT的原理与实现

    P2P之UDP穿透NAT的原理与实现(增强篇).rar

    标题 "P2P之UDP穿透NAT的原理与实现(增强篇)" 指向的是一个关于如何在P2P网络中通过UDP协议穿透NAT(网络地址转换)的技术主题。NAT是互联网上广泛使用的一种技术,它允许一个内部网络中的多个设备共享一个公共IP...

    基于UDP的P2P小Demo (穿透NAT)delphi源码_终结版

    标题中的“基于UDP的P2P小Demo (穿透NAT)delphi源码_终结版”指的是一个使用Delphi编程语言实现的P2P通信示例项目,它着重解决了网络地址转换(NAT)的问题。NAT使得内部网络的设备可以通过单一的公网IP地址与外部...

    VC++ UDP穿透NAT(P2P)原理及代码.rar

    在网上找了很久的资源,使用VC++实现的UDP穿透NAT的原理,里面包括p2pclient和p2pserver.经过本人的测试,可以当做很好的学习资料.注意:编译p2pserver的时候,在125行 UserList::iterator removeiterator = NULL;和...

    P2P之UDP穿透NAT的实现+(附带源代码)

    P2P之UDP穿透NAT的实现+(附带源代码).rarP2P之UDP穿透NAT的实现+(附带源代码).rarP2P之UDP穿透NAT的实现+(附带源代码).rarP2P之UDP穿透NAT的实现+(附带源代码).rarP2P之UDP穿透NAT的实现+(附带源代码)....

    P2P之UDP穿透NAT的原理与C#实现(源码和描述)

    标题中的“P2P之UDP穿透NAT的原理与C#实现”主要涉及两个关键概念:P2P(peer-to-peer)网络技术和UDP(User Datagram Protocol)在NAT(Network Address Translation)环境下的穿透技术。这里我们将深入探讨这两个...

    P2P之UDP穿透NAT P2PServer

    标题中的“P2P之UDP穿透NAT P2PServer”指的是使用P2P技术,通过UDP协议在NAT(网络地址转换)环境下建立服务器的过程。在这个场景中,P2P(对等网络)允许网络上的设备直接通信,而不是通过中心服务器作为中介。UDP...

    P2P 之 UDP穿透NAT的原理与实现(附源代码)

    P2P 之 UDP穿透NAT的原理与实现(附源代码)。论坛上经常有对P2P原理的讨论,但是讨论归讨论,很少有实质的东西产生(源代码)。呵呵,在这里提供一个源代码来说明UDP穿越NAT的原理。比较简单,但很容易懂,(转自...

    P2P 之 UDP穿透NAT的原理与实现(附源代码)P2PServer.rar

    本资源“P2P 之 UDP穿透NAT的原理与实现(附源代码)P2PServer.rar”旨在详细介绍如何通过UDP协议穿透NAT,实现P2P网络中的节点间通信。下面将详细讲解这个主题。 首先,我们要理解NAT的工作原理。NAT允许私有网络...

Global site tag (gtag.js) - Google Analytics