CDN内容分发系统

CDN 分发系统的架构。CDN 系统的缓存,也是一层一层的,能不访问后端真正的源,就不打扰它。

在没有 CDN 的情况下,用户向浏览器输入 www.web.com 这个域名,客户端访问本地 DNS 服务器的时候,如果本地 DNS 服务器有缓存,则返回网站的地址;如果没有,递归查询到网站的权威 DNS 服务器,这个权威 DNS 服务器是负责 web.com 的,它会返回网站的 IP 地址。本地 DNS 服务器缓存下 IP 地址,将 IP 地址返回,然后客户端直接访问这个 IP 地址,就访问到了这个网站。

有了 CDN 之后,情况发生了变化。在 web.com 这个权威 DNS 服务器上,会设置一个 CNAME 别名,指向另外一个域名 www.web.cdn.com,返回给本地 DNS 服务器。

当本地 DNS 服务器拿到这个新的域名时,需要继续解析这个新的域名。这个时候,再访问的就不是 web.com 的权威 DNS 服务器了,而是 web.cdn.com 的权威 DNS 服务器,这是 CDN 自己的权威 DNS 服务器。在这个服务器上,还是会设置一个 CNAME,指向另外一个域名,也即 CDN 网络的全局负载均衡器。

本地 DNS 服务器去请求 CDN 的全局负载均衡器解析域名,全局负载均衡器会为用户选择一台合适的缓存服务器提供服务,选择的依据包括:

  • 根据用户 IP 地址,判断哪一台服务器距用户最近;
  • 用户所处的运营商;
  • 根据用户所请求的 URL 中携带的内容名称,判断哪一台服务器上有用户所需的内容;
  • 查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。

基于以上这些条件,进行综合分析之后,全局负载均衡器会返回一台缓存服务器的 IP 地址。

对于流媒体 CDN 来讲,有个关键的问题是防盗链问题。因为视频是要花大价钱买版权的,为了挣点钱,收点广告费,如果流媒体被其他的网站盗走,在人家的网站播放,那损失可就大了。

最常用也最简单的方法就是 HTTP 头的 referer 字段, 当浏览器发送请求的时候,一般会带上 referer,告诉服务器是从哪个页面链接过来的,服务器基于此可以获得一些信息用于处理。如果 refer 信息不是来自本站,就阻止访问或者跳到其它链接。

referer 的机制相对比较容易破解,所以还需要配合其他的机制。一种常用的机制是时间戳防盗链。使用 CDN 的管理员可以在配置界面上,和 CDN 厂商约定一个加密字符串。客户端取出当前的时间戳,要访问的资源及其路径,连同加密字符串进行签名算法得到一个字符串,然后生成一个下载链接,带上这个签名字符串和截止时间戳去访问 CDN。在 CDN 服务端,根据取出过期时间,和当前 CDN 节点时间进行比较,确认请求是否过期。然后 CDN 服务端有了资源及路径,时间戳,以及约定的加密字符串,根据相同的签名算法计算签名,如果匹配则一致,访问合法,才会将资源返回给客户。

动态 CDN,主要有两种模式。

  • 一种为生鲜超市模式,也即边缘计算的模式。既然数据是动态生成的,所以数据的逻辑计算和存储,也相应的放在边缘的节点。其中定时从源数据那里同步存储的数据,然后在边缘进行计算得到结果。就像对生鲜的烹饪是动态的,没办法事先做好缓存,因而将生鲜超市放在你家旁边,既能够送货上门,也能够现场烹饪,也是边缘计算的一种体现。
  • 另一种是冷链运输模式,也即路径优化的模式。数据不是在边缘计算生成的,而是在源站生成的,但是数据的下发则可以通过 CDN 的网络,对路径进行优化。因为 CDN 节点较多,能够找到离源站很近的边缘节点,也能找到离用户很近的边缘节点。中间的链路完全由 CDN 来规划,选择一个更加可靠的路径,使用类似专线的方式进行访问。

此文章为9月Day20学习笔记,内容来源于极客时间《趣谈网络协议》,推荐该课程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/83886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSCode 安装使用教程 环境安装配置 保姆级教程

一个好用的 IDE 不仅能提升我们的开发效率,还能让我们保持愉悦的心情,这样才是非常 Nice 的状态 ^_^ 那么,什么是 IDE 呢 ? what IDE(Integrated Development Environment,集成开发环境)是含代码…

获取spring容器中的bean实例

在开发过程中,我们可能需要动态获取spring容器中的某个bean的实例,此时我们就会用到ApplicationContext spring应用上下文,这里做一下记录,网上很多类似的的工具类。 先写好工具类再测试一下是否好用 工具类: packag…

keytool工具生成JKS证书

生成证书 使用jdk keytool生成证书 自建证书不受CA信任,仅适合学习使用,如果需要用到服务中,建议使用由CA颁发的可信证书。如果仅是内部使用,也可以安装自己生成的证书到本机。 生成证书 keytool -genkey -alias jwt -keyalg RS…

Rust踩雷笔记(7)——两个链表题例子初识裸指针

目录 leetcode 234leetcode 19 leetcode 234 题目在这https://leetcode.cn/problems/palindrome-linked-list/,leetcode 234的回文链表,思路很简单,就是fast和slow两个指针,fast一次移动两个、slow一次一个,最后slow指…

docker系列-报错以及解决指南

1. windows运行docker报错Windows Hypervisor is not presentDocker Desktop is unable to detect a Hypervisor.Hardware assisted virtualization and data execution protection must be enabled in the BIOS. Docker Desktop - Windows Hypervisor is not presentDocker D…

java集合之迭代器遍历元素

集合遍历 遍历、迭代、逐个获取容器中的元素 Iterable接口 实现了Iterable接口的类是可以遍历的,因为Iterable接口是Collection接口的父接口,而所有单列集合类都实现了Collection接口,从而也都实现了Iterable接口,所以所有单列集…

解决Springboot使用Junit测试时对数据库的修改无效

现象 在使用Junit做单元测试的过程中,比如对mybatis的dao进行单元测试,发现对数据库的select操作正常,可以获取数据,但insert、update、delete操作即使运行不报错,仍然不能不能对数据产生修改和插入。 原因和解决 原…

StarRocks 社区:从初生到两周年的进化之路

2021 年 9 月 8 日,StarRocks 开源社区诞生。从第一天开始,我们怀揣着“打造世界一流的数据分析产品”的梦想,踏上了星辰大海的征途。 两年间,StarRocks 在 GitHub 上收获了 5.4K Stars,产品共迭代发布了 90 余个版本&…

go语言 反向代理

实现简单的http反向代理 还没有加入负载均衡 新手推荐 下游服务器代码 package mainimport ("fmt""io""log""net/http""os""os/signal""syscall""time" )type RealServer struct {Addr str…

嵌入式:驱动开发 Day9

作业:通过platform总线驱动实现 a.应用程序通过阻塞的io模型来读取number变量的值 b.number是内核驱动中的一个变量 c.number的值随着按键按下而改变(按键中断) 例如number0 按下按键number1 ,再次按下按键number0 d.在按下按键的时候需要同时…

Python 公里与海里换算

""" 公里与海里换算知识点:1、换算公式:海里 公里 / 1.8522、input()、print()函数3、变量类型转换,整形int与字符串str转换,可以用type()函数验证4、字符串拼接,例如:123 456 1234565、…

Vue3快速上手

1.Vue3简介 2020年9月18日,Vue.js发布3.0版本,代号:One Piece(海贼王)耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址:Release v3.0.0 One Piece vuejs/core GitHub 2.Vue3带…

搜款网VVIC根据ID取商品详情 API 关键词搜索商品列表

搜款网是一家服装批发平台,提供多个品牌和供应商的服装、鞋子、箱包等商品供采购者选择,为了获取商品详情,您需要使用搜款网的API接口。 建议您联系搜款网的客服或开发者,以获取更多关于API接口的信息,包括使用方法、…

数据标准化

1、均值方差标准化(Z-Score标准化) 计算过程: 对每个属性/每列分别进行一下操作,将数据按属性/按列减去其均值,并除以其方差,最终使每个属性/每列的所有数据都聚集在均值为0,方差为1附近。 公式:(x-mean(x…

M-LAG简介

定义 M-LAG(Multichassis Link Aggregation Group)即跨设备链路聚合组,是一种实现跨设备链路聚合的机制,将一台设备与另外两台设备进行跨设备链路聚合,从而把链路可靠性从单板级提高到了设备级,组成双活系…

Linux CentOS7 wc命令

wc命令的功能为统计指定文件中的字节数、字数、行数, 并将统计结果显示输出。 录入 man wc 可以查看相关信息 基本语法: wc [选项] 文件… 说明:该命令统计给定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也…

C语言进阶第三课-----------指针的进阶----------后续版

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

docker总结

Docker实用篇 0.学习目标 1.初识Docker 1.1.什么是Docker 微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署…

ddtrace 系列篇之 dd-trace-java 项目编译

dd-trace-java 是 Datadog 开源的 java APM 框架,本文主要讲解如何编译 dd-trace-java 项目。 环境准备 JDK 编译环境(三个都要:jdk8\jdk11\jdk17) Gradle 8 Maven 3.9 (需要 15G 以上的存储空间存放依赖) Git >2 (低于会出现一想不到的异常&#xf…

大语言模型之十-Byte Pair Encoding

Tokenizer 诸如GPT-3/4以及LlaMA/LlaMA2大语言模型都采用了token的作为模型的输入输出,其输入是文本,然后将文本转为token(正整数),然后从一串token(对应于文本)预测下一个token。 进入OpenAI官…