输入url到获取响应过程详解

以请求http://www.baidu.com为例

1.构建请求


浏览器通过输入的url来解析要请求的是什么协议,构建请求报文,这里要构建的就是HTTP请求报文
HTTP请求报文包括报文首部和报文主体,对请求报文来说,报文首部包括请求行和各种首部字段,而对响应报文来说,报文首部包括状态行和各种首部字段

请求行:GET/HTTP/1.1 (请求方法和相应的协议)
状态行:HTTP/1.1 200 OK (相应的协议和状态码)
各种首部字段:诸如上文提到的Cache-Control和Expires,还有If-No-Match,If-modified-since,Etag等
报文主体:在get请求中没有,post请求中向服务器发出的数据,响应报文中为服务器返回给客户端的内容

下面就是www.baidu.com对应的请求头首部字段
在这里插入图片描述

2. 强/本地缓存的查找


通过请求报文,找到本地相应资源的响应报文,查看expires或cache-control来判断是否使用强缓存
如果缓存资源还没有过期,那么就使用本地缓存的资源,返回状态码304,如果资源已过期,那么接着执行
具体内容移步强缓存和协商缓存

3. DNS解析


我们请求的时候,请求的地址是IP地址,所以要将我们写的url地址转换为IP地址,就需要DNS解析
在解析的时候,首先查看本地DNS服务器是否有相应域名对应的IP地址,如果有的话,直接返回请求该IP地址
如果没有的话,根据该地址向根域名服务器发起请求,获取对应的顶级域名服务器的地址,向该顶级域名服务器发起请求,获得对应的权限域名服务器对应的地址,然后返回最终的IP地址
返回的时候,不仅会返回到要请求的地方,还将该地址缓存到本地DNS服务器

4. 建立TCP连接


获得对应的IP地址后,就等于我们知道了服务器所在的地方,那么对于HTTP请求来说,下一步就是发起TCP连接了
首先,我们要进行三次握手建立TCP连接

5. 发起HTTP请求


在TCP连接建立好之后,就可以从浏览器向服务端发送HTTP请求报文了

准备好HTTP请求报文后,就向服务器发起HTTP请求,然后等待服务器返回响应报文

在这个过程中,根据该HTTP连接的方式,会有不同的处理方式

短连接

如果是短连接的话,在这次HTTP请求发出得到响应后,便会四次挥手关闭TCP连接,在下一次要连接时重新建立HTTP连接,这是HTTP1.0中默认的连接方式

长连接

如果是长连接的话,在这次HTTP请求发出得到响应后,不会关闭TCP连接,而是会继续通过该连接,发起HTTP请求。当然,可以通过和服务器协商,关闭这个连接,可以通过connection值是否为Keep-Alive来判断,若服务器想明确断开连接的话,将connection的值设为close就可以了
然而,长连接存在一定的问题,同一个连接中的请求,是不能并行发起的,也即是说,只能等上一个请求得到响应后才能发起下一个请求,如果其中一个请求需要很长的时间,那么就会阻塞所有请求
当然,我们可以采用发起并行的HTTP连接来解决这个问题,这样我们可以同时发起几个请求,但始终还是会造成多次握手,而且请求的并行量也只限于建立的HTTP连接数
长连接是HTTP1.1中默认的连接方式,若想在HTTP1.0中使用,只要给connection字段添加Keep-Alive值就可以了

连接复用

在HTTP2.0中,出现了连接复用,允许在一个TCP连接中发起并行的HTTP请求,通过这种方式,解决了长连接出现的问题

6. 协商缓存


在发起HTTP请求后,我们所获取的资源还不一定是最新的资源,要先通过协商缓存来判断是否使用缓存
通过在请求中添加If-Modified-Since字段和If-None-Match字段来向服务器确认当前资源是否继续使用缓存
具体内容移步强缓存和协商缓存

7. 获取响应

通过强缓存,协商缓存,最后不管是在缓存,还是在一些缓存的服务器上,又或者是在源服务器上,我们最终拿到了响应资源,将其渲染到页面上
在这里插入图片描述
请求http://www.baidu.com实际上就返回了这样的html文本

发布了178 篇原创文章 · 获赞 12 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/zemprogram/article/details/103571616