互联网:
广义的互联网,由两层组成:一层是以 TCP/IP 为代表的网络层;另一层是以万维网 WWW 为代表的应用层。
以 TCP/IP 为核心的网络层(狭义的互联网),实际上是广义互联网的下层,这一层的主要作用是通过计算机之间的互联,将各种信息的数据报文以极低的成本进行传输,俗称“管道”,所有信息和内容在这个管道里进行传送。
以万维网 WWW 为代表的应用层,是广义互联网的上层。这一层包括很多种类型的流量和应用,例如:邮件、软件、在线影院、游戏、电子商务、移动应用等,所有服务提供商提供的都是这些用户看得见、摸得着的应用。
互联网就是铁路轨道和信息系统,万维网则是铁路上运行的列车之一。在互联网这个铁路网中,有四个地方会造成列车拥塞:
- 第一公里:网站的出口带宽,这个带宽决定了网站能为用户提供的访问速度和并发访问量,用户请求数据量超过出口带宽,就会在出口形成拥塞。就像节假日,出城的高速出口,比平时更多人通过,但是出口只有两三个,所以造成拥塞。
- 最后一公里:用户接入带宽。用户的平均接入带宽,是影响互联网上层应用发展的决定性因素之一。
- 对等互联关口:不同基础运营商支架的互联互通,一般两个运营商之间只有两三个互联互通点。这里通常是互联网传输的拥堵点。
- 长途骨干传输:首先是长距离传输时延的问题,从服务器到用户之间要经过很长的距离,这是互联网本身无法解决的问题;其次是骨干网拥塞问题,互联网上绝大部分流量都要经过骨干网络进行传输,骨干网的承载能力成为影响互联网性能的瓶颈。
服务响应时间基本是由服务器响应时间和网络时延组成的。影响服务器响应时间的因素包括协议处理时间、程序性能优化、内容读取速度等方面。网络时延则由数据报文在网络传送中被各个路由器、交换机转发发生的时延长总和。
互联网用户服务访问流程:
- 用户在浏览器中输入要访问的网站域名;
- 浏览器向本地 DNS 服务器请求对该域名的解析;
- 本地 DNS 服务器中如果缓存有这个域名的解析结果,则直接响应用户的解析请求;
- 本地 DNS 服务器中如果没有关于这个域名的解析结果的缓存,则以递归方式向整个 DNS 系统请求解析,获得应答后将结果反馈给浏览器;
- 浏览器得到域名解析结果,就是该域名相应的服务器设备的 IP 地址;
- 浏览器向服务器请求内容;
- 服务器将用户请求内容传送给浏览器;
带有 CDN 的服务访问过程:
-
用户点击网站页面上的 URL,经过本地 DNS 系统解析,DNS 系统会将最终将域名的解析权交给 CNAME 指向的 CDN 专用 DNS 服务器;
-
CDN 的 DNS 服务器将 CDN 的全局负载均衡设备IP地址返回给用户;
-
用户向 CDN 的全局负载均衡设备发起内容 URL 访问请求;
-
CDN 全局负载均衡设备根据用户 IP 地址,以及用户请求的内容 URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求;
-
区域负载均衡设备会为用户选择一台合适的缓存服务器提供服务;
选择依据:
- 根据用户 IP 地址判断距离用户最近的服务器;
- 根据资源 URL 判断哪台服务器上有所需资源;
- 查询各个服务器当前的负载情况,判断哪台服务器尚有服务能力;
-
全局负载均衡设备把服务器的IP地址返回给用户;
-
用户向缓存服务器发起请求,缓存服务器响应用户的请求。如果这台服务器没有用户需要的内容,但是区域负载均衡设备依然将它分配给了用户,就向这台服务器的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉取到本地。
CDN:
内容分发网络:Content Delivery Networks,简称 CDN,它是构筑在现有 Internet 上的一种先进的流量分配网络。其目的是通过在现有的 Internet 中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。
有别于镜像,它比镜像更智能,可以做这样一个比喻:CDN = 镜像(Mirror)+ 缓存(Cache)+ 整体负载均衡(GSLB)。
典型的CDN系统由分发服务系统、负载均衡系统和运营管理系统三大部分组成:
- 分发服务系统:主要实现将内容从内容源中心向边缘的推送和存储。基本工作单元是许许多多的 Cache 设备(缓存服务器),Cache 负责使用缓存响应最终用户的访问请求,Cache 还负责源站点进行内容同步。
- 负载均衡系统:CDN 系统的中枢神经。负责对所有发起服务请求的用户进行访问调度,确定提供给用户的最终实际访问地址。
- 运营管理系统:分为运营管理和网络管理两个子系统。运行管理包含客户管理、产品管理、计费管理、统计分析等。网络管理实现对CDN系统的网络设备管理、拓扑管理、链路监控和故障管理,为管理员提供管理操作界面。
使用 CDN 来实现网站性能优化:
网站最初通常将其所有的服务器放在同一个地方,但是当用户群增加后,公司就必须面对服务器放置地点不再适用的事实,有必要在多个地理位置不同的服务器上部署内容。这样,可以缩短用户和内容之间的距离,减少响应时间。
CDN 更适用于发布静态资源,如图片、脚本、样式表和 Flash 等。
静态文件更容易存储并具有较少的依赖性;提供动态 HTML 页面会引入特殊的存储需求,例如:数据库连接、状态管理、验证、硬件和 OS 优化等,这些复杂性超越了 CDN 的能力范围。
在开发中使用 CDN 的两种方式:
- 将所有的静态资源都打包放到 CDN 服务器上。需要购买自己的 CDN 服务器。
- 将自己的静态资源还是放到自己的服务器上,使用放在 CDN 服务器上的第三方库。
通常一些比较出名的开源框架都会将打包后的源码放到一些比较出名的、免费的 CDN 服务器上。
国际上使用较多的有:unpkg、JSDelivr、cdnjs;国内使用较多的有:bootcdn。