视频P2P的应用

1 P2P技术原理
P2P应用软件主要有:文件分发软件,如BitTorrent、eMule;语音服务软件,如Skype[6];流媒体软件,如PPLive。目前P2P应用并没有统一的网络协议标准,种类多、形式多样,其体系结构和组织形式也在不断发展。

1.1 P2P的体系结构
P2P应用按照它的体系结构,可以分成3代,如图1所示。

第1代P2P应用的是集中控制;第2代P2P是一种完全的无中心的分布式网络;第3代P2P是一种混合式的体系结构,同时具备前两代体系结构高效性和容错性的优点。

1.2 P2P网络的组织结构
P2P网络的组织结构是P2P体系结构的具体实现。P2P网络在本质上是无结构,无集中控制的分布式系统,节点通过自组织的Overlay网络(覆盖层网络)来实现文件分发、流媒体以及语音等服务。Overlay网络的组织方式可以分为有结构和无结构两种[7]。有结构的P2P Overly网络是指Overlay的网络拓扑相对固定,内容的存放也相对有序。有结构的P2P Overly网络通常使用分布式哈希表(DHT)来实现,文件存放的位置由文件的唯一标识符决定。无结构的Overlay网络通过一些松散的规则组织在一起,其文件的存放也表现出很大随机性。

1.2.1 有结构的Overlay网络
有结构的Overlay网络也有很多种不同的实现方法,比较著名的有结构的Overlay网络包括Chord[8]、CAN[9]、Pastry[10]、eCAN[11],下面对Chord的工作原理进行简单介绍。
Chord的原理如下:

节点在逻辑上按照标识的大小组成一个环,数据同样有标识并且存放在和自己标识最近的节点上。当在某一个节点上输入查询请求的时候,如果节点的标识小于数据的标识,则向该节点知道的下一个节点请求文件,下一个节点如果拥有该文件则返回结果,否则按前面的方式继续转发给下一个节点。其中每个Chord节点只需要知道关于部分节点和到达它们的路由信息。Chord路由查找过程有两个重要特性:每个节点都只需要知道一部分节点的信息,而且离它越近的节点,它就知道越多的关于它们上面的数据信息;每个节点的路由表只有部分节点的路由信息并且不能确定任意一个关键字的确切位置,只能知道下一跳的节点。图2所示为Chord节点维护的指针表,其中N 4代表第4个节点。

1.2.2 无结构的Overlay网络
典型的无结构的Overlay网络如Freenet[12]、Gnutella[13]、FastTrack[14]、KaZaA[15],下面简单介绍一下Gnutella的工作原理。

Gnutella是一种非集中控制的协议,Gnutella被广泛使用并且有很多新的改进。Gnutella的特别之处在于它的分布式的文件定位和响应方法,图3所示为Gnutella文件的定位方法。由于数据的查询不依赖于任何有结构的拓扑结构,其查询的方式只能把请求广播到所有邻近的节点(Peer),相应节点响应消息,之后下载所需的文件。这种网络的突出优势在于良好的健壮性和可扩展性,明显的缺点在于会带来很大的查询消耗。一个节点想要加入Gnutella的网络,首先连接一些全局的可以连接的节点,一旦建立连接,节点以广播的方式通告给其他的存在。开始每一个消息被赋予一个唯一的随机产生的标识,其他节点记录到该节点的路由信息,用来防止重新广播和后向传播。广播消息通过生存时间(TTL)和经过的跳数来控制消息泛洪的范围。节点之间通过周期性的类似Ping机制的消息维护彼此的连接,每个节点建立的连接都根据本地信息来选择。最新的Gnutella引入了超级节点的概念用来提高路由查找的效率。但是由于网络本身的自组织特性使得这种超级节点的部署优势不能充分的发挥。


2 P2P流量特性
据统计,P2P应用已占运营商业务总量的60%~80%,已经成为网络带宽的最大消费者,对底层网络造成了巨大的影响。

2.1 P2P流量产生的影响
P2P网络的发展首先对于个人用户接入网络的性能提出了更高的要求。由于P2P流量特征具有上下行流量对称的特性,这使得直接面向用户的接入网络需要相应提高所能承载上行流量的能力。对大型的企业用户,其关注目标是网络的可控性以及安全性。P2P相对随机的端口号,使得企业难以对内部的网络实行有效地监测和管理,加大了日常维护的难度。对于ISP,P2P应用的影响不仅增加了网络升级的难度,同时也将降低了网络的总体性能以及P2P本身的服务质量。用户可以选择高带宽接入以正常使用各种P2P应用,企业用户可以通过谨慎的企业内部安全规范的制订来保证网络的正常使用,而ISP成为P2P应用产生流量的最终承担者,设备升级速度加大,维护费用升高。有效识别和管理网络中的P2P流量成为ISP最为关心的问题。

2.2 P2P流量特性
P2P的流量呈现出与传统流量不同的特性,P2P应用所产生的流量具有分布非均衡的特性、上下行流量的对称特性、流量的隐蔽性、数据集中性等。

P2P流量的分布具有明显的非均衡特性,在网络中,大部分节点的数据流量都是从为数很少的一些节点获取。文献[16]对该流量分布的非均衡性做了比较详细的研究。文章认为,P2P中服务提供者的价值不应该只以高的链路带宽来刻画,还应考虑节点的可用时间。在实验结果中,系统只有20%的主机拥有93%以上的实际在线时间。不到20%的P2P节点拥有80%以上的P2P网络在线时间。而正是这些少数的长时间在线主机贡献了网络中的主要流量。文献[17]中的研究结果表明,研究者可通过仅仅监测网络中1%的节点来达到了解整个P2P网络中80%以上流量的目的。

P2P流量还表现出上下行流量的对称性。在文献[16]中对上下行流量的对称特性进行了详细的研究,通过对P2P上下行流量比较得出结论,具有高带宽的用户通常会以更长的时间为其他的节点提供下载服务,上下行对称流量已经成为P2P网络流量区别于其他流量的主要特征。

P2P流量还具备很强的隐蔽的特性,它们通常使用随机端口或用户自定义端口,无法通过简单的端口识别P2P流量,目前常用的方法是通过特征码检测的方式识别P2P流量。P2P应用的特征码处在不断变化之中,加深了P2P流量的这种隐蔽特性。此外,对P2P节点之间传输文件的研究中发现,80%以上的P2P流量都是在不断地重复传播几个用户乐于获取的热点文件,这种热点文件的存在影响了P2P网络中的传输效率,针对P2P网络传输数据的高集中性,研究者提出了一系列包括文件缓存在内的解决方案。P2P数据的集中性,已经成为网络服务提供商控制P2P域间流量以及提高P2P服务质量的基本理论依据。

3 典型P2P应用的机制分析
分析典型的P2P应用机制可以深入了解P2P的原理。本节将对文件分发、流媒体应用、语音服务3个领域中具有代表性的软件机制进行详细的分析。对于这些软件的分析有助于理解P2P技术的原理和把握P2P技术未来发展的趋势。

3.1 BitTorrent
BitTorrent软件用户首先从Web服务器上获得下载文件的种子文件,种子文件中包含下载文件名及数据部分的哈希值,还包含一个或者多个的索引(Tracker)服务器地址。它的工作过程如下:客户端向索引服务器发一个超文本传输协议(HTTP)的GET请求,并把它自己的私有信息和下载文件的哈希值放在GET的参数中;索引服务器根据请求的哈希值查找内部的数据字典,随机地返回正在下载该文件的一组节点,客户端连接这些节点,下载需要的文件片段。因此可以将索引服务器的文件下载过程简单地分成两个部分:与索引服务器通信的HTTP,与其他客户端通信并传输数据的协议,我们称为BitTorrent对等协议。BitTorrent软件的工作原理如图4所示。BitTorrent协议也处在不断变化中,可以通过数据报协议(UDP)和DHT的方法获得可用的传输节点信息,而不是仅仅通过原有的HTTP,这种方法使得BitTorrent应用更加灵活,提高BitTorrent用户的下载体验。

3.2 eMule
eMule软件基于eDonkey协议改进后的协议,同时兼容eDonkey协议。每个eMule客户端都预先设置好了一个服务器列表和一个本地共享文件列表,客户端通过TCP连接到eMule服务器进行登录,得到想要的文件的信息以及可用的客户端的信息。一个客户端可以从多个其他的EMule客户端下载同一个文件,并从不同的客户端取得不同的数据片段。eMule同时扩展了eDonkey的能力,允许客户端之间互相交换关于服务器、其他客户端和文件的信息。eMule服务器不保存任何文件,它只是文件位置信息的中心索引。eMule客户端一启动就会自动使用传输控制协议(TCP)连接到eMule服务器上。服务器给客户端提供一个客户端标识(ID),它仅在客户端服务器连接的生命周期内有效。连接建立后,客户端把其共享的文件列表发送给服务器。服务器将这个列表保存在内部数据库内。eMule客户端也会发送请求下载列表。连接建立以后,eMule服务器给客户端返回一个列表,包括哪些客户端可以提供请求文件的下载。然后,客户端再和它们主动建立连接下载文件。图5所示为eMule的工作原理。


eMule基本原理与BitTorrent类似,客户端通过索引服务器获得文件下载信息。eMule同时允许客户端之间传递服务器信息,BitTorrent只能通过索引服务器或者DHT获得。eMule共享的是整个文件目录,而BitTorrent只共享下载任务,这使得BitTorrent更适合分发热门文件,eMule倾向于一般热门文件的下载。

3.3 迅雷
迅雷是一款新型的基于多资源多线程技术的下载软件,迅雷拥有比目前用户常用的下载软件快7~10倍的下载速度。迅雷的技术主要分成两个部分,一部分是对现有Internet下载资源的搜索和整合,将现有Internet上的下载资源进行校验,将相同校验值的统一资源定位(URL)信息进行聚合。当用户点击某个下载连接时,迅雷服务器按照一定的策略返回该URL信息所在聚合的子集,并将该用户的信息返回给迅雷服务器。另一部分是迅雷客户端通过多资源多线程下载所需要的文件,提高下载速率。迅雷高速稳定下载的根本原因在于同时整合多个稳定服务器的资源实现多资源多线程的数据传输。多资源多线程技术使得迅雷在不降低用户体验的前提下,对服务器资源进行均衡,有效降低了服务器负载。

每个用户在网上下载的文件都会在迅雷的服务器中进行数据记录,如有其他用户再下载同样的文件,迅雷的服务器会在它的数据库中搜索曾经下载过这些文件的用户,服务器再连接这些用户,通过用户已下载文件中的记录进行判断,如用户下载文件中仍存在此文件(文件如改名或改变保存位置则无效),用户将在不知不觉中扮演下载中间服务角色,上传文件。

3.4 PPLive
PPLive软件的工作机制和BitTorrent十分类似,PPLive将视频文件分成大小相等的片段,第三方提供播放的视频源,用户启矾PPLive以后,从PPLive服务器获得频道的列表,用户点击感兴趣的频道,然后从其他节点获得数据文件,使用流媒体实时传输协议(RTP)和实时传输控制协议(RTCP)进行数据的传输和控制。将数据下载到本地主机后,开放本地端口作为视频服务器,PPLive的客户端播放器连接此端口,任何同一个局域网内的用户都可以通过连接这个地址收看到点播的节目。图6所示为PPLive的工作原理示意图。

3.5 Skype
Skype是网络语音沟通工具。它可以提供免费高清晰的语音对话,也可以用来拨打国内国际长途,还具备即时通讯所需的其他功能,比如文件传输、文字聊天等。Skype是在KaZaA的基础上开发的,就像KaZaA一样,Skype本身也是基于覆盖层的P2P网络,在它里面有两种类型的节点:普通节点和超级节点。普通节点是能传输语音和消息的一个功能实体;超级节点则类似于普通节点的网络网关,所有的普通节点必须与超级节点连接,并向Skype的登陆服务器注册它自己来加入Skype网络。Skype的登陆服务器上存有用户名和密码,并且授权特定的用户加入Skype网络,图7所示为Skype的体系结构[18]。


Skype的另一个突出特点就是能够穿越地址转换设备和防火墙。Skype能够在最小传输带宽32 kb/s的网络上提供高质量的语音。Skype是使用P2P语音服务的代表。由于其具有超清晰语音质量、极强的穿透防火墙能力、免费多方通话以及高保密性等优点,成为互联网上使用最多的P2P应用之一。

4 P2P未来发展和展望
P2P技术不断地改变着互联网,用户无疑是P2P技术的最大受益者。在P2P技术的发展道路上,仍然有许多尚待解决的问题。

版权问题一直是P2P发展的一个不确定因素,如何在技术层面支持合法文件的分发是需要解决的重要问题。安全问题也是P2P领域的重要研究课题,如何在P2P网络中实现数据存取安全、路由安全、用户身份认证和身份管理都需要进一步研究。如果能够实现P2P应用之间的统一资源定位,统一路由,使得P2P技术有一个统一开发标准,将能够融合P2P技术,提升整体性能。

如何有效管理P2P应用所带来的巨大流量是网络运营商面对的重大课题,如何通过缓存或者流量工程的方法,减少P2P流量对网络本身的影响,同时利用P2P技术优化网络性能,比如,将P2P覆盖网络路由的优点引入到传统的网络路由中,可以实现更好的负载均衡,并利用P2P技术提供流媒体等新的增值服务。实际上,P2P技术的发展为运营商提供了可以在低成本的条件下提供更好服务的可能途径。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 架构说明 目前的协议有如下一些特点: 1) 客户向服务器发送请求, 每个请求的长度不定. 请求的长度在第一个INT指定. 2) 每个服务器通常会向多种客户提供服务, 例如, TS要同时向CP, NP提供服务, CP要向NP和其他CP提供服务, 同时还是其他CP, TS, SP的客户. 3) 每个服务器为客户服务时, 通常是长期的, 会涉及多次请求-应答的来回. 这样的结构, 主要是为了能够支持大量并发客户连接而设计的. 在具有大量并发客户 连接时, 无论采用线程还是进程, 都无法进行有效的服务, 因此必须采用select 轮询方式. 2. 基本数据结构说明 对于每个客户端, 需要保存该客户端相应的一些信息. 目前的CPnew.c, SPnew.c 和TSnew.c的核心数据结构基本相同, 都由Session, SessionCluster (TSnew.c) 或者 ServerDesc (CPnew.c和SPnew.c)构成. 其, Session是每个客户端相关的数据, SessionCluster(或者是ServerDesc)是 有关每种服务的信息, 其有一个指向该服务相关的各个Session的指针. Session 这一数据结构不是在有客户请求时动态分配的, 而是在最开始初始化时就已经分配 好的, 当有新客户请求到来时, 服务器搜索这一预先分配好的这些Session, 发现其 有空闲则使用, 如果没有空闲就报告错误. 对于TS和CP(SP)来说, 最大的区别是TS使用UDP协议, 而CP和SP则使用TCP协议, 二者的 不同在于: 1) 对于TCP协议的客户端, 由于每个客户端都使用不同的socket, 因此select之后 只需要看各个客户端的fd_set是否置位就可以了, 而对于UDP客户端, 找到相应的 客户端需要进行一次查找过程. TS使用了一些措施来减轻查找所带来的开销. 2) TCP协议, 发来得数据是流形式的, 因此需要进行消息分块, 有可能两个消息 在一次read读完, 也有可能一个消息需要读很多次, 这两种情况都需要考虑, 因此 每个Session都有一个buf, rstart, rlen, 用来存储读来但还没有处理的消息, 同样, 写的过程也需要考虑写的时候有可能没有一次写完, 因此也需要每个Session 保留wbuf, wstart, wlen三项. UDP则不同, 在协议实现假设每个UDP数据包 所包含的消息都是完整的, 因此没有这几项. SessionCluster(或者是ServerDesc)来说, 描述了一个服务, 这个服务由这样几个 主要的部分构成 1) sock: 描述所所使用的socket 2) cur: 当前客户端的个数 3) max: 最多容纳客户端的个数 4) head: Session的头, head[0]为第一个Session, head[max-1]为最后一个session 5) init: 这一服务每个Session需要执行的初始化操作. (函数指针) 6) process: 这一服务消息的处理函数 7) closure: 这一服务需要的析构函数 3. 主要结构说明 process_child: 主要函数, 这一函数主要用来 设置socks和wsocks, 对于SP和CP, 只有Session的wlen>0的时候才设置wsocks; select; 对于每个ServerDesc(或者SessionCluster), 进行process_type 在SP和CP, 为了支持PUSHLIST操作, 在每一次循环前先要进行processJob 在CP, 还周期进行periodCheck, 用来将过期的连结清除 在TS, 周期进行periodLog, 用来将过期的客户连接清除 process_type: 对于每个Session, 检查是否可读. 如果可读, 检查是否有完整的消息, *(unsigned int *)(rbuf+rstart) 0, 则进行写 4. 其他重要的模块 1) 配置模块 配置模块主要由struct NamVal, read_config, free_config组成, NamVal结构, Name是在cfg文件的名字, ptr是指向存放的指针, type是数据的类型, 目前支持这样 几种类型 'd': 整数类型, ptr是一个整数指针 's': 字符串类型, ptr是一个指向指针的指针, (char **) 'b': 字符串buffer类型, ptr是一个char *, 使用这种类型时应当注意, 对于's'类型, read_config将为该val分配内存(malloc), 但是对于'b' 类型, ptr所指向的必须是已经 分配好的内存 两个重要的函数分别为: read_config, 参数为文件名, 一个struct NamVal *, 以及该struct NamVal的项数 free_config, 参数为和read_config相同的struct NamVal *以及项数 2) mysql 模块 mysql模块主要有MYSQL *local_mysql以及三个函数构成, 这三个函数是 init_mysql, 初始化mysql, 返回一个MYSQL *, 一般用来初始化local_mysql query_mysql, 执行一个mysql语句, 格式为query_mysql (local_mysql, "mysql语句, 其格式和printf的格式相同, 例如delete from %s等", 所需要的值) query_mysql_select, 执行一个mysql的select语句, 与上面不同的是, 它返回一个 MYSQL_RES *. 3) network排序模块 这一模块主要由networks结构, readNETBLOCK函数, getnetwork函数, compareNet函数 构成, 其, readNETBLOCK用来读入network配置文件, 初始化全局变量NETBLOCKS, NETBLOCKS是一个 networks结构数组, 有MAX_NET项. getnetowrk用来查找和一个IP地址最接近的netblock compareNet是在qsort用到的一个函数, 对找到的NPPeer进行排序, 让同一个网络 的NPPeer排在前面. 4) 图管理 在目前的CP, SP, NP, CP可以同时加入多个频道, 而NP也可以有多个资源, 为了描述 这种结构, 引入了图的概念. 每个边(Edge)存储了指向NP的指针, 指向Channel的指针, 在TS还需要存储这一Session在这一Channel的各个Interval. 每个Channel通过Edge 的cnext串成一个链表, 这个链表的头是Channel结构的PeerHead, 而每个Session 通过Edge的enext也串成一个链表, 这个链表的头是Session结构的header. 相关的函数有: newEdge: 新添一个边, 参数为Channel *, Session *, 对于TS还需要一个ChannelInfo来 初始化Edge的信息 delEdge: 删除一个边, 参数为Edge * 5) Channel模块 Channel模块的功能主要是: TS用来处理NEED_PEERS, SP还需要保存和查找频道数据, 频道都使用图结构进行管理. 频道的搜索为了效率方面的因素, 采用了Hash进行搜索, ChannelHash使用的是字符串 hash, 如hash_str所示. TS的Channel相对较为简单, SP和CPChannel还需要管理Channel相关的数据. 这些 数据以文件的形式存在硬盘上/var/tmp/目录下, 文件名随机生成, 对于每一块的相关信息, 由BlockData来保存, BlockData的firstsampl, message_size, message_id, offset分别 存储了firstsample信息, 快的长度, 块的id, 以及在文件的offset. SP和CP的处理有所不同, 对于CP, 块是以hash的方式来存放的, 例如, 块的ID为1000, 而 max_queue为100, 则存储位置为1000%100=0. 对于SP, 如果资源是一个CS发来的频道, 则是一个循环队列, 每一块按照次序分别存放在相应位置, 如果到了队列尾部, 就再从 队列头开始. 如果资源是文件, 就不保存BlockData信息, 直接根据blockID到原文件定位. 涉及Channel的函数有很多, 如locate_by_id, locate_order_by_id, newChannel, freeChannel, saveBlock等. 6) Berkeley DB模块 这只在SP涉及, 主要是打开DB文件, 查询某个md5的位置. 主要涉及到DB* MediaDB, openDB, openMedia这两个函数 openDB: 参数为DB文件的名 openMedia: 参数为md5和一个整数指针, 返回FILE *以及该文件的长度, 在整数指针 7) Job模块 Job模块用在CP和SP, 用来处理PUSHLIST, PUSHLIST消息可以重新设置Job的列表, 也可以添加Job或者是删除Job. 涉及到job.c的函数和JobDes结构. JobDes结构 一个Session *, 一个Channel *用于标识该Job所属的Session和Channel, num表示 所需要下载的BlockID数, job是一个指向整数的指针, mask也是一个指向整数的指针, job 是需要下载的BlockID, 如果mask为0,则需要进行下载, 如果为1, 则不需要. addJob: 添加job的时候, 不检查该Job是否已经在列表, 直接生成一个Job然后 添加到链表. deleteJob: 删除Job时, 检查所有Job列表的具有相同Session和Channel的Job, 然后将需要删除的blockID的相应mask设置为1. processJob: 对于每个job, 从cur开始, 利用process_P2P_REQUEST_real来传输 第一个mask为0的块, 如果都为1, 就删除这个job. freeJob: 删除某个JobDes. freeJobList: 删除某个Session的所有JobDes, 通常用于该Session退出时使用. 8) Interval模块 Interval模块用在TS, 用来表示NP上面所有的快区间, 目前块区间由一个开始 字段和一个长度字段来标识. 对于Interval的主要操作是merge和delete, merge 是将原有的Interval和新的Interval列表合在一齐, 而delete则是从原有的当 去掉新的. merge: 算法如下, 使用了缓冲Interval列表tmp. if (old < new[j]) tmp[k] = old; else tmp[k] = new[j]; 然后再看old和new哪些能够可以和tmp[k]合并 delete: 较为复杂一些, 考虑下面几种情况 old的开始比new[j]的结束大 old的结束在new[j]的开始前 old和new[j]有共同部分, 而且 old含在new[j] new[j]含在old 互不包含, new[j] 在前 互不包含, old 在前 5. 一些快速算法 1) 在使用UDP的TS, 在客户初次登录时, 需要查找空闲的Session, 此外, 客户有可能 会重复发送LOGIN消息, 这时需要检查这一客户端是否已经在Session列表, 第三, 当 客户端发送消息时, 需要找到相应的Session. 为了避免这些查询, 分别使用了如下方法. 首先, 建立一个Hash表, 开始的时候所有空闲Session都串到Hash[0]处, 每当来一个 新的客户端时,从Hash[0]取出Session, 链到相应的hashid上. 为此, hash所得的值 不能为0, 如果为0, 就返回最大的可能hashid. 根据来源端口和IP地址查询Session也使用这一Hash表. 客户端发送消息时, 使用了用于验证的7个字节的前3字节, 用这3字节来标识Session 的下标, 这样就避免了查询开销. 2) 使用maxid来减少搜索次数. 在TCP没有使用Hash, 使用了maxid这一项, 用来记录Session最大的id, 由于在Session 初始化的时候, 是查找ID最小的空闲Session, 因此可以认为Session是比较紧凑的, 由于SP和CP支持的客户端要比TS少得多, 因此这样的处理是可以接受的. 在客户退出的时候, 有可能需要更新maxid, 这一更新是由Clientclosure来完成的, Clientclosure更新maxid, 然后再调用相应的析构函数. 3) 长期idle的连接的超时处理. 由于超时处理需要遍历整个列表, 为了节约系统资源, IDLE时间比较长, 此外, 一般还需要定期报告系统统计数字, 因此需要及时性. 为此, 一般periodLog或者periodCheck都判断是执行这两者的哪一种操作. 4) 查询CPPeer时, 考虑到目前只支持GCP, 因此直接采用了GCPCHOICE,设置为当前 负载最小的GCP, 在GCP报告或者是GCP登录, 退出的时候更新. 6. 消息处理 1) TS消息处理 NP2TS_LOGIN: NP向TS登录, 按照来源IP地址和所报告的npport进行hash, 如果距离上次 发送NP2TS_LOGIN消息的时间小于SILENCE_TIME, 则直接返回, 否则发送WELCOME消息. NP2TS_REPORT: 报告Interval信息, 如果refresh为true, 则重置, 否则则先增加后删除. NP2TS_NEED_PEERS: 查询Peer信息, 使用findCPPeer寻找合适的CP, 使用findNPPeers 寻找合适的NP. NP寻找时, 找到结果后按照networks来排序, 保证在同一个网络的 排在前面. NP2TS_LOGOUT: 退出 NP2TS_RES_LIST:发送当前NP的所有RESOURCE, 使用addSession来进行处理, 如果还没有这 条边, 就添加 NP2TS_REQ_RES: 添加RES, 并返回Peers NP2TS_DEL_RES: 删除RES CP2TS_REGISTER: 登录, CP向TS登录, 按照来源IP地址和所报告的npport进行hash, 如果距离上次发送CP2TS_REGISTER⒌氖奔湫∮赟ILENCE_TIME, 则直接返回, 否则发送 WELCOME消息. CP2TS_UPDATE: 报告CP负载 CP2TS_NEED_PEERS: ECP查询用, 目前尚未使用 2) SP消息处理 P2P_HELLO: 加入某个频道, 如果频道存在 如果是个Media文件: 返回SPUPDATE, 表明这一频道的最小最大blockID 否则: 如果这一频道已经结束, 返回结束信息 如果频道不存在 如果是个Media文件: 返回SPUPDATE, 表明这一频道的最小最大blockID, 建立频道 否则: 返回一个SPUPDATE指示错误 P2P_PUSHLIST: 重置或者是增加删除任务列表. 重置时, 先删除所有的相关任务, 然后 再增加或删除. CS2SP_REGISTER: 建立频道 CS2SP_UPDATE: 更新频道信息 CS2SP_BLOCK: 发送数据块 3) CP消息处理 P2P_HELLO: 加入某个频道, 根据提供的SP地址来建立相应连接 P2P_PUSHLIST: 重置或者是增加删除任务列表 P2P_SPUPDATE: SP发来的SPUPDATE, 如果是Media文件, 则不转发给NP P2P_RESPONSE: SP发来的数据块. 此外CP还需要向TS注册. 目前只有GCP一种类型在使用.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值