Peercast整体架构分析

来源:互联网 发布:php获取访问者真实ip 编辑:程序博客网 时间:2024/04/28 12:35

现在的P2P流媒体主要有两种架构:

1.基于树的架构。这是由流媒体的多播演化而来的,也就是播放同一频道的节点组成一棵树,提供广播的源节点为这棵树的根。每个节点可以为下层几个节点提供数据。但这种架构仍然会对上层的结点造成太大的负担,而且在节点动态加入和退出的情况下树不易维护。另外还存在传输延迟问题,所以树的高度不能太大。

2.基于图(MESH)的架构。通过邻居发现寻找相关的节点。这种架构可以实现完全非中心化。

Peercast采用的是基于图的架构。所有Peercast节点都在同一网络中,而且一个Peercast可以同时转播多个频道。由于Peercast集合了客户端和服务器功能,所以一个Peercast可以同时是广播者、转播者和收听者。

Peercast网络架构可分为三层。

第一层是YP。
YP(yp.peercast.org)从广播者中收集频道信息,是整个网络的根。

第二层是广播者。
广播者向YP发送频道信息,这样YP就能有一个完整的广播者的列表。

第三层是转播者
转播者收听频道,每个广播者维护一份转播者的列表。

P2P流媒体的运行模式
视频/音频输入+编码器+Peercast+播放器

视/音频输入:这是频道的来源,可以是实时事件(电视),也可以是文件(MP3/WMV)
编码器:用于将文件编码成更易于传输的流格式,可以是SHOUTcast DSP和windows media encoder等
播放器:播放编码后传输的文件

Peercast:根据其完成的功能可分为下列几个模块:
1.获取媒体数据:作为广播者读取编码器发送过来的流数据
2.用户界面:以GUI和网页方式提供控制
3.数据传送:在节点间传递控制信息和频道流具体数据
4.节点选择:选择要进行传输的最佳节点
5.缓冲管理:管理流缓冲以实现流媒体下载和播放
6.HTTP服务器。将流数据用HTTP方式送往播放器

节点的加入与退出:

当一个Peercast节点第一次加入Peercast网络时(点击yp.peercast.org中特定频道的PLAY按钮),例如访问地址是peercast://pls/EF49346D72FD05F234D3DA2C33FF3A9C?ip=61.213.94.129:2010 。它会先与广播这个电台的IP(61.213.94.129:2010)建立连接。由于这个广播者是不变的,所以至少会有一个特定的连接。如果广播者是满负荷的,那么这个节点可以通过这个广播者同其他转播同一电台的节点建立连接。
通常会建立8个连接。


在这点上是与Gnutella网络不同的,由于必定存在一个广播者,所以不必实现Gnutella中关于节点第一次加入网络的机制(GWebCache),而此时广播者相当于BT软件的一个原始种子。

与本节点转播同一频道的节点(也就是邻居)的信息保存在ChanHitList中,其中ChanHitList是一份ChanHit的链表,每个ChanHit保存一个相关结点的信息。Hit的意思是你想收听的频道的广播者或转播者。

拥塞控制:

当output队列超过50%时进入拥塞控制模式。系统丢弃一些incoming包,并根据包类型和跳树来给outgoing包区分优先值。当output队列降到25%时,系统会关闭拥塞控制模式。

转播时间更久的节点比刚开始转播的节点拥有更高的优先权,这体现在TTL上。刚开始转播的节点广播的包的TTL值为1,而这个TTL值每5分钟会递增1。这样转播时间超过35分钟的结点会有着最高的TTL值7。

节点间的通信:
节点间的通信通过发送和接收控制信息包来实现。Peercast专用协议PCP规定了控制信息包的类型和格式。
ServMgr负责分配、删除和使用servent对象,每个servent对象负责一个具体的连接,而其中包的发送、接收和解析工作由PCP Stream来实现。

传输者的选择:

在建立初始连接之后,节点需要选择一个最佳的节点来传输频道数据。
选择的顺序依次如下:
1.本地转播者
2.邻居转播者
3.本地广播者
4.邻居转播者

比如说如果找到邻居转播者就不用继续往下找,然后从其中选取出最佳的节点作为传输对象,其他作为备用传输者。
这个最佳可从以下三个方面来衡量:


如果这个传输者退出网络,那么必须重新按上次方法选择下一个传输者。
由于备用传输者较多,所以当节点动态退出网络时不会造成太大的影响。


缓冲机制:

流(stream):流在Peercast中是一个非常重要的概念。所谓流,就是字符串的集合。所以无论是包、视/音频数据都可以看做是一个流。

Peercast的缓冲机制是通过ChanPacketBuffer实现的,里面包含有多个ChanPacket,每个ChanPacket封装了实际的数据。

播放器的读取:

Peercast会自动调用默认播放器,而播放器读取由Peercast创建的HTTP内容,如播放URL为http://localhost:7144/stream/65051E037A7A2A3433090065051E037A.ogg


原创粉丝点击