Web请求过程

B/S架构

最多见的架构方式。html

优势:linux

1.客户端使用统一(此处的统一主要指实现原理统一)的浏览器,不须要特殊的网络配置。数据库

2.服务端基于统一的HTTP协议。基于此协议的服务器有不少,如Tomcat,Nginx,JBoss。这些服务器能够直接拿来用。浏览器

请求发生的完整过程

HTTP最大的特色就是无状态的短链接的通讯方式,一般状况下一次请求就完成了一次数据交互,一般也对应一次业务逻辑。而后此次通讯就断开了。缓存

采用这种方式是为了可以同时服务更多的用户,防止因为一个用户独占链接而形成阻塞的现象。服务器

下面主要介绍用户在浏览器输入网址以后发生的整个完整过程。网络

1.用户输入URL,也就是网址。如www.google.com。架构

2.DNS域名服务器会将其转换成IP地址。负载均衡

3.用户端根据IP地址向服务器发起请求。curl

4.服务器端可能会有负载均衡设备来平均分配全部的用户请求。在请求到达服务器后,会通过一些复杂的业务逻辑来处理用户请求。请求的数据可能在三个地方:
分布式缓存系统,文件系统或者数据库中。从其中取出数据返回给浏览器。

5.数据返回后,浏览器解析数据发现还有一些静态的资源(CSS,JS或者图片),而后再次发起请求。这些静态资源颇有多是在CDN上,若是在的话CDN服务器会再次处理用户的请求。

6.最终在浏览器端看到完整的网页。

以上就是大体的请求数据的过程。

无论架构如何变化,有三个原则是始终不变的:

1)互联网上的全部资源都要用一个URL表示。

2)必须基于HTTP与服务端交互。

3)数据展现必须在浏览器中进行。

如何发起请求

发起请求实质上就是创建一个Socket链接,可是这是一个特殊的Socket链接。

浏览器在创建Socket以前,必须根据地址栏里输入的URL的域名DNS解析出IP地址,在根据这个IP地址和默认的80端口与远程服务器创建Socket连接,而后浏览器根据这个URL组装成一个get类型的HTTP请求头,经过outPutStream.write 发送到目标服务器,服务器等待inputString.read返回数据,最后断开这个链接

端口号:80

因此彻底能够本身模拟浏览器发起一个HTTP请求。专门有个处理HTTP请求的开源工具包,叫HttpClient。

在linux中经过curl+URL能够简单地发起一个HTTP请求。如:curl "www.google.com"

请求的解析

HTTP请求的最重要的部分就是HTTP的头部。

HTTP请求头:

Accept-Charset    用于指定客户端接受的字符集
Accept-Encoding   可接受的内容编码
Accept-Language   天然语言 好比zh-cn
Host              指定被请求资源的Internet主机和端口号
User-Agent        客户端将它的操做系统、浏览器和其余属性告诉服务器
Connection        当前链接是否保持。

 

HTTP响应头:

Server            使用的服务器名称
Content-type      指明发送给接受者的实体正文的媒体类型,如Content_Type:text/html;charset = GBK
Content-Encoding: 告诉浏览器服务端采用的压缩编码
Content-Language: 描述了资源所用的天然语言
Content-Length  : 指明实体正文的长度
Keep-Alive      : 保持链接的时间

 

常见的状态吗:

200 客户端请求成功
302 临时跳转,跳转的地址经过Location
400 客户端请求语法有错误,不能被服务器识别
404 请求资源不存在 403 服务器收到请求,可是拒绝提供服务 500 服务端发生不可预期的错误

 

浏览器的缓存设置

在浏览器端Ctrl+F5能够从新发起请求而不使用缓存数据。发出报文的请求头里面相关字段告诉服务器,不要缓存要最新的数据。

这两个字段是:Pragma:no-cache Cache-Control:no-cache

public:全部内容都将被缓存,在响应头中设置
private:内容只缓存到私有缓存中,在响应头中设置
no-cache:全部内容都不会被缓存,在请求头和响应头中设置
no-store:全部内容都不会被缓存到缓存或Internet临时文件中,在响应头中设置
must-revalidation/proxy-revalidation:若是缓存的内容失效,请求必须发送到服务器/代理以从新验证,在请求头中设置
max-age=xxx:缓存的内容将在XXX秒后失效,只在HTTP1.1可用,在请求头中设置

Cache-Control和Expires同时出现时,Cache-Control会覆盖其余字段

Expires:通常后面跟一个日期时间,超过这个时间设置以后,缓存内容将失效,也就是浏览器在发出请求以前检查这个页面的这个字段,看页面是否过时了,过时了就从新向浏览器发起服务

Last-Modified:通常表示服务器上资源最后修改时间,根据这个修改时间能够判断当前请求的资源是不是最新的,若是是最新的,服务器就返回304状态码告知浏览器

Etag:服务器给每一个页面分配一个惟一的编号,而后区分编号判断页面内容是不是最新的

DNS域名解析过程

1.用户输入URL,浏览器检查自身有没有缓存该域名的IP地址。

2.若是没有,浏览器检查操做系统缓存中是否有这个DNS解析结果。

3.若是缓存中尚未,则操做系统会把这个域名发送给LDNS(Local DNS)即本地域名服务器。

4.若是LDNS中尚未,则只能去Root Server域名服务器中请求解析了。这样的状况比较罕见,由于全球只有13台左右这样的服务器。

5.根域名服务器会返回一个本地域名服务器所查域的主域名服务器(gTLD Server)地址。gTLD是国际顶级域名服务器地址,如.com、.cn、.org,全球只有13台

6.LDNS向gTLD发送请求。

7.gTLD接受此请求,返回一个此域名对应的Name Server域名服务器的地址。这个Name Server一般就是你注册的域名服务器。

8.Name Server返回该域名对应的IP和TTL值,而后Local DNS Server会缓存这个对应关系,缓存时间由TTL控制。

9.解析结果返回用户。用户根据TTL值缓存在本地系统缓存此对应关系。

TTL是域名解析的生命周期,TTL值全称是“生存时间(Time To Live)”,简单的说它表示DNS记录在DNSf服务器上的缓存时间。

清除缓存域名

Local DNS的缓存由TTL来控制,很难人工介入。可是本地机器的缓存能够用如下命令来清除:

Windows: ipconfig /flushdns Linux: /etc/init.d/nscd restart

几种域名的解析方式

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

A记录:A 表明的是Address,用来指定域名对应的IP地址。域名能够多对一可是不能一对多。

MX记录:Mail Exchange,就是讲某个域名下的邮件服务器指向本身的Mail Server。

CNAME记录:别名解析。将一个域名设置一个或者多个别名。

NS记录:为某个域名指定DNS解析服务器。

TXT记录:为某个主机名或者域名设置文字说明。

CDN

工做机制

CDN即内容分发网络。经过现有的Internet中增长一层新的网络架构,将网站的内容发布到最接近用户的网络边缘,使用户能够就近取得所须要的内容,提升用户网站的响应速度。

负载均衡

对工做任务进行平衡、分摊到多个操做单元上去,共同完成任务。

三种架构:

1.链路负载均衡

由DNS解析来完成负载均衡,用户直接访问目标服务器,而不须要通过其余的代理服务器,一般访问速度会更快。

缺点:一旦某台服务器挂掉,因为用户本地和Local DNS都有DNS缓存,缓存没有及时更新,则形成用户没法访问这个域名。

2.集群负载均衡

硬件负载均衡:由一台专门的硬件设备负责转发请求,太贵通常公司用不起,可是性能很好(一分钱一分货啊)

软件负载均衡:由多台代理服务器组成。网络延时较长。

3.操做系统负载均衡

利用操做系统级别的软中断或者硬件中断来完成。

动态加速

在CDN的DNS解析过程当中,经过动态链路探测来寻找回源最好的一条路径,而后经过DNS调度将全部请求调度到选定这条路径上回源,从而加速用户访问的效率。

回源:有用户访问某一个URL的时候,若是被解析到的那个CDN节点没有缓存响应的内容,或者是缓存已经到期,就会回源站去获取。若是没有人访问,那么CDN节点不会主动去源站拿的。

相关文章
相关标签/搜索