不同局域网间的P2P通信技术

来源:互联网 发布:mysql in和and 编辑:程序博客网 时间:2024/06/14 08:15
 P2P(Peer-to-Peer)即对等网络。P2P(Peer to Peer)网络结构区别于Client/Server结构或Browser/Server结构最显著的特点是整个网络不存在中心节点(或中心服务器),其中的每一个节点(peer)大都同时具有信息消费者、信息提供者和信息通讯等三方面的功能。

    NAT(Net Address Translation):网络地址转换,即局域网通常通过一个具有公网IP的代理网关服务器连到internet共享上网。局域往内的机器并不具有公网IP地址,只有内网IP地址,若要和internet上的HTTP服务器通信,代理网关便会创建一个端口来和这个网内机器通信,并通过该端口和HTTP服务器交换数据。最终,网内机器-->代理网关-->HTTP服务器,在一个会话期间,各自的端口保持了映射关系,特别是代理网关和网内机器的端口映射,使得代理网关不会把接收到的数据包发错对象。局域网内的机器在网关处,就是靠NAT来映射端口实现internet连接。因此,NAT也称为端口映射。端口映射之后,在一个会话期间保持,对于TCP连接是直到连接断开才销毁,而对于UDP,却存在一个不定的生存期。
    如果两台机器A和B,分别处于两个局域网内,要通过internet通信,即为P2P连接通信。目前的internet使用IPV4,采用32位IP地址,主要被用来进行C/S形式的通信,需要共享的资源集中放于internet服务器上,IPV4对于P2P分布式资源共享的支持,极不友好。首先,32位IP地址已经不敷使用,公网IP地址日趋紧张,只能使用局域网共享公网IP的方式,局域网正是为了临时应对IP耗尽而出现的,长远的解决办法是研究IPV6。其次,分别处于两个局域网内的机器要通信,由于对方没有公网IP,直接呼叫对方是不可能的,必须
借助第三方中介间接地通信,解决方法有如下几种:
1、实现局域网内的数据链路层协议,就是设计一个类时TCP/IP的协议,由它来代替TCP/IP协议,由它直接基于网卡硬件获取数据。这是十分复杂的。
2、依靠internet上的公网服务器中转数据,但对于大数据量的中转,显然受到服务器和网络的负载极限的限制。
3、依靠internet上的公网服务器做媒介,将这两台分别处于不同局域网的机器相互通知给对方,在它们建立连接之后,服务器即脱离关系。这种方式下,服务器把A的NAT端口映射关系告诉B,又把B的NAT端口映射关系告诉A,这样AB相互知道对方的端口映射关系之后,就能建立连接。因为A和B各自的端口映射关系是靠各自的代理网关动态建立的,动态建立的映射端口不得告知对方。
4、上面的第三种办法,也可以采用静态端口映射方式,这样就无需中介服务器对A和B做介绍。在各方自的代理网关上,可以在代理工具里将某个端口(如1002)和局域网内的某台机器(如内网IP为192.168.18.23,端口1003)做好静态映射,这样,代理网关会自动地将出入于1002端口的数据发往192.168.18.23的1003端口。当然,通信之前,必须对对方的端口映射关系做配置。有多少台网内机器要通信,就得映射多少个不同的端口,同时在另一个局域网内的机器就要做多少个配置。在局域网内搭建HTTP、FTP等服务器就是通过静态映射端口来实现的,这个端口一般不是HTTP、FTP的默认80和23,所以对这类站点的访问往往会在URL里加上端口号。

   由此所知,上述前两种办法在简单应用中是不可取的,只有后两种可行。它们又各有缺点,第三种动态映射端口,需要增加中介服务器,第四种静态映射端口,在需要通信的各方机器很多的情况下,做手工端口映射和配置都是很繁琐的,并且一方添加一台机器,就需要在其余对方增加配置。
采用动态和静态相结合的办法是可以推想的,然而其可行性还必须经过测试。可以这样设计,为了让所有通信机器彼此知晓并定位。我们可以在局域网里,只对一台机器在代理网关处做静态端口映射,本局域网内的机器都向它登记。而两个局域网各自只做一项对对方的映射配置。两个局域网之间,没有静态映射端口的机器要通信,就靠有映射的机器来担当“介绍”。

    就局域网和NAT的问题实际上还很多,比如各自的局域网的结构不同,局域网里可能又有子局域网,局域网可能是NAT代理结构,但也可能是HTTP代理,Sock4、Sock5代理等结构,NAT又分严格的和非严格NAT,严格NAT限制很多,更不便于P2P。不过,软件不能实现的地方,可以考虑改变硬件结构,例如将严格NAT变为非严格NAT。如果硬件改变不得,那么Internet整体上就有10%的系统不能实现P2P,除非等到正处于研发的IPv6协议出来。P2P要解决的唯一技术难题是如何发现、定位和寻址对方,就是如何穿透NAT、HTTP、Sock等代理和如何穿透防火墙找到对方并建立起通信的问题。由于绝大多数局域网是NAT代理结构,所以前面对NAT论述比较详细,也是网上讨论最多的话题,相比之下,穿透Http、Sock代理就简单一些。此外,穿透NAT发现对等点的办法还有一些,例如多播,但由于现有Internet对多播并不友好,同时多播是无连接和不可靠的,其实现有难度。许多软件都是按照上述一些技术实现了P2P通信,著名的有MSN、QQ和BitTorrent下载软件等。

    我们不希望在IP层实现我们的P2P,而是希望在应用层,利用Windows提供的Socket建立P2P,至多下到用原始Raw Socket来写P2P。首先看,我们对于公网有服务器做“中介(非中转)”的P2P怎么实现。

原理讲述:
  例如AB两台机器分别处于两个不同的局域网后,由Server做中介,先看连接过程。
  A首先连接服务器,采用UDP发包给Server,这个包包括了A的用户信息,类似于QQ的QQ号、呢称等。Server方,可以用CSocket::GetPeerName()得到A的IP及端口,但得到的IP和端口应该是A的代理网关的公网PublicIP及其映射端口NatPort,该映射端口就是A的代理网关为A的本次UDP通信临时分配的Nat端口。可以断言,得到的端口一定不是A的内网IP和内网UDP端口。
  服务器然后将A的公网IP、映射端口、用户信息等保存到(内存列表或者数据库),这样标志着A已经上线。服务器马上将其它在线的用户信息发回给A,包括其它用户的代理网关的公网IP及Nat端口。A同样将在线用户的这些信息保存并显示为列表,期待A用户做出选择。
  对于B,同样有上述的上线过程。
  当A用户做出选择,要和在线的B用户通信时,A首先发UDP包给B的公网IP及Nat端口,并立即发一个UDP包给服务器,让服务器去通知B,叫B给A也发一个UDP包。换句话说,1、A发包给PublicB, 2、A发包给Server,3、Server发包给PublicB,4、B发包给PublicA。
  上面的叙述用到了"Public"字样,它代表代理网关的公网IP及其映射端口。  
  由于A和B各自的网关都保存了各自的端口映射关系,发到网关的数据,网关会按照这个映射关系转发给A和B。当A和B都分别收到对方发来的UDP包以后,连接宣告成功,服务器即可以脱离,AB即可以用UDP通信。

  何以如此麻烦?

  A在发UDP包给Server上线时,A的网关(A.Gate)就分配一个Nat端口(A.NatPort)给A,用于A和Server间的本次UDP会话,但A的网关明确标记,这个Nat端口,仅能用于A和Server之间的UDP通信,不能挪着它用。并且,这个临时分配的端口,只能保持一个很短的时效,也许是一两秒吧。这个时间内,如果A与Server没有任何通信,那么这个映射端口就宣告无效。下次,A和Server又要通信时,A的网关又会重新分配一个新的端口。这段表明三点:
  1、A与Server的通信,需要A网关分配Nat端口来中转。
  2、Nat端口只能用于A和Server间的通信。
  3、Nat端口存在生存期,长时间A和Server无通信,该端口即宣告无效。
  就是这些麻烦,使得我们的连接过程必须绕很多弯。
  A和B的通信,就是借助事先AB分别与Server连接时,在各自的网关处建立的端口映射来通信。为避免上面的2、3点麻烦,A和B在初次连接时,必须几乎同时向对方发包。
  如果A、B不同时发包给对方,它们各自的网关就会虑掉对方的包,因为该包不是Server发来的包,叫做不请自来的包。
  并且,即便AB各自的网关不虑掉非Server发来的包,它们各自的Nat端口也有一个时效。那么A与Server,B与Server就不得不发心跳包,以维持各自的映射端口,保证其不失效。
  上面的过程中,如果A和B建立连接失败,可以循环这个过程,直到一个有限的次数之后,仍不能连接则宣告失败。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 黑色裤子被漂白水漂红了怎么办 黑色裤子晒红了怎么办 黑色裤子泛红了怎么办 黑色裤子洗红了怎么办 新内衣穿了痒怎么办 灰色针织运动裤洗完发黄怎么办 皮衣买大了一号怎么办 紧身衣破了一个洞怎么办 紧身衣破了一个小洞怎么办 内衣肩带不带调整的怎么办 不正确佩戴胸罩导致下垂怎么办 增肌时期晚上饿怎么办 啤酒和可乐喝了怎么办 脸部毛孔堵塞不出汗怎么办 减肥运动完饿了怎么办 想减肥晚上饿了怎么办 孕妇喝不进去水怎么办 跑步喝多了水怎么办 衣柜门轮子坏了怎么办 穿瑜伽裤下边有缝怎么办 3岁宝宝比较内向怎么办 我想和我同学搞基怎么办 自己做的葡萄酒太甜怎么办 吉米学校想退款怎么办 汽车租赁公司不退押金怎么办 身材不好怎么办健身教练形象照 反祈祷式做不到怎么办 窦性心跳过缓怎么办 四维彩超查出胎儿心脏有问题怎么办 减脂肚子饿了怎么办 做瑜伽腰扭到了怎么办 出了汗怎么办活动反思 农村都是老人和孩子怎么办 瑜伽垫容易出现痕迹怎么办 37岁失业了该怎么办 45岁找什么工作怎么办 华为手机4g网速慢怎么办 解析软件包时出现问题怎么办 一字马不能下去髋摆不正怎么办 练轮瑜伽骆驼式腰疼怎么办 感昌咳嗽老不好怎么办