深入 Web 请求过程
B/S 架构的好处
- 客户端使用同一的浏览器。浏览器具有统一性,不需要特殊的配置和网络连接,屏蔽了服务的差异性。
- 浏览器的交互特性使用户使用简便,继承性强。
- 服务端基于统一的 HTTP 协议,采用相对规范的开发模式,节省了开发成本。
- 基于 HTTP 协议的服务器很多: Apache、Nginx、Tomcat、JBoss。可以直接拿来用。
B/S 网络架构
大多数传统的互联网应用程序采用长连接的交互模式,而 HTTP 协议采用无状态的短连接的通信方式。一次请求就完成了一次数据交互,通常也对应一个业务逻辑。网络架构如下:
请求一个网址的步骤
- 在浏览器中输入一个 URL。
- 浏览器请求 DNS 把域名解析成对应的 IP 地址
- 根据 IP 地址在在互联网上找到对应的服务器,并向服务器发送一个 get 请求。
- 需要负载均衡设备来平均分配所有用户的请求
- 请求的数据可能存储在分布式缓存或者静态文件或者数据库中。
- 由这个服务器决定返回默认的数据资源给访问的用户
- 浏览器解析返回的静态资源数据时,又会发起另外的 HTTP 请求,请求可能发生在 CDN 上
需要遵守的原则
- 互联网上所有的资源都用一个 URL(统一资源定位符) 来表示。
- 必须基于 HTTP 协议与服务端交互
- 数据展示必须在浏览器中进行(只有在浏览器上才能恢复得到的数据资源的容貌)
HTTP 解析
发起一个 HTTP 请求就是建立一个 Socket 通信的过程。
Http Header: 控制互联网用户数据的传输,以及浏览器的渲染行为和服务器的执行逻辑。
1. 常见的 HTTP 请求头
请求头 | 说明 |
---|---|
Accept-Charset | 用于指定客户端接受的字符集 |
Accept-Encoding | 用于指定可接受的内容编码,如Accept-Encoding:gzip.deflate
|
Accept-Language | 用于指定一种自然语言。如Accept-Language:zh-cn
|
Host | 用于指定被请求资源的 Internet 主机和端口号,如Host:www.taobao.com
|
User-Agent | 客户端将它的操作系统、浏览器和其他属性告诉服务器 |
Connection | 当前连接是否保持,如Connection:Keep-Alive
|
2. 常见的 HTTP 相应头
相应头 | 说明 |
---|---|
Server | 使用服务器名称,如 Server: Apache/1.3.6(Unix) |
Content-Type | 用来指明发送给接收者的实体正文的媒体类型,如 Content-Type/html;charset=GBK |
Content-Language | 描述了资源所用的自然语言,与 Accept-Language 对应 |
Content-Length | 指明实体正文的长度,用以字节方式存储的十进制数字来表示 |
Keep-Alive | 保持连接的时间,如 Keep-Alive:timeout=5,max=120 |
3. 常见的HTTP状态码
状态码 | 说明 |
---|---|
200 | 客户端请求成功 |
302 | 临时跳转,跳转的地址通过 Location 指定 |
400 | 客户端请求有语法错误,不能被服务器识别 |
403 | 服务器收到请求,但是拒绝提供服务 |
404 | 请求的资源不存在 |
500 | 服务器发生不可预期的错误 |
浏览器的缓存机制
Ctrl + F5:浏览器会直接向目标 URl 发送请求,而不会使用缓存的数据;HTTP 的请求头中会增加一些请求头,告诉服务器我们获取最新的数据而不是缓存。
1. Cache-Control/Pragma
这个 HTTP Head 字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令。
字段的可选值
可选值 | 说明 |
---|---|
Public | 所有内容将都被缓存,在响应头中设置 |
Private | 内容值缓存到私有缓存中,在响应头中设置 |
no-cache | 所有内容都不会被缓存,在请求头和响应头中设置 |
no-store | 所有内容都不会被缓存到或缓存成 Internet 临时文件中,在相应头中设置 |
must-revalidation/proxy-revalidation | 如果缓存的内容失效,请求必须发送到服务器/代理进行重新验证,在请求头中设置 |
max-age=xxx | 缓存的内容将在 xxx 秒后失效,只在 HTTP 1.1中可用 |
2. Expires
Expires 通常的格式为 Expires:Sun, 19 Feb 2017 12:53:33 GMT,后面跟一个日期和时间,超过这个时间值后,缓存的内容将失效。
3. Last-Modified/Etag
用于表示一个服务器上的资源的最后修改时间,资源可以是静态(静态内容自动加上 Last-Modified 字段) 或动态的内容(如 Servlet 提供了一个 getLastModified 方法用于检查某个动态内容是否已经更新),通过这个最后修改时间可以判断当前请求的资源是否是最新的。
DNS 域名解析
DNS 域名解析的过程
当用户在浏览器中输入域名并按下回车键后:
- 浏览器检查缓存中有没有这个域名对应的 IP 地址。如果有,解析结束(域名的缓存时间通过 TTL 属性设置)。
- 如果用户的缓存中没有,浏览器检查操作系统缓存中是否有这个域名对应的 DNS 解析结果(Windows 中通过
C:\Windows\System32\drivers\etc\hosts
文件设置)。 - 以上两个过程无法解析时,操作系统会把这个域名发送给 LDNS,也就是本地的域名服务器(提供DNS解析服务),如果是在学校接入互联网,那么你的DNS服务器肯定在学校,如果是小区,这个DNS 时提供给你接入互联网的提供商,即电信、联通,也就是 SPA。这个 DNS 可以通过
ipconfig
查询这个地址。 - 如果 LNDS 仍没有命中,就直接到 Root Server 域名服务器请求解析。
- 根域名服务器返回给本地域名服务器一个所查询域的主域名服务器(gTLD)地址。gTLD是国际顶级域名服务器,如
.com、.cn、.org
等,全球只有13台左右。 - 本地域名服务器(Local DNS Server)再向上一步返回的 gTLD 服务器发送请求。
- 接受请求的gTLD服务器查找并返回此域名对应的 Name Server 域名服务器的地址,这个 Name Server 通常就是你注册的域名服务器。
- Name Server 域名服务器会查询存储的域名和 IP 的映射关系表,正常情况下根据域名得到目标的IP记录,连同一个 TTl 值返回给 DNS Server 域名服务器。
- 返回该域名对应的 IP 和TTl 值,Local DNS Server 会缓存这个域名和 IP 的对应关系。
- 把解析的结果返回给用户。
nslookup
命令查询域名解析的结果。
清除缓存的域名
DNS 域名解析后会缓存解析结果,主要在两个地方缓存: 1. Local DNS Server;2. 用户本地机器。
本机缓存的清除: 1. 在命令模式下执行ipconfig/flushdns
来刷新缓存;2. 重启
域名解析的方式
域名解析记录只要分为A记录、MX记录、CNAME记录,NS记录、TXT记录
- A(Address)记录:用来指定域名对应的IP地址,可以将多个域名地址解析到一个IP地址,但是不能讲一个域名解析到多个IP地址
- MX(Mail Exchange)记录:讲某个域名下的邮件服务器指向自己的Mail Server
- CNAME(Canonical Name)记录:别名解析就是可以为一个域名设置一个或多个别名
- NS记录:为某个域名指定DNS解析服务器
- TXT记录:为某个主机名或域名设置说明
CDN 工作机制
CND(Content Delivery Network),内容分布网络,是构筑在现有Internet 上的一种先进的流量分布网络。目的是通过现有的 Internet 中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户就近取得所有内容,提高用户访问速度。
imageCDN=镜像(Mirror)+缓存(Cache)+整体负载均衡(GSLB)
CDN 以缓存网站中的静态数据为主,如css、js、图片和静态页面等数据,用户从主站服务器请求到动态内容后再从 CDN 上下载这些静态数据,从而加速网页数据的下载内容。
CDN请求与处理流程:向Local DNS 服务器发送请求,一般经过迭代解析后回到这个域名的注册服务器解析(每个公司都会有一台DNS解析服务器),这个服务器会把请求重新CNAME解析到另一个域名,这个域名最终会指向CDN全局中的DNS负载均衡服务器,再由这个GTM来最终分配是哪个地方的访问用户吗,返回给离这个用户最近的CDN节点。
负载均衡
负载均衡就是对工作任务进行平衡,分摊到多个操作单元上执行。如图片服务器、应用服务器,共同完成工作任务。提高服务器响应速度及利用效率。
三种负载均衡架构分别是链路负载均衡、集群负载均衡、操作系统负载均衡
链路负载均衡:通过DNS解析到不同的IP,然后用户根据这个IP来访问不同的目标服务器
集群负载均衡:
- 硬件负载均衡:性能好,价格高
- 软件负载均衡:成本低,多次代理,网络延时