利用P2P点对点技术实现UDP内网穿透

 介绍以前首先推荐一个程序员专用搜索引擎-http://www.openso.net
      
      
点对点技术在近几年应用很广,主要表明有QQ、skype、bt、迅雷、ppstream、pplive、qvod。咱们能够看到,只要是数据量很大,而通常利用中转服务器又须要必定规模投入的应用,咱们均可以考虑用P2P技术。有两个好处:1.能够下降成本与投入。2.提升传输性能。
  关于如何穿透内网,实现内网之间的点对点通讯,网上资料不少,但良莠不齐,有不少人可能看了仍是很模糊没法理解,其实作内网穿透不难,难的关键是在于对一些基础知识的理解,其中要涉及一些网络通信原理的东西。通常状况下,咱们作网络程序,首先都会考虑用TCP的方式来实现,用TCP的方式主要的好处有:1.编写程序简单,大部分是采用C-S模型,也就是客户端对服务器。2.TCP的特性保证了数据传输的可靠性,只要适当定制好协议,基本不会有网络丢包与边界的问题。但同时,TCP也有缺点,就是通讯效率较低。

  从上面的描述,咱们能够得出两个结论,作好P2P应用至少须要解决两个问题:1.实现内网之间机器的网络通讯。2.须要解决UDP出现的数据传输不稳定问题。html

  先说第一点,内网穿透,假设一台在NAT211.133.*后的192.168.1.77:8000要向NAT211.134.*后的192.168.1.88:9000发送数据,假设你向211.134.*这个IP地址的9000端口直接发送数据包,则数据包在到达NAT211.134.*以后,会被当作无效非法的数据包被丢弃,NAT在此时至关于一个防火墙,会对没有创建起有效SESSION的数据包进行拒绝转递。固然,你也不能直接用内网地址192.168.1.88进行发送数据包,这就比如你在广州要打电话到上海的某个地方,若是你不加区号,直接拨打区域内电话是件很愚蠢的事。
  那咱们要怎么实现穿透?首先咱们要认识NAT设备,NAT英文全拼是Network Address Translator(网络地址转换器),说白了就是凡是通过NAT发出去的数据包,都会经过必定的端口转换(而非使用原端口)再发出去,也就是说内网和外网之间的通讯不是直接由内网机器与外网NAT进行,而是利用内网对外网的NAT创建起SESSION与外网NAT的SESSION进行。而后,根据SESSION的不一样,NAT主要分红两种:Symmetric NAPT以及CONE NAPT。简单的说,Symmetric NAPT是属于动态端口映射的NAT,而CONE NAPT是属于静态端口映射的NAT。而市场上目前大多属于后者,CONE的英文意思锥,意思就是一个端口能够对外部多台NAT设备通讯。这个也正是咱们作点对点穿透的基本,是咱们所但愿的,不然如今的大部分点对点软件将没法正常使用。
程序员

  像上面的例子,NAT211.133.*和NAT211.134.*之间须要进行通讯,但开始不能直接就发数据包,咱们须要一个中间人,这个就是外部索引服务器(咱们假设是211.135.*:7000),当NAT211.133.*向211.135.*:7000发送数据包,211.135.*:7000是能够正常接收到数据,由于它是属于对外型开放的服务端口。当211.135.*:7000收到数据包后能够获知NAT211.133.*对外通讯的临时SESSION信息(这个临时的端口,假设是6000会过时,具体的时间不一样,但我我的的测试是每30秒发送一个心跳包keep住链接以保证端口维持住通讯链接不断开),索引服务器此时应将此信息保存起来。而同时,NAT211.134.*也在时刻向索引服务器发送心跳包,索引服务器就向NAT211.134.*发送一个通知,让它向NAT211.133.*:6000发送探测包(这个数据包最好多发几个),NAT211.133.*在收到通知包以后再向索引服务器发送反馈包,说明本身已经向NAT211.133.*:6000发送了探测包,索引服务器在接收到反馈包以后再向NAT211.133.*转发反馈包,NAT211.133.*在接收到数据包以后再向本来要请求的NAT211.134.*发送数据包,此时链接已经打通,实现穿透,NAT211.134.*会将信息转发给192.168.1.88的9000端口。
  对于Symmetric NAPT的状况,网上有人说能够经过探测端口的方式,不过成功率并不高,我建议可用服务器进行中转。另外,最好在数据包发送前先检测是否进行的是同个NAT的状况,也就是内网发内网,若是是,直接发送便可,而无需经过外网再绕回来。
  其次关于第二点,解决UDP传输的不稳定问题,其实这里涉及到另外一个方面的知识,就是滑动窗口的东西,能够开一个缓冲区用于循环接收数据以及重组,另外加上超时重发机制以及确认发送机制,有点像TCP的传输原理,不过若是处理的好,效率绝对比采用TCP的方式要高。另外对于滑动窗口机制的知识在这里就不说了,有兴趣能够上网找找资料。
服务器

 

出处:http://www.cnblogs.com/openso2009/archive/2009/09/23/1572448.html网络