CDN 支持流媒体协议,例如前面讲过的 RTMP 协议。
流媒体 CDN 的实现
多数情况下,CDN 相当于一个代理,从上一级缓存读取内容,然后转发给用户。
对于普通的静态资源(HTML、CSS、JavaScript、图片等小文件)来讲,内容的分发往往采取拉取的方式,当发现未命中的时候,再去上一级进行拉取。但是,流媒体(视频、音频等大文件)数据量大,如果出现回源,压力会比较大,所以往往采取主动推送的模式,将热点数据主动推送到边缘节点。具体而言,以直播为例,主播在开始直播时,就会将视频推送到就近 CDN 节点缓存,然后观众观看直播的时候,也会就近从 CDN 边缘节点拉取视频,如果该节点没有资源,会从其它 CDN 节点同步再返回给观众。看直播往往是有时延的,这个时延就是从主播端采集视频到观众端开始播放相应应视频的时间差。
对于流媒体来说,很多 CDN 还会提供预处理服务,即文件在分发之前,经过一定的处理。例如将视频转换为不同的码流,以适应不同的网络带宽的用户需求;再如对视频进行分片,降低存储压力,也使得客户端可以选择使用不同的码率加载不同的分片(对客户端而言就是标清、高清、超清等不同的清晰度)。
以七牛云提供的 CDN 解决方案为例,基本上涵盖上面提到的点:
当然,对直播而言,基本原理差不多,但技术方案要更加复杂一些,以保证首播时间和卡顿率,所以一般云服务提供商会专门提供针对直播场景的解决方案。
防盗链问题
对于流媒体 CDN 来讲,有个关键的问题是防盗链问题。因为视频是要花大价钱买版权的,为了挣点钱,收点广告费,如果流媒体被其他的网站盗走,在人家的网站播放,那损失可就大了。
最常用也最简单的方法就是 HTTP 头的 Referer 字段,当浏览器发送请求的时候,一般会带上 Referer,告诉服务器是从哪个页面链接过来的,如果不是来自本站,就阻止访问或者跳到其它链接,比如以学院在使用的七牛云 CDN 为例,Referer 防盗链配置界面如下:
Referer 的机制相对比较容易破解,所以还需要配合其他的机制。一种常用的机制是时间戳防盗链,使用 CDN 的管理员可以在配置界面上,和 CDN 厂商约定一个加密字符串(KEY):
客户端取出当前的时间戳,要访问的资源及其路径,连同加密字符串通过签名算法得到一个字符串,然后生成一个下载链接,带上这个签名字符串和截止时间戳去访问 CDN。
在 CDN 服务端,根据取出的过期时间,和当前 CDN 节点时间进行比较,确认请求是否过期。然后 CDN 服务端有了资源及路径,时间戳,以及约定的加密字符串,根据相同的签名算法计算签名,如果匹配则一致,访问合法,才会将资源返回给客户。
除此之外,还有一些其它的防盗链方式: