发明内容
针对上述特点本发明主要提供一种利用p2p技术来实现“准实时视频”的解决方案。
本发明主要目的在于提供一种数据的调度方法,该方法能够降低p2p流媒体系统中各种复杂网络下客户端视频相对于源节点的延时波动,从而客户端的视频相对于流媒体源的延时始终保持在一个固定值左右小范围波动,同时客户端能够在网络带宽波动时自动调整视频质量,该方法还同时能够达到很好的负载均衡。
具体的技术方案是:一种p2p网络数据传输的方法,包括以下步骤:(1)普通节点在登录服务器后,从服务器上获得节点的网络类型;(1.1)普通节点向指定IP的服务器发送登录包;(1.2)服务器根据普通节点在登录包中填写的IP将其划入对应的网络分组;(1.3)服务器返回对应的网络分组标示给登录节点;(2)普通节点从p2p管理服务器上获得观看同一远程视频源的节点列表;(2.1)普通节点通过TCP方式通知管理服务器需要观看的视频源id;(2.2)管理服务器根据节点的网络分组,从当前登录的节点信息表中挑选出若干个质量比较好 的节点用TCP方式返回给请求节点;(3)普通节点遍历父节点列表,分别采用UDP方式进行NAT穿透测试;(3.1)节点A通过管理服务器传递自己的外网IP和PORT给父节点B;(3.2)父节点B收到该信息后也用同样的方式将自己的外网IP和PORT通知给请求节点A;(3.3)父节点B向请求节点A发送UDP包并持续一段时间;(3.4)请求节点A在收到父节点B的地址信息后立即向该地址发送UDP包并持续一段时间;(3.5)如果请求节点A接收到了父节点B发送过来的UDP包,则标记该父节点为UDP直连;(3.6)如果在持续时间内节点A没有收到父节点B的UDP包,则尝试用TCP方式连接;(3.7)如果请求节点A能够用TCP连接父节点B,则标记该父节点为TCP直连;(3.8)如果请求节点A尝试用TCP连接父节点B失败,则标记为不可连接;(3.9)多次尝试都不可连接的父节点,则标记为不再测试;等待被其他更好的父节点所替换;(4)普通节点接收到父节点通过“推”方式传输过来的帧信息;(4.1)如果父节点B可以通过UDP或者TCP方式与请求节点A直连,则首先判断请求节点A是否与B处于一个局域网,是则将该请求节点A添加在父节点B的子节点列表下;(4.2)如果请求节点A与父节点B不处于一个局域网,则父节点B需要判断当前自身的网络状况,如果网络不好,则拒绝连接;(4.3)如果请求节点A与父节点B不处于一个局域网,且父节点B判断当前自身的网络状况良好,则回送请求节点A连接响应消息;(4.4)只有在(3.3)成立的条件下,父节点B才将请求节点A列为自身的子节点;(4.5)父节点B通过UDP的方式向刚连接上的子节点发送帧初始化数据;(4.6)父节点B定时通过UDP的方式向子节点发送帧信息;(5)普通节点整理从父节点传输过来的帧信息;(5.1)普通节点根据父节点传输过来的帧信息更新本地帧信息;(6)遍历本地帧信息,选择最优的父节点“拉”帧数据;(6.1)普通节点定时遍历本地帧信息,从每一个帧信息对应的可用父节点列表中选择最优的父节点;(6.2)普通节点向该父节点请求具体的帧数据;(7)普通节点保存从父节点上获得的帧数据;(7.1)在本地缓存数据; (7.2)在有其他节点对该节点请求数据时,查出该帧数据,转发给对方。
上述p2p网络数据传输的方法,所述的节点单元包含:(1)节点P2P网络通信模块:用于节点间相互进行P2P通信;(2)节点TCP网络通信模块:用于节点间相互进行TCP通信;(3)节点的本地帧信息缓存:用于标示本节点拥有了哪些帧数据,对于那些为空的帧数据,也标示了它们可以从哪些父节点上获取;(4)节点的父节点列表:可以与节点连接的父节点列表;(5)节点的子节点列表:与节点相连并随时可能向该节点请求帧数据的其他节点;(6)节点的父节点择优模块:用于判断父节点中哪个具有最好的连接条件和最短的网络通信时间;作为“拉”数据的依据;(7)节点的子节点择优模块:用于剔除长时间无响应的子节点,为其他需要服务的子节点提供足够的带宽资源;作为“推”数据的依据;(8)节点的网络状况探测模块:用于探测节点的网络状况,并作为是否为其他节点提供服务的依据。
本发明的工作原理是:普通节点单纯采用请求驱动数据亦即“拉”的方式会受制于节点间的网络性能,在基于帧信息传输的模式下至少需要点对点四次才能完成一次完整的帧数据请求过程;而普通节点单纯采用“推”的方式会令父节点无差别的推送数据给连接上来的子节点,从而导致网络中出现大量的冗余数据,消耗宝贵的网络资源。前者存在通信的延时,后者存在带宽的浪费。而本发明的宗旨就在于综合这两者,做到在一定程度上均衡通信的实时性和带宽的占用率。
本发明通过对节点间交互数据的细分实现了“推”与“拉”的结合,亦即对时效敏感的数据采用“推”模式,对带宽敏感的数据采用“拉”模式。
该方案能够根据网络状况调整视频质量,同时做到客户端相对视频源延时在固定范围之内。
技术效果如图7,采用以上网络数据传输的方法,在网络上有100个节点时,平均延时在30毫秒以内,丢包率能控制在千分之五以内。
如图8,在网络上有500个节点时,平均延时在170毫秒以内,丢包率能控制在千分之八以内。
具体实施方式
下面以具体实施例对本发明作进一步的阐述,但实施例仅用于说明,并不限制发明的范围。
下面结合附图对本发明的方法和系统作详细描述:实施例1下面结合图1来说明节点间的通信时序:步骤s100:子节点需要首先从服务器上获得本节点A的外网和私网地址,然后将这些信息作为p2p_call发送给服务器,通过服务器将该信息转发给父节B;父节点B一旦接收到该信息,则回送p2p_call_ack,该信息里也包含父节点B的外网和私网地址。
步骤s110:父节点B在发送了p2p_call_ack之后,立即向子节点A发送udp Stum,该包中包含帧的初始化参数信息;而子节点A在接收到p2p_call_ack之后,也向父节点B发送udp stum;双方各向对方发送若干次,直到建立udp直连或连接超时为止。
步骤s120:如果父节点B与子节点A之间建立了直连,则此时B需要通过判定自身的网络状况决定是否将子节点A添加在子节点列表里;如果父节点B与子节点A不能通过udp直连,亦即udp直连过程超时,则双方都向对方发起tcp连接;若tcp连接成功,父节点B依然需要通过判定自身的网络状况决定是否将子节点A添加在子节点列表里,若不成功,则子节点A会标示在父节点列表中标示父节点B为不可达,并在下一个父节点优化周期到来的时候剔除该父节点。
步骤s130:子节点和父节点间可以通过ask_data命令相互请求对方的帧数据;并在请求发送后记录发送时间ts;节点在接收到data_ack时,除了将帧数据保存到本地帧缓存以外,还要记录接收时间te;并通过te-ts计算本次通信的rtt;作为以后父节点择优算法的关键参数。
步骤s140:父节点B定时将本地帧缓存里的数据保存状况推送给子节点列表里的每一个子节点。
如图2所示,普通节点的模块构成及数据流向具体为:p2p/tcp通信模块:位于结构的最底层,负责通过udp,tcp的方式收发命令和帧数据;D2表示在接收到帧数据时更新父节点列表中的rtt;D11表示在接收到帧信息和帧数据时保存到本地帧缓存模块;D13表示将除本地父节点外,来自其他节点的连接都视作子节点,添加入子节点列表,并对那些请求数据的子节更新请求时间信息。
父节点列表模块:维护本节点的父节点,D1表示需要通过p2p/tcp通信模块向每个父节点建立连接,直到连接成功或超时;D4表示在请求帧数据时需要通过父节点择优模块选择通信质量最高的父节点请求;D3表示将父节点列表中的rtt提供给网络状况探测模块。
本地帧信息及数据缓存:在本地缓存帧信息和帧数据,D10表示响应来自其他节点的数据请求,并通过p2p/tcp通信模块定时推送本地帧信息给每一个子节点。
父节点择优模块:D5表示通过计算父节点列表中每个节点的rtt,得到质量最优的作为请求数据的目的节点;或者得到质量最差的作为剔除的节点。
网络状况探测模块:D6表示将向子节点择优模块提供网络状况参数,作为该模块实施优化算法的关键依据。
子节点择优模块:从网络状况探测模块中获得关键的网络状况参数,并在此基础上筛选合适的子节点;并决定是否同意一个新入子节点的连接要求;D8表示是否对子节点进行添加或删除的判断。
子节点列表:维护本节点的子节点,该列表通过p2p/tcp通信模块初始化,D7表示向子节点择优模块提供每个子节点最新请求的时刻;D12表示为底层向各个子节点推送帧信息提供依据。
如图3所示,本地帧信息是一个环形数组,帧号min和帧号max定义了本地缓存的缓冲区大小,每一帧是N个小包的组合,每个小包包含一个标志用于指示该包是否在本地有数据;以及一个列表,用于指示哪些父节点拥有该数据。
如图4所示,普通节点的父节点择优模块流程步骤如下:步骤s400:将父节点列表中每个父节点的原始rtt保存到数组temp_rtt[i]中。
步骤s410:遍历节点的本地帧缓存,更新欲请求的数据帧号。
步骤s420:判断该帧号下的小包是否有数据,如果有跳转到s410;否则就得到该小包所指向的父节点数组a。
步骤s430:遍历数组temp_rtt,找到其中最小值min所对应的父节点a[j],作为请求该帧的目标父节点,并将该帧分配给父节点a[j]所指向的预请求列表。
步骤s440:将目标父节点对应的temp_rtt[min]累加上目标父节点a[j]的原始rtt,作为下一次判断rtt的依据。
步骤s450:释放临时数据temp_rtt[i],完成此次父节点选择优化流程。
步骤s460:从备份父节点列表bak_father中得到rtt最小的父节点bak_father[i]。
步骤s470:从当前父节点列表cur_father中得到rtt最大的父节点cur_father[j]。
步骤s480:从当前父节点列表中删除cur_father[j],添加bak_father[i],然后再在备份父节点列表中删除bak_father[i]。
步骤s490:通过p2p/tcp网络通信层访问服务器,从服务器获得若干备份父节点。
如图5所示,普通节点的子节点择优模块流程步骤如下:步骤s500:定时访问子节点列表中每个子节点的最近请求时间,若该时间与当前时间的间隔超过了自定义的t秒,则标记为可删除。
步骤s510:将子节点列表中所有标记为可删除的节点删除,删除之前要等待向该节点的推送过程完成。
如图6所示,普通节点的网络状况探测模块流程步骤如下:步骤s600:网络状况变量表示当前保持连接的父节点中连接效果不理想的父节点数量,该变量与父节点总数的比值在一定程度上可以描述该节点当前时刻的网络状况,如果该比值大于自定义的x,则返回调用者网络状况不理想的信息,以协助上层调用控制子节点的连接数量和发送频率。