详解WBE请求过程

B/S系统网络架构

当一个用户在浏览器里输入www.taobao.com这个URL时,将会发生很多操作。首先它会请求DNS把这个域名解析成对应的IP地址,然后根据这个IP地址在互联网上找到对应的服务器,向这个服务器发起一个get请求,由这个服务器决定返回默认的数据资源给访问的用户。在服务器端实际上还有很复杂的业务逻辑:服务器可能有很多台,到底指定哪台服务器来处理请求,这需要一个负载均衡设备来平均分配所有用户的请求;还有请求的数据是存储在分布式缓存里还是一个静态文件中,或是在数据库里;当数据返回浏览器时,浏览器解析数据发现还有一些静态资源(如CSS、JS或者图片)时又会发起另外的HTTP请求,而这些请求很可能会在CDN上,那么CDN服务器又会处理这个用户的请求,大体上一个用户请求会涉及这么多的操作。每一个细节都会影响这个请求最终是否会成功。

详解WBE请求过程_第1张图片
[CDN架构图]

HTTP协议解析

    1. HTTP请求原理
      http请求一个符合http协议的socket连接,当用户在浏览器输入URL按下回车后,浏览器与远程服务器建立socket连接,然后浏览器根据这个URL组装成一个get类型的HTTP请求头,通过output-Stream.write发送到目标服务器,服务器等待inputStream.read返回数据,最后断开这个连接。
    1. HTTP Header解析
      要理解HTTP协议,最重要的就是要熟悉HTTP协议中的HTTP Header,HTTP Header控制着互联网上成千上万的用户的数据的传输。最关键的是,它控制着用户浏览器的渲染行为和服务器的执行逻辑。例如,当服务器没有用户请求的数据时就会返回一个404状态码,告诉浏览器没有要请求的数据,通常浏览器就会展示一个非常不愿意看到的该页面不存在的错误信息。


      详解WBE请求过程_第2张图片
      常见的HTTPHeader

      详解WBE请求过程_第3张图片
      常见的HTTP相应头

      详解WBE请求过程_第4张图片
      常见的HTTP状态码
    1. 浏览器缓存机制
    • 3.1 Ctrl+F5组合键强制刷新一个页面的原理
      浏览器缓存是一个比较复杂但是又比较重要的机制,在我们浏览一个页面时发现有异常的情况下,通常考虑的就是是不是浏览器做了缓存,所以一般的做法就是按Ctrl+F5组合键重新请求一次这个页面,重新请求的页面肯定是最新的页面。为什么重新请求就一定能够请求到没有缓存的页面呢?首先是在浏览器端,如果是按Ctrl+F5组合键刷新页面,那么浏览器会直接向目标URL发送请求,而不会使用浏览器缓存的数据;其次在HTTP的请求头中会增加两个请求项Pragma:no-cache和Cache-Control:no-cache,告诉服务端我们要获取最新的数据而不是缓存。

    • 3.2 缓存相关的HTTP Head字段

      • 3.2.1 Cache-Control/Pragma
        这个HTTP Head字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令,如果知道该页面是否为缓存,不仅可以控制浏览器,还可以控制和HTTP协议相关的缓存或代理服务器。HTTP Head字段有一些可选值,如下图所示


        详解WBE请求过程_第5张图片
        HTTP Head字段可选值

        Cache-Control请求字段被各个浏览器支持得较好,而且它的优先级也比较高,它和其他一些请求字段(如Expires)同时出现时,Cache-Control会覆盖其他字段。
        Pragma字段的作用和Cache-Control有点类似,它也是在HTTP头中包含一个特殊的指令,使相关的服务器来遵守,最常用的就是Pragma:no-cache,它和Cache-Control:no-cache的作用是一样的。

      • 3.2.1 Expires
        Expires通常的使用格式是Expires:Sat,25Feb201212:22:17GMT,后面跟着一个日期和时间,超过这个时间值后,缓存的内容将失效,也就是浏览器在发出请求之前检查这个页面的这个字段,看该页面是否已经过期了,过期了就重新向服务器发起请求。

      • 3.2.3 Last-Modified/Etag
        Last-Modified字段一般用于表示一个服务器上的资源的最后修改时间,通过这个最后修改时间可以判断当前请求的资源是否是最新的。
        一般服务端在响应头中返回一个Last-Modified字段,告诉浏览器这个页面的最后修改时间,如Last-Modified:Sat,25Feb201212:55:04GMT,浏览器再次请求时在请求头中增加一个If-Modified-Since:Sat,25Feb 201212:55:04GMT字段,询问当前缓存的页面是否是最新的,如果是最新的就返回304状态码,告诉浏览器是最新的,服务器也不会传输新的数据。
        与Last-Modified字段有类似功能的还有一个Etag字段,这个字段的作用是让服务端给每个页面分配一个唯一的编号,然后通过这个编号来区分当前这个页面是否是最新的。这种方式比使用Last-Modified更加灵活,但是在后端的Web服务器有多台时比较难处理,因为每个Web服务器都要记住网站的所有资源,否则浏览器返回这个编号就没有意义了。

DNS域名解析

  • 1.DNS域名解析过程
    详解WBE请求过程_第6张图片
    DNS域名解析过程

    当一个用户在浏览器中输入www.abc.com时,DNS解析将会有将近10个步骤,这个过程大体描述如下。
    • 1.1.浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就将结束。浏览器缓存域名也是有限制的,不仅浏览器缓存大小有限制,而且缓存的时间也有限制,通常情况下为几分钟到几小时不等,域名被缓存的时间限制可以通过TTL属性来设置。
    • 1.2. 如果用户的浏览器缓存中没有,浏览器会查找操作系统缓存中是否有这个域名对应的DNS解析结果。操作系统也会有一个域名解析的过程,在Windows中可以通过C:\Windows\System32\drivers\etc\hosts文件来设置。
    • 1.3. 如果操作系统的域名解析也没有命中,操作系统就会根据本地配置的DNS服务器把这个域名发送给这里设置的LDNS,也就是本地区的域名服务器。这个专门的域名解析服务器性能都会很好,它们一般都会缓存域名解析结果,当然缓存时间是受域名的失效时间控制的,一般缓存空间不是影响域名失效的主要因素。大约80%的域名解析都到这里就已经完成了,所以LDNS主要承担了域名的解析工作。
    • 1.4. 如果LDNS仍然没有命中,就直接到根域名服务器 (Root Name Server) 请求解析。根域名服务器是国际顶级域名服务器,如.com、.cn、.org等,全球只有13台左右。
    • 1.5. 根域名服务器 (Root Name Server) 返回给本地域名服务器 (DNS Server) 一个所查询域的主域名服务器 (gTLD Server) 地址。
    • 1.6. 本地域名服务器(Local DNS Server)再向上一步返回的gTLD服务器发送请求。
    • 1.7. 接受请求的 GTLD 服务器查找并返回此域名对应的域名服务器 (Name Server,即域名申请时注册的域名服务器)的地址。
    • 1.8. Name Server域名服务器会查询存储的域名和IP的映射关系表,正常情况下都根据域名得到目标IP记录,连同一个TTL值,返回给域名服务器 (DNS Server)。
    • 1.9. 返回该域名对应的IP和TTL值,Local DNS Server会缓存这个域名和IP的对应关系,缓存的时间由TTL值控制。
    • 1.10. 把解析的结果返回给用户,用户根据TTL值缓存在本地系统缓存中,域名解析过程结束。

在实际的DNS解析过程中,可能还不止这10个步骤,如Name Server也可能有多级,或者有一个GTM(F5负载均衡)来负载均衡控制,这都有可能会影响域名解析的过程。

  • 2.跟踪域名解析过程
    在Linux和Windows下都可以用nslookup命令来查询域名的解析结果


    详解WBE请求过程_第7张图片
    用 nslookup查询域名解析结果
  • 3.几种域名解析方式
    域名解析记录主要分为A记录、MX记录、CNAME记录、NS记录和TXT记录。
    • A记录,A代表的是Address,用来指定域名对应的IP地址,如将item.taobao.com指定到115.238.23.241,将switch.taobao.com指定到121.14.24.241。A记录可以将多个域名解析到一个IP地址,但是不能将一个域名解析到多个IP地址。
    • MX记录,表示的是Mail Exchange,就是可以将某个域名下的邮件服务器指向自己的Mail Server,如taobao.com域名的A记录IP地址是115.238.25.245,如果MX记录设置为115.238.25.246,是[email protected]的邮件路由,DNS会将邮件发送到115.238.25.246所在的服务器,而正常通过Web请求的话仍然解析到A记录的IP地址。
    • CNAME记录,全称是Canonical Name(别名解析)。所谓的别名解析就是可以为一个域名设置一个或者多个别名。如将taobao.com解析到xulingbo.net,将srcfan.com也解析到xulingbo.net。其中xulingbo.net分别是taobao.com和srcfan.com的别名。前面的跟踪域名解析中的“www.taobao.com.1542 IN CNAMEwww.gslb.taobao.com”就是CNAME解析。
    • NS记录,为某个域名指定DNS解析服务器,也就是这个域名有指定的IP地址的DNS服务器去解析,前面的“gslb.taobao.com.86400 IN NS gslbns2.taobao.com.”就是NS解析。
    • TXT记录,为某个主机名或域名设置说明,如可以为xul-ingbo.net设置TXT记录为“君山的博客|许令波”这样的说明。

CDN工作机制

CDN也就是内容分布网络(Content Delivery Network),它是构筑在现有Internet上的一种先进的流量分配网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。有别于镜像,它比镜像更智能,可以做这样一个比喻:CDN=镜像(Mirror)+缓存(Cache)+整体负载均衡(GSLB)。因而,CDN可以明显提高Internet中信息流动的效率。
目前CDN都以缓存网站中的静态数据为主,如CSS、JS、图片和静态页面等数据。用户在从主站服务器请求到动态内容后再从CDN上下载这些静态数据,从而加速网页数据内容的下载速度,如淘宝有90%以上的数据都是由CDN来提供的。通常来说CDN要达到以下几个目标。

  • 可扩展(Scalability)。性能可扩展性:应对新增的大量数据、用户和事务的扩展能力;成本可扩展性:用低廉的运营成本提供动态的服务能力和高质量的内容分发。
  • 安全性(Security)。强调提供物理设备、网络、软件、数据和服务过程的安全性,(趋势)减少因为DDoS攻击或者其他恶意行为造成商业网站的业务中断。
  • 可靠性、响应和执行(Reliability、Responsiveness和Per-formance)。服务可用性,能够处理可能的故障和用户体验的下降,通过负载均衡及时提供网络的容错机制。
  • 1.CDN架构


    详解WBE请求过程_第8张图片
    CDN架构

    一个用户访问某个静态文件(如CSS文件),这个静态文件的域名假如是cdn.taobao.com,那么首先要向Lo-cal DNS服务器发起请求,一般经过迭代解析后回到这个域名的注册服务器去解析,一般每个公司都会有一个DNS解析服务器。这时这个DNS解析服务器通常会把它重新CNAME解析到另外一个域名,而这个域名最终会被指向CDN全局中的DNS负载均衡服务器,再由这个GTM来最终分配是哪个地方的访问用户,返回给离这个访问用户最近的CDN节点。拿到DNS解析结果,用户就直接去这个CDN节点访问这个静态文件了,如果这个节点中所请求的文件不存在,就会再回到源站去获取这个文件,然后再返回给用户。

负载均衡

负载均衡(Load Balance)就是对工作任务进行平衡、分摊到多个操作单元上执行,如图片服务器、应用服务器等,共同完成工作任务。它可以提高服务器响应速度及利用效率,避免软件或者硬件模块出现单点失效,解决网络拥塞问题,实现地理位置无关性,为用户提供较一致的访问质量。通常有三种负载均衡架构,分别是链路负载均衡、集群负载均衡和操作系统负载均衡。

  • 链路负载均衡也就是前面提到的通过DNS解析成不同的IP,然后用户根据这个IP来访问不同的目标服务器。


    详解WBE请求过程_第9张图片
    链路负载均衡

    负载均衡是由DNS的解析来完成的,用户最终访问哪个Web Server是由DNS Server来控制的,在这里就是由GlobalDNS Server来动态解析域名服务。这种DNS解析的优点是用户会直接访问目标服务器,而不需要经过其他的代理服务器,通常访问速度会更快。但是也有缺点,由于DNS在用户本地和LocalDNS Server都有缓存,一旦某台Web Server挂掉,那么很难及时更新用户的域名解析结构。如果用户的域名没有及时更新,那么用户将无法访问这个域名,带来的后果非常严重。

  • 集群负载均衡是另外一种常见的负载均衡方式,它一般分为硬件负载均衡和软件负载均衡。硬件负载均衡一般使用一台专门硬件设备来转发请求,如图所示。


    详解WBE请求过程_第10张图片
    硬件负载均衡

    硬件负载均衡的关键就是这台价格非常昂贵的设备,如F5,通常为了安全需要一主一备。它的优点很显然就是性能非常好,缺点就是非常贵,一般公司是用不起的,还有就是当访问量陡然增大超出服务极限时,不能进行动态扩容。
    软件负载均衡是使用最普遍的一种负载方式,它的特点是使用成本非常低,直接使用廉价的PC就可以搭建。缺点就是一般一次访问请求要经过多次代理服务器,会增加网络延时。它的架构通常如图所示。


    详解WBE请求过程_第11张图片
    软件负载均衡

    上面两台是LVS,使用四层负载均衡,也就是在网络层利用IP地址进行地址转发。下面三台使用HAProxy进行七层负载,也就是可以根据访问用户的HTTP请求头来进行负载均衡,如可以根据不同的URL来将请求转发到特定机器或者根据用户的Cookie信息来指定访问的机器。
  • 操作系统负载均衡,就是利用操作系统级别的软中断或者硬件中断来达到负载均衡,如可以设置多队列网卡等来实现。

你可能感兴趣的:(详解WBE请求过程)