`
awfwxf
  • 浏览: 70365 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

不同局域网内经Internet的P2P通信技术总结

阅读更多
以下将要用到一个叫做NAT的重要名词,先做点解释。
  NAT是Net Address Translation(网络地址转换)的简称,就是说,局域网通常靠一个具有公网IP的代理网关服务器连到Internet共享上网。局域网内的机器并不具备公网IP地址,它只有内网地址,假设它要和Internet上的HTTP服务器通信,代理网关便会新建一个端口来和这个网内机器关联,并通过这个端口来和HTTP服务器交换数据。最终,网内机器->代理网关->HTTP服务器,在一个会话期间,各自的端口保持了映射关系,特别是代理网关和网内机器的端口映射,使得代理网关不会把接收到的数据向网内转发时,发错了机器。
  局域网内的机器在网关处,就是靠NAT来映射端口并实现Internet连接,因此,NAT也直接被称为“端口映射”。端口映射之后,在一个会话期间保持,对于TCP连接是直到连接断开才销毁,而对于UDP,却存在一个不定的生存期,例如2秒。
  如果两台机器A和B,分别处于两个局域网内,它们要通过Internet通信,这就是P2P(点到点)连接通信。
  目前的Internet使用IPv4协议,采用32位IP地址,主要被用来进行C/S形式的通信,需要共享的资源集中放于Internet服务器上。 IPv4对于P2P分布式资源共享的支持,极不友好。首先,32位IP地址已经不敷使用,公网IP地址日趋紧张,只能使用局域网共享公网IP的方式,局域网正是为了临时应对IP耗尽而出现的,长远的解决办法是研究IPv6。其次,分别处于两个局域网内的机器要通信,由于对方没有公网IP,直接呼叫对方是不可能的,必须借助第三方“中介”(机器或者软件)间接地连通,解决办法下列几种:
  第一:实现局域网内的数据链路层协议,就是写一个类似于TCP/IP的协议,由它来代替Windows系统里的TCP/IP协议,由它直接基于网卡硬件获取数据。这是十分复杂的。
  第二:用Internet上的公网服务器中转数据,但对于大数据量的中转,显然受到服务器和网络的负载极限的限制。
  第三:依靠Internet上的公网服务器做“媒人”,将这两台分别处于不同局域网的机器相互介绍给对方,在它们建立连接之后,服务器即脱离关系。这种方式下,服务器把A的NAT端口映射关系告诉B,又把B的NAT端口映射关系告诉A,这样AB相互知道对方的端口映射关系之后,就能建立连接。因为A和B 各自的端口映射关系是靠各自的代理网关动态建立的,动态建立的映射端口不得不告知对方。
  第四:上面的第三种办法,也可以采用静态端口映射方式,这样就不需要中介服务器对A和B做介绍。在各方的代理网关上,可以在代理工具里将某个端口(如1350)和局域网内的某台机器(如内网IP为 200.200.200.100,端口1360)做好静态映射,这样,代理网关会自动地将出入于1350端口的数据发往200.200.200.100的 1360端口。当然,通信之前,必须对对方的端口映射关系做配置。有多少台网内机器要通信,就得映射多少个不同的端口,同时在另一个局域网内的机器就要做多少个配置。在局域网内搭建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下载软件等。
  实际上,围绕P2P通信,尤其是两个不同局域网间的P2P,已经有许多的P2P协议和开发包涌现。例如,Sun公司以Java写的开发包Jxta,微软在Windows XP平台上有P2P的β版开发包,Intel公布.Net平台上的P2P应用开发工具包,放到微软有关.Net平台的新闻站点 www.gotdotnet.com上供用户免费下载。
  但是利用它们来开发程序,非常繁琐,我们需要用简单的实现完成功能就可以了。
  如果想研究得更深入仔细,请从Sun公司的网站和微软网站下载开发包,或者在Google里
  搜索协议和开发包。
  下面其实有两个实例,讲述连通的过程,包括简单伪代码。
  我们不希望在IP层实现我们的P2P,而是希望在应用层,利用Windows提供的Socket建立P2P,至多下到用原始Raw Socket来写P2P。
  首先看,我们对于公网有服务器做“中介(非中转)”的P2P怎么实现。
  原理讲述:
  例如AB两台机器分别处于两个不同的局域网后,由Server做中介,先看连接过程。
  服务器然后将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建立连接失败,可以循环这个过程,直到一个有限的次数之后,仍不能连接则宣告失败。
分享到:
评论

相关推荐

    不同局域网内经Internet的P2P通信技术扫描.pdf

    点到点(P2P)通信技术在不同局域网之间通过Internet进行连接时面临的主要挑战是如何穿透网络地址转换(NAT)。NAT允许局域网内的设备通过一个公共IP地址共享Internet连接,但同时也阻碍了这些设备直接与其他局域网...

    局域网P2P通信(根据TCP协议实现)采用VS2008编写

    在IT领域,局域网(LAN)中的点对点(P2P)通信是一种常见的网络交互方式,尤其在多用户共享资源或者进行实时协作时。本文将深入探讨如何使用TCP协议在Visual Studio 2008环境下实现这一功能。 TCP(传输控制协议)...

    局域网实现点对点通信P2P

    在局域网(LAN,Local Area Network)环境中,P2P通信技术尤其有用,因为它可以高效地分享资源,如文件、音乐、视频和游戏,同时减少了对中心服务器的需求,降低了网络拥堵。 **P2P通信的基本原理** P2P通信的核心...

    反p2p终结者杀死局域网中的p2p终结者

    标题“反p2p终结者杀死局域网中的p2p终结者”指的是一个特定的软件或技术解决方案,用于在局域网环境中对抗P2P(peer-to-peer)终结者软件。P2P终结者是一种网络管理工具,它通常被用来限制或阻止局域网内的P2P文件...

    天易成网管 局域网管理 限制P2P

    《天易成网管:局域网管理与P2P限制解决方案》 在现代网络环境中,局域网(LAN)的管理和优化是一项重要的任务。尤其是当网络资源被多个用户共享时,如何合理分配带宽,避免个别用户的大流量操作如P2P下载对其他用户...

    基于P2P技术的局域网即时通信软件 毕业论文

    标题中的“基于P2P技术的局域网即时通信软件”是一个典型的计算机科学与信息技术相关课题,主要关注的是如何利用P2P(Peer-to-Peer)技术构建在局域网内的即时通信应用。这一主题涵盖了多个重要知识点,包括P2P网络...

    局域网控制工具 p2p

    局域网控制工具 p2p 局域网 终结者

    局域网限速软件P2P终结者4.rar

    P2P终结者是一款网络管理软件,用来管理局域网中BT、电驴等大量占用带宽的下载软件,可以帮助您更好的管理您的局域网。它可以运行在Windows2000/XP/2003操作系统上。 P2P终结者是由Net.Soft工作室开发的一套专门...

    基于P2P的局域网即时通信系统(java)

    标题 "基于P2P的局域网即时通信系统(java)" 描述了一种使用Java编程语言实现的、在局域网环境中运行的P2P(peer-to-peer)即时通讯解决方案。这种系统允许网络中的各个节点既是服务提供者(server-like),也是...

    局域网聊天工具socket通信技术

    在IT领域,Socket通信技术是构建网络应用程序的基础,尤其在设计局域网聊天工具时,它的作用至关重要。Socket,也称为套接字,是网络编程中的一个接口,它允许两个程序通过网络进行通信。在本场景中,我们将深入探讨...

    局域网管理工具 P2P终结者

    【局域网管理工具——P2P终结者】 在日常的网络使用中,尤其是在局域网环境中,我们可能会遇到网络资源被过度占用的情况,导致其他设备的网络速度变慢,影响了正常的工作或娱乐。为了解决这个问题,"P2P终结者"是一...

    基于P2P技术的局域网聊天工具

    基于P2P技术的局域网聊天工具实现了去中心化的通信,为局域网内的用户提供高效、便捷的聊天和文件共享体验。通过巧妙地应用TCP和UDP协议,以及精心设计的P2P通信协议,可以克服传统C/S架构的局限,同时带来新的功能...

    P2P 计算机网络 局域网

    对于局域网通信,P2P技术的应用更加广泛。在局域网中,由于所有设备都在同一个物理网络环境下,P2P通信可以更快地建立连接,减少延迟。例如,文件共享、打印服务、游戏对战等都可以通过P2P技术在局域网内实现。在...

    阻止局域网内P2P下载占资源

    标题“阻止局域网内P2P下载占资源”涉及的是网络管理和带宽优化的主题,主要是针对P2P(peer-to-peer)技术在局域网内的应用,这种技术常常会导致网络资源的过度消耗。P2P下载允许用户共享大文件,如电影、音乐或...

    FLASH局域网免服务器P2P聊天室源码(as3+flash开发)

    【标题】"FLASH局域网免服务器P2P聊天室源码(as3+flash开发)" 涉及的核心技术主要包括ActionScript 3 (AS3)、P2P(点对点)通信以及局域网应用的开发。AS3是Adobe Flash Player支持的编程语言,用于创建交互式的...

    局域网p2p,让网速飞起来

    在IT领域,局域网(Local Area Network,LAN)是一种将多台计算机设备连接在一起,以便于它们之间进行高速通信的网络。在这种网络环境中,P2P(Peer-to-Peer)技术的应用可以让网速得到显著提升,特别是对于数据传输...

    局域网p2p聊天

    局域网P2P聊天是一种在本地网络内实现设备间直接通信的技术,它不依赖中央服务器,而是通过网络中的每个设备(对等节点)互相连接进行数据交换。这种技术在许多场景下,如家庭网络、小型办公环境中,可以提供高效、...

    go2lan P2P 虚拟局域网

    Go2Lan是一个虚拟局域网的平台 ... 局域网游戏 虚拟局域网里玩魔兽争霸,反恐精英等局域网游戏 使用方便 软件小巧 零配置,无需调整防火墙或路由器即可工作 免费 go2lan P2P 虚拟局域网软件是免费的!

    局域网中P2P即时通讯工具的设计与实现 (2012年)

    该软件的网络通信采用TCP/IP( Transmission Control Protocol/Internet Protocol)协议,程序架构采用基于C/S( Client-Server)与P2P( Point to Point)相结合的模式,即软件客户端之间的通讯采用P2P架构,局域网用户与...

Global site tag (gtag.js) - Google Analytics