1.Web 请求过程

1.1 B/S网络架构

B/S即browser/service 和传统的C/S架构使用自定义的应用层协议不同,B/S架构使用的都是统一的HTTP。HTTP采用无状态的短连接的通信方式,通常情况下,一次请求就完成了一次数据交互,通常也对应一个业务逻辑,然后这次通信连接就断开了。这种方式的好处是能够同时服务更多的用户。

基于HTTP本身的特点、目前的B/S网络架构大多采用如下图所示的架构设计,既要满足海量用户的访问请求,又要保持用户请求的快速响应,所以现在的网络架构也越来越复杂。
CDN架构图
CDN架构图
当用户在浏览器中输入www.taobao.com这个URL时,首先,它会请求DNS把这个域名解析成对应的IP地址,然后根据这个IP地址在互联网上找到对应的服务器,像这个服务器发送一个get请求,这个服务器返回默认的数据资源给访问的用户。在服务器端,服务器可能有很多台,这是就需要一个负载均衡设备来平均分配所有用户的请求,还有就是请求的数据时存储在分布式缓存里还是一个静态文件中或是在数据库中。当数据返回浏览器时,浏览器解析数据可能发现还有一些静态资源(如CSS,JS或图片)时又会发起另外的HTTP请求,而这些请求很可能会在CDN上,那么CDN服务器又会处理这个用户的请求,大体上一个请求会涉及这么多的操作。每一个细节都会影响这个请求最终是否会成功。

1.2 不借助浏览器发起一个HTTP请求

如何发起一个HTTP请求和如何建立一个Socket连接区别不大,只不过outputStream.write写的二进制字节数据格式要符合HTTP。浏览器在建立Socket连接之前,必须根据地址栏里输入的URL的域名解析出IP地址,再根据这个IP地址和默认的80端口与远程服务器建立Socket连接,然后浏览器根据这个URL组装成一个get类型的HTTP请求头,通过outputStream.write发送到目标服务器,服务器等待inputStream.read返回数据,最后断开这个连接。
所以,发起一个HTTP请求的过程就是建立一个Socket通信的过程。
Apache Http Components项目下的HttpClient就是一个开源的通过程序实现处理HTTP请求的工具包。地址:Apache Http Components
还有Linux中的curl命令,通过curl + URL 就可以简单的发起一个HTTP请求。

1.3 HTTP解析

HTTP Header控制着互联网上成千上万的用户的数据的传输。最关键的是,它控制着用户浏览器的渲染和服务器的执行逻辑。常见的HTTP请求头和响应头如下表:
常见的HTTP请求头:
常见的HTTP请求头

常见的HTTP响应头:
常见的HTTP响应头

浏览器缓存机制

浏览器缓存是一个比较复杂但是有比较重要的机制,当浏览一个页面发现有异常的时候,通常考虑的就是是不是浏览器做了缓存,解决办法就是使用Ctrl+F5组合键重新请求一下这个页面。
当使用Ctrl+F5组合键刷新一个页面时,在HTTP请求头中会增加一些请求头,以此告诉服务器要获取最新的数据而不是缓存:
1.Cache-Control/Pragma
这个HTTP Head字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令,不仅可以控制浏览器,还可以控制和HTTP相关的缓存和代理服务器。
HTTP Head 字段的可选值:

  • Public——所有内容都将被缓存,在响应头中设置
  • Private——内容只缓存到私有缓存中,在响应头中设置
  • no-cache——所有内容都不会被缓存,在请求头和响应头中设置
  • no-store——所有内容都不会被缓存到缓存或Internet临时文件中,在响应头中设置
  • must-revalidation/proxy-revalidation——如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证,在请求头中设置
  • max-age=xxx——缓存的内容将在xxx秒后失效,这个选项只是在HTTP1.1中可用,和Last-Modified一起使用时优先级较高,在响应中设置

Cache-Control的优先级比较高,和其他的一些请求字段同时出现时,Cache-Control会覆盖其他字段
Pragma字段是在HTTP头中包含一个特殊的指令,使相关的服务器遵守该指令。
2.Expires
Expires通常使用格式是Expires: Sat, 25 Feb 2012 12:22:17 GMT,后面跟着一个日期和时间,超过这个时间值后,缓存的内容将失效,也就是浏览器在发出请求之前检查这个页面的这个字段,看该页面是否已经过期,过期了就重新重新向服务器发送请求。
3.Last-Modified/Etag
Last-Modified字段一般用于表示一个服务器上的资源的最后修改时间,资源可以是静态(静态内容自动加上Last-Modified字段)或者动态的内容(如Servlet提供了一个getLastModified方法用于检查某个动态内容是否已经更新),通过这个最后修改时间可以判断当前请求的资源是否是最新的。
Etag字段的作用是让服务器给每一个页面分配一个唯一的编号,然后通过这个编号来区分当前这个页面是否是最新的。

1.4 DNS域名解析

DNS域名解析过程:
如图,当用户在浏览器中输入www.taobao.com并按下回车键时,DNS解析将会有将近十个步骤:

  1. 浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就结束。浏览器缓存域名受缓存大小和缓存时间限制。缓存时间限制可以通过TTL属性设置。
  2. 如果用户的浏览器缓存中没有,浏览器会查找操作系统缓存中是否有这个域名对应的DNS解析结果。操作系统也有一个域名解析过程,Windows中通过C:\Windows\System32\drivers\etc\hosts文件中设置,Linux中是/etc/hosts,如果在这里指定一个域名对应的IP地址,浏览器会首先使用这个IP地址。
  3. 如果在本机中仍然没有完成域名的解析,就会真正请求域名服务器来解析这个域名。操作系统会把这个域名发送给这里设置的LDNS,也就是本地区的域名服务器。
  4. 如果LDNS仍然没有命中,就直接到Root Server域名服务器请求解析。
  5. 根域名服务器返回给本地域名服务器一个所查询域的主域名服务器(gTLD Server)地址。
  6. 本地域名服务器(Local DNS Server)再向上一步返回的gTLD服务器发送请求。
  7. 接受请求的gTLD服务器查找并返回此域名对应的Name Server 域名服务器的地址,这个Name Server 通常就是你注册的域名服务器。
  8. Name Server域名服务器会查询存储的域名和IP的映射关系表,在正常情况下都根据域名得到IP记录,连同一个TTL值返回给DNS Server域名服务器。
  9. 返回该域名对应的IP和TTL值,local DNS Server会缓存这个域名和IP的对应关系,缓存的时间由TTL值控制。
  10. 把解析的结果返回给用户,用户根据TTL值缓存在本地系统缓存中,域名解析过程结束。

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

## 跟踪域名解析过程 ##
在Linux和Windows下都可以用nslookup命令来查询域名的解析结果
在Linux系统中还可以使用dig命令来查询DNS的解析过程

清除缓存的域名

DNS域名解析后主要在两个地方缓存结果:一个是Local DNS Server,另一个是用户的本地机器。两个缓存都是TTL值和本机缓存大小控制。最大缓存时间是TTL值,基本上LDS的缓存时间就是TTL控制,很难人工介入。但是我们可以清除本机缓存:
Windows:命令——ipconfig /flushdns
Linux: /etc/init.d/nscd restart
在Java应用中JVM也会缓存DNS的解析结果,这个缓存是在InetAddress类中完成,此类有两种缓存策略:1.正确解析结果缓存;2.失败的解析结果缓存。分别由%JAVA_HOME%\lib\security\java.security文件中的networkaddress.cache.ttl和networkaddress.cache.negative.ttl配置,默认值分别是-1(永不失效)和10(缓存10秒)。修改的办法有:直接修改java.security文件中默认值、在Java的自动参数中增加 -Dsun.net.inetaddr.ttl=xxx来修改默认值、通过InetAddress类动态修改。(如果需要使用InetAddress类解析域名,必须是单例模式。不然会有严重的性能问题。因为如果每次都创建实例,则每次都要进行一次完整的域名解析,非常耗时。)

几种域名解析方式:

域名解析记录主要分为A记录、MX记录、CNAME记录、NS记录和TXT记录。

  1. A记录,A代表的是Address,用来指定域名对应的IP地址。
  2. MX记录,表示的是Mail Exchange,就是可以将某个域名下的邮件服务器指向自己的Mail Server
  3. CNAME记录,全程是Canoncial Name(别名解析)。就是可以为一个域名设置一个或者多个别名。
  4. NS记录,为某个域名指定DNS解析服务器,也就是这个域名有指定的IP地址的DNS服务器去解析。
  5. TXT记录,为某个主机名或域名设置说明。

1.5 CDN工作机制

CDN也就是内容分布网络(Content Delivery Network),它是构筑在现有Internet上的一种先进的流量分配网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。
目前CDN都以缓存网站的静态数据为主,用户在从主站服务器请求到动态内容后,再从CDN上下载这些静态数据,从而加速网页数据内容的下载速度,如淘宝有90%以上的数据都是由CDN提供的。
通常来说,CDN所要达到以下几个目标:
1. 可扩展。性能可扩展,成本可扩展
2. 安全性
3. 可靠性、响应和执行。

web请求过程:
这web请求过程

负载均衡
负载均衡(Load Balance)就是对工作任务进行平衡、分摊到多个操作单元上执行,如图片服务器、应用服务器等,共同完成工作任务。
通常有三种负载均衡框架,分别是链路负载均衡、集群负载均衡、操作系统负载均衡。而所谓的链路负载均衡也就是前面提到的通过DNS解析成不同的IP,然后用户根据这个IP来访问不同的目标服务器。这个负载均衡是由DNS的解析来完成,用户最终访问哪个Web Server是由DNS Server 来控制的。优点是用户会直接访问目标服务器,而不需要经过其他的代理服务器,通常访问速度会更快,缺点是,由于DNS在用户本地和Local DNS Server 都有缓存,一旦某台web Server挂掉,就很难及时更新用户的域名解析结构。
链路负载均衡:
链路负载均衡
集群负载均衡是另外一种常见的负载均衡方式,一般分为硬件负载均衡和软件负载均衡。硬件负载均衡一般使用一台专门的硬件设备来转发请求,成本高而且不能进行动态扩容。软件负载均衡是使用最普遍的一种负载方式,特点是使用成本低,知己使用廉价的PC就可以搭建,缺点是一般一次访问请求要经过多次代理服务器,会增加网络延时。
硬件负载均衡:
硬件负载均衡
软件负载均衡:
软件负载均衡
最后一种是操作系统负载均衡,就是利用操作系统级别的软中断或者硬件中断来达到负载均衡,如可以设置多队列网卡等来实现。

CDN动态加速
技术原理就是在CDN的DNS解析中通过动态的链路探测来寻找回源最好的一条路径,然后通过DNS的调度将所有请求调度到选定的这条路径上回源,从而加速用户访问的效率。
CDN动态加速
由于CDN节点是遍布全国的,所以用户接入一个CDN节点后,可以选择一条从离用户最近的CDN节点到源站链路最好的路径让用户走。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值