温馨提示
该文章距离上次更新已经过去了 1222 天,文章内容可能已经过时。
输入URL
URL
统一资源定位符(英语:Uniform Resource Locator,缩写:URL,或称统一资源定位器、定位地址、URL地址[1])俗称网页地址,简称网址,是因特网上标准的资源的地址(Address),如同在网络上的门牌。统一资源定位符
URL的组成部分:protocol://hostname[:port]/path/[;parameters][?query]#fragment
- protocol(协议)
- hostname(主机名)
- port(端口号)
- path(路径)
- parameters(参数)
- query(查询)
- fragment(信息片断)
当我们在浏览器中输入URL的时候,浏览器就会在历史记录、书签等地方智能匹配可能要输入的URL,之后给出智能提示让我们补全URL。
URL编码
一般来说URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其它文字和符号,所以,如果URL中有文字或者有一些有歧义的字符就必须编码后使用。具体可以看看这篇文章:为什么浏览器的URL要进行编码?
缓存检查
输入URL之后,浏览器在发送请求之前会进行缓存检查,过程如下:
浏览器的缓存分为两种:强缓存和协商缓存。
浏览器会先执行强缓存,也就是判断Expires和Cache-Control是否命中,如果命中,则直接从本地获取缓存资源。
Expires
GMT(格林尼治标准时间)格式的时间字符串,代表缓存资源的过期时间。
Expires需要在服务端配置,表示的是资源的过期时间。浏览器会根据客户端的时间跟Expires的过期时间对比,如果还未过期,则直接返回本地的资源。
Cache-Control
Cache-Control利用max-age来判断资源的最大生命周期,单位为秒。
例如:max-age=300 表示浏览器在这个请求正确返回时间的的300秒内,都会命中缓存。
Expires 和 Cache-Control 的区别
Expires是HTTP/1.0的产物,而Cache-Control是HTTP/1.1的产物,两者同时存在的时候Cache-Control的优先级高于Expires,所以Expires算是Cache-Control的兼容写法,在一些不支持HTTP/1.1的环境下,Expires就会被使用到。
Expires表示的是资源的到期时间,会出现一个问题,就是服务器和客户端的时间不统一的问题,会导致资源的到期时间并不是预期的,但是使用Cache-Control就不会有这个问题,因为Cache-Control表示的是资源的最大生命周期。
如果强缓存没有命中,则浏览器会开始给服务器发送请求,进行协商缓存(进行协商缓存之前要先进行DNS解析以及TCP链接),也就是Last-Modified / If-Modified-Since和Etag / If-None-Match。
Last-Modified / If-Modified-Since
Last-Modified:资源最后修改的时间,服务器在返回资源的时候,会放在Response Header中给客户端,浏览器会记录这个值。
If-Modified-Since:这个值是服务器发送资源携带的Last-Modified,客户端在发送请求的时候会把这个值放在Request Header中带给服务器,服务器会对比这两个值,如果两个值相同,则命中协商缓存。
Etag / If-None-Match
Etag:资源的唯一标识,服务器在返回资源的时候,会放在Response Header中给客户端,浏览器会记录这个值,只有当资源发送变化的时候Etag值才会变化。
If-None-Match:这个值是服务器发送资源携带的Etag,客户端在发送请求的时候会把这个值放在Request Header中带给服务器,服务器会对比这两个值,如果两个值相同,则命中协商缓存。
Etag 和 Last-Modified 的区别
Etag标识的是资源的唯一标识,而Last-Modified表示的是资源的最后修改时间,单位为秒,资源如果在1秒内变化了多次,那么Last-Modified是不会有变化的,而Etag则每次都会变化,所有Etag的精度是优于Last-Modified,且Etag的优先级是高于Last-Modified的。但是Etag在性能上会比Last-Modified差些,因为Etag要计算出一个唯一值(HTTP没有指定如何计算这个唯一值,一般是HASH),而Last-Modified只需要记录一个时间。
如果协商缓存命中了,则服务端返回状态码304,如果没有命中,则服务端会返回状态码200和新的Etag或者Last-Modified以及新的资源。
提示
- 有序列表使用 F5 刷新页面的时候,会绕过强缓存,但是不会绕过协商缓存。
- 使用 Ctrl + F5 强制刷新页面的时候,会直接从服务器加载资源,同时绕过强缓存和协商缓存。
无法被缓存的情况
- 经过HTTPS加密的请求
- POST请求
- 请求头中不包含 Last-Modified / Etag 或者 Cache-Control / Expires 的请求
- Header中包含 Cache-Control:no-cache ,pragma:no-cache(HTTP/1.0),或 Cache-Control: max-age=0 等告诉浏览器不用缓存的请求
- 需要经过Cookie等认证信息的请求
如果浏览器中没有强缓存也没有协商缓存,则直接向服务器发送请求。
DNS域名解析
域名解析
域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务。IP地址是网络上标识站点的数字地址,为了方便记忆,采用域名来代替IP地址标识站点地址。域名解析就是域名到IP地址的转换过程。域名的解析工作由DNS服务器完成。域名解析
通俗的讲,就是我们每次在浏览器输入的URL都是域名,但是这个域名并不是这个网站的真实地址,域名只是方便我们记忆的,而记录网站真实地址的是IP地址,所以要找到网站的真实地址,就必须通过DNS域名解析将我们输入的域名解析成IP地址。
DNS域名解析的详细过程可以看看这篇文章:DNS域名解析
建立TCP连接
在获取到IP地址之后,客户端就需要与该IP地址进行TCP连接,也就是TCP的三次握手。具体可以看看这篇文章:TCP的三次握手和四次挥手
发送HTTP请求
建立TCP连接之后,客户端可以开始给服务端发送请求。
服务器重定向
如果服务器设置了重定向,那么会返回301或者302状态码,表示永久重定向和临时重定向,也就是例如访问的是http://baidu.com,则会直接跳转到http://www.baidu.com。具体可以看看这篇文章:HTTP重定向
服务器响应请求
在服务器重定向的时候,其实已经算是服务器响应了请求,但是重定向之后客户端请求的资源才是用户想要看到的,一些大型的网站可能还不止一台服务器,也就是将应用部署在多台服务器上,然后通过反向代理将用户的请求分配给这些服务器。例如nginx服务器,用户发送请求时不是直接请求应用服务器,而是先请求nginx反向代理,nginx反向代理再去请求应用服务器,最后将请求返回给用户。
服务器处理完请求之后,会返回一个HTTP响应,HTTP响应和HTTP请求相似,会返回状态行,响应头以及响应体,状态行告诉客服端当前请求的状态,响应头中则包含了最开始说的缓存信息以及一些数据信息,响应体中则是客户端需要的信息。
浏览器渲染
浏览器在获取到服务端响应的信息之后,就开始进行渲染。具体可以看看这篇文章:浏览器渲染过程
连接结束
服务器响应完客户端请求之后,解除TCP连接,也就是进行TCP的四次挥手。具体可以看看这篇文章:TCP的三次握手和四次挥手