注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

itoedr的it学苑

记录从IT文盲学到专家的历程

 
 
 

日志

 
 

P2P软件qq的通信原理  

2013-11-30 00:18:26|  分类: p2p应用 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、普通p2p软件通讯原理
         在传统的集中式网络中,都是一台服务器(集群)对外提供服务,所有客户端都依赖中央服务器进行与服务端的通信或者其他客户端的通信。 随着通信量的加大,还有就服务的多样化,无论从道德方面还是通讯效率方面,p2p都是未来的发展方向。客户间自行通信,内容不被其它节点获取,这是信息安全的要求。
P2P软件qq的通信原理 - itoedr - itoedr的it学苑
 
图1 星型拓朴的C/S与B/S构架图

          图1这样的通信方式,一个数据包从一个客户端发送到另一个客户端都要在服务端中进行中转,服务端承受的压力非常大,很容易因为线程问题而宕机。 这是中心化服务的软件通信构架。如果我们只是让相关客户端间进行通讯呢?那就是去中心化的通讯(p2p)了。
         但是我们可以提前说明一句:QQ并非去中心化的P2P(它为你保留信息本身就是保留在某个中心区内的)。
        于是另一种通信方式提出了:P2P通信(peer to peer) 对等通信。 即:在p2p的网络中,所有网络节点都是同等地位,没有服务端和客户端之分(当然也可以本身即是服务端也是客户端),一个节点即是服务端也是客户端.
       例如:BT下载工具,在下载的同时,同时也为其他节点提供下载,通信模式如图:
P2P软件qq的通信原理 - itoedr - itoedr的it学苑
 图2 对等P2P网络充通讯简图(用户区的情况)
         即,客户端之间可以进行直接的通信,不需要在经过服务端的中转,从而提高网络传输速度和减小服务器压力,这是非常有用的。这种通信的好处,有了去中心化的思想。网络传输效率却还随这个网络应用的扩大自动提高了应用效率,这就是下一代双等网络的光明前景。
          对等网络通讯(p2p)的难点:P2P虽然通信模式非常理想,但是有一些问题需要解决。
   1.客户端通信之前,必须知晓接受端的公网IP和端口port;
   2.客户端的p2p通信数据包必须能够穿透NAT(network address translate) 网络地址翻译;  解决问题的办法可以是这样的.
    1)通过一台拥有公网IP的节点来记录在线客户端的公网IP和端口,所有客户端可以通过该节点读取接受客户端的IP和port;
    2)针对私有网络之间的通信,由于ip的匮乏,所以网络上不可能所有节点都位于同一个网段(即拥有公网IP),事实上,大部分的节点都处于常规网络的边缘,甚至在DNS所能查询的范围之外,所以在处于网络的边缘的节点不能直接通信的(因为NAT的缘故),图示一下:

P2P软件qq的通信原理 - itoedr - itoedr的it学苑 
图3 不同私网里的通讯对象分布模型


              图示说明: 为简捷,交换机取消,正常的环境都有交换机的。
           A公司的出口路由IP为211.10.1.1(公网IP),公司有2台主机ip分别为192.168.1.1和192.168.1.2
B公司的出口路由IP为211.10.1.2(公网IP),公司有2台主机ip分别为172.21.1.1和172.21.1.2
那么A公司的192.168.1.1主机与B公司的172.21.1.1在不同的网段,所以不能直接通信。 这时p2p出现了,正好解决这种问题,让两个在不同网段(私网)的主机可以直接通信!
 
           在分析通讯之首之前,现要介绍一个p2p通信的核心,网络间打洞(UDP).
注:socket也打洞,那是在本地机打洞与邻居通讯用的。
P2P软件qq的通信原理 - itoedr - itoedr的it学苑
  正如上图所列出的通信模式中,采用upd通信.
        公网主机211.10.1.2开启一个udp,端口为20000 A公司主机192.168.1.2同样开启一个udp,端口为10000;192.168.1.2发送一个数据包到211.12.1.2,数据报文包含:发送方:192.168.1.2:10000;接受方:211.10.1.2:20000 ; 当数据包经过A公司的出口路由时,路由上的NAT会修改数据包为: 发送方:211.10.1.1:随机端口(假设是30000);接受方:211.10.1.2:20000 ;(然后)同时在NAT wall上创建一个Session(洞): 该session包含192.168.1.2:10000 → 211.10.1.2:30000的关联。
即:在NAT上有了192.168.1.2:10000与211.10.1.2:30000的会话洞.

      所以在Server中收到的数据包,他看到的发送方是211.10.1.1:30000,(这也就是192.168.1.2:10000的公网ip.而Server发送的udp数据包,
       指定接受方为211.10.1.1:30000,因为在192.168.1.2有一个192.168.1.2:10000->211.10.1.1:30000的会话通道(通讯洞道),所以数据包能成功传递到192.168.1.2 所以在这里的session就是所说的在路由上打的洞(通信通道)。
           注:如果没有session洞的存在,那么路由进程接受到的数据包是只不请自来无头飞虫。
不被主动消灭,也会自任由其消失(网路上的报文只有在流动中才会有足够的生命周期). 但是这个session是有时效性的。具体的有效时间可以在路由上设定,但是最小值大概在100秒左右。
 所以为了保证能够正常通信,必须让这个session持续在路由器上存在,所以,192.168.1.2就必须定时与Server做心跳,通过心跳来保证session不失效!


 二、通用p2p软件通讯设计实例 下面通过一个p2p及时通信软件来说明. 有3个角色:2个client,1个server 2个client都处于网络的边缘(企业局域网内部) server处于公网,拥有公网IP. 注:此处所谓公网IP实际上只要满足一个通讯过程中所谓私网ip都可见的ip即可. 如下图:
P2P软件qq的通信原理 - itoedr - itoedr的it学苑
 
    在图中,server的作用只有一个,就是记录所有客户端的公网IP.
      1)client1登录后,链接server,server就能知道client1的公网IP,并记录client1;
      2) client2登录后,链接server,server就能知道client2的公网IP,并记录client2;
      当然在1)时client1就从server读取client2的公网IP(建立一个緩存记录在自己身边) ;
      在2)client2也做与client1同样的操作,读到了client1的公网ip(建立一个緩存记录在自己身边) ;
     3)在前两步工作后,clieint1和client2就都知道对方的公网IP.
     4) 接下来进行网络打洞(建立话通道).  
为了保证client1的路由器有与client2的session,
client1要定时与client2做心跳(可以发送一个空的数据包);
 同样,client2也要定时与client1做心跳;
这样,双方的通信通道就得以维系,都是通的,就可以进行任意的通信了。
(当然断掉的话,他们又支向服务器申请一次就可以了), P2P通信就建立(重建)了。

 三、关于QQ的p2p思路
上文中的client1与client2并没有完全地实现独立,他们都要通过对方与自己的代理出口公网ip设备来作为自己的应用代理网关帮助自己接收对方代理网关转发(nat)来的信息与转发自己发给对方的信息.
如果负责代理两个边际接口IP设备有其它想法,估计你的通讯就会产生其它故事了.
这时候我们就要P2P的加密机了. 现在的QQ具备了交流信息的回查功能,读者估计能想到,
QQserver也不只是帮助记录握手信息了,同时在收集你的谈话.

P2P软件qq的通信原理 - itoedr - itoedr的it学苑
这7天的漫游记录都来源那服务器的记录吧。对于qq而言,我们就可以确认,在某个中心是深度介入了的你我的p2p通信的。对于信息保密而言,我们还是可能被别监控的
 
下一主题是p2pvpn之间n2n思想。
  评论这张
 
阅读(545)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017