P2P打洞技术
P2P 概述 相比于 C/S B/S 架构来说, P2P 是由 Peer 组成。每个Peer同时是客户端也是服务器。这意味着,P2P网络中的peer点为每个其他的peer提供服务,所有节点直接相互通信,没有中心节点,并共享资源源相互联系。 P2P有结构化的P2P网络和非结构化P2P网络。如TomP2P (Java的一个框架,一个分布式哈希表,提供去中心化的键/值基础设施)。而Gnutella (第一个分散式P2P文件共享网络),是非结构化 (unstructured)P2P网络的。另外还有两种类型的P2P网络,即集中式(centralized)P2P网络(Napster)和混合(hybrid p2p)peer网络(如Skype)。 NAT网络 由于NAT的网络模型,破坏了主机 Peer之间的端到端连接,因此P2P网络需要穿过NAT网络,而穿过NAT网络是目前为P2P技术面临的一个很大的挑战。 网络地址转换,NAT (Network Address Translation)是一种模糊指明的机制,可以将两个IP连接在一起,一个NAT设备总是拥有至少两个IP地址,(公网IP,私网IP),NAT就是将数据包上的IP地址在传输时,将私网IP转换为公网IP。每个NAT设备会维护一个NAT表,该表存储了所有活动的连接。 在创建网络映射后,NAT将源IP地址和端口更改为外部源IP地址和端口。NAT保留端口,不将新端口分配给外部源。一旦创建了映射,只要映射存在,与之联系的设备就能够发回消息。不存在NAT映射的所有来自外部的通信请求都是无法穿越NAT。因此,在P2P环境中,如果两个peer位于在NAT之后,两者都无法直接联系,因为它们之间不知道外部IP地址和源端口,NAT表中并没有其所维护的映射信息。所以NAT穿越中的主要问题之一是网络地址转换问题。 NAT网络类型 一般来讲, NAT网络可以分为四种类型: nat type 全锥型(Full Cone) 受限锥型(Restricted Cone), 或者说是IP受限锥型 端口受限锥型(Port Restricted Cone), 或者说是IP + PORT受限锥型 对称型(Symmetric) Full Cone NAT 全锥形 全锥形网络(Full Cone NAT) 的工作原理类似于 IP 地址一对一映射。 内部 IP 和端口映射到相同的外部地址和端口。 之后,任何外部源都可以通过向外部地址发送数据包来访问内部主机。 这意味着,一旦创建了映射,任何外部主机都可以联系内部主机。如下图 地址受限形的锥形NAT Address Restricted Cone NAT 地址受限形锥形 NAT是,仅当内部主机先联系外部主机时,受限锥形 NAT 才会为相应的内部主机分配外部IP。 外部主机然后能够通过分配的外部地址联系内部主机。 对称型 Symmetric nat 对称 NAT 是最难穿过的NAT,因为对称将随机端口分配给映射。 如果外部主机首先与内部主机连接,则外部主机只能知道外部映射。 在 P2P 场景中, 如果两个Peer(主机)位于 NAT 后面,则它们无法互相通信以让另一个对等体知道所使用的映射。 此外,对称 NAT 几乎不可能知道分配的端口以通过打孔(hole Punching)建立连接。...