我为看一张图片,跨过了 2600 公里!
时间:2021-09-03 10:13:02
手机看文章
扫描二维码
随时随地手机看文章
[导读]大家好,我是小林。我写技术文章画的图片是保存到GitHub的,没别的原因,就是因为免费,但是GitHub访问的速度大家都懂的,访问的速度很慢。所以我会用CDN来加速图片的访问,也就是我的图床的方案是GitHubjsdelivrCDN,使用很简单,只需要把域名地址替换一下就行。那为...
大家好,我是小林。我写技术文章画的图片是保存到 GitHub 的,没别的原因,就是因为免费,但是 GitHub 访问的速度大家都懂的,访问的速度很慢。所以我会用 CDN 来加速图片的访问,也就是我的图床的方案是 GitHub jsdelivr CDN,使用很简单,只需要把域名地址替换一下就行。那为什么访问 GitHub 会很慢呢?GitHub 离国内就近的服务器是在新加波,距离我这有 2600 公里,也就是说,访问 GitHub 上的一张图片,一个数据包就要走 2600 公里这么远!而且,互联网从逻辑上看是一张大网,但实际上是由许多小网络组成的,每个网络络中还存在许多的路由器、网关,数据每经过一个节点,都要处理一下,在二层、三层解析转发,这也会消耗一定的时间,带来延迟。把这些因素再放到全球来看,地理距离、运营商网络、路由转发的影响就会成倍增加,也就是访问 GitHub 慢的一个原因。那我是怎么知道 GitHub 服务器在哪的呢?很简单,ping www.github.com 后,就会显示出服务器的 ip 地址,然后把 ip 地址用百度搜索,就能查到该服务器是在哪里的了。图片资源是静态资源,所以要解决访问慢的问题,就可以用 CDN 加速。在我加上 jsdelivr CDN 后,GitHub 的图片就会被缓存到 CDN 服务器上,而深圳正好就有一台 jsdelivr 的 CDN 服务器。这样我访问 GitHub 图片不用再大老远跑去新加波的服务器,而是遵循就近访问原则,直接访问离深圳的这台 CDN 服务器,大大加快了访问速度。这次,我们就来好好聊一聊 CDN。开车啦!
什么是 CDN?
CDN 的全称叫 Content Delivery Network,中文名叫「内容分发网络」,它是解决由于长距离而网络访问速度慢的问题。怎么做到的呢?简单来说,CDN 将内容资源分发到位于多个地理位置机房中的服务器上,这样我们在访问内容资源的时候,不用访问源服务器。而是直接访问离我们最近的 CDN 节点 ,这样一来就省去了长途跋涉的时间成本,从而实现了网络加速。
CDN 能加速什么类型的内容?CDN 加速的是内容资源是静态资源。所谓的「静态资源」是指数据内容静态不变,任何时候来访问都是一样的,比如图片、音频。与之相反的「动态资源」,是指数据内容是动态变化的,每次访问都不一样,比如用户信息等。不过,动态资源如果也想被缓存加速,就要使用动态 CDN,其中一种方式就是将数据的逻辑计算放在 CDN 节点来做,这种方式就被称为边缘计算。
CDN 是怎么从源服务器获取资源的呢?CDN 加速策略有两种方式,分别是「推模式」和「拉模式」。大部分 CDN 加速策略采用的是「拉模式」,当用户就近访问的 CDN 节点没有缓存请求的数据时,CDN 会主动从源服务器下载数据,并更新到这个 CDN 节点的缓存中。可以看出,拉模式属于被动缓存的方式,与之相反的 「推模式」就属于主动缓存的方式。如果想要把资源在还没有用户访问前缓存到 CDN 节点,则可以采用「推模式」,这种方式也叫 CDN 预热。通过 CDN 服务提供的 API 接口,把需要预热的资源地址和需要预热的区域等信息提交上去,CDN 收到后,就会触发这些区域的 CDN 节点进行回源来实现资源预热。
如何找到离用户最近的 CDN 节点 ?
找到离用户最近的 CDN 节点是由 CDN 的全局负载均衡器(Global Sever Load Balance,GSLB)负责的。那 GSLB 是在什么时候起作用的呢?在回答这个问题前,我们先来看看在没有 CDN 的情况下,访问域名时发生的事情。在没有 CDN 的情况下,当我们访问域名时,DNS 服务器最终会返回源服务器的地址。比如,当我们在浏览器输入 www.xiaolin.com 域名后,在本地 host 文件找不到域名时,客户端就会访问本地 DNS 服务器。这时候:- 如果本地 DNS 服务器有缓存该网站的地址,则直接返回网站的地址;
- 如果没有就通过递归查询的方式,先请求根 DNS,根 DNS 返回顶级 DNS(.com)的地址;再请求 .com 顶级 DNS 得到 xiaolin.com 的域名服务器地址,再从 xiaolin.com 的域名服务器中查询到 www.xiaolin.com 对应的 IP 地址,然后返回这个 IP 地址,同时本地 DNS 缓存该 IP 地址,这样下一次的解析同一个域名就不需要做 DNS 的迭代查询了。
- 看用户的 IP 地址,查表得知地理位置,找相对最近的 CDN 节点;
- 看用户所在的运营商网络,找相同网络的 CDN 节点;
- 看用户请求 URL,判断哪一台服务器上有用户所请求的资源;
- 查询 CDN 节点的负载情况,找负载较轻的节点;