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

 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建立连接失败,可以循环这个过程,直到一个有限的次数之后,仍不能连接则宣告失败。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于P2P的局域网即时通信系统+项目说明(c#源码)计算机网络课程设计.zip 基于P2P的局域网即时通信系统+项目说明(c#源码)计算机网络课程设计.zip 基于P2P的局域网即时通信系统+项目说明(c#源码)计算机网络课程设计.zip 【资源说明】 该项目是个人毕设项目源码,评审分达到95分,调试运行正常,确保可以运行!放心下载使用。 该项目资源主要针对计算机、自动化等相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。 具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现类似其他功能。 ### 已知技术参数和设计要求 1.掌握P2P原理。\ 2.实现一个图形用户界面局域网内的消息系统。\ 3.功能:建立一个局域网内的简单的P2P消息系统,程序既是服务器又是客户,服务器端口(自拟服务器端口号并选定)。\ 3.1用户注册及对等方列表的获取:对等方A启动后,用户设置自己的信息(用户名,所在组);扫描网段中在线的对等方(服务器端口打开),向所有在线对等方的服务端 口发送消息,接收方接收到消息后,把对等方A加入到自己的用户列表中,并发应答消息;对等方A把回应消息的其它对等方加入用户列表。双方交换的消息格式自己根据 需要定义,至少包括用户名、IP地址。\ 3.2发送消息和文件:用户在列表中选择用户,与用户建立TCP连接,发送文件或消息。\ 4.用户界面:界面上包括对等方列表;消息显示列表;消息输入框;文件传输进程显示及操作按钮或菜单。 ### 已经实现的功能 #### 核心功能 用户的注册与登录(一台电脑最多一个账户);\ UDP上下线广播,对等方的账户信息交换;\ TCP聊天消息交换,支持本地历史记录保存(rtf)和未读消息提示(xml);\ TCP文件传输(每次只能和一个人传文件),支持详细的进度显示和中断传输(可能有bug); #### 额外功能 弹出式通知气泡;\ 设置页面:用户名更改,清空本机数据,免密登录等; ### 放弃的功能 好友系统(局域网就几台电脑,搞好友系统好像没有必要);\ 多人文件传输(懒得搞);\ 优化 UID 的生成方式(懒得搞×2); ### 已知 BUG (严重)向虚拟机用户发送文件(>40MB),且传输速度高于5MB/s时,极高概率会发生文件损坏。原因尚不清楚;\ 若接收方中断文件传输,发送方极小概率会抛出 “往已释放的 SOCKET 写入数据” 错误,但是可以忽略(catch 改一下,让它不抛出错误就好了);\ 当局域网列表里的人全部下线,而用户正处于文件传输页面时,小概率会不跳转回局域网页面,而这会让用户误操作,向不存在的用户发送文件;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值