这一道经典的面试题,相信都不陌生,并且它的这个过程其实能够囊括前后端的通信流程,可以将动态网站实现简单的呈现一下,下面也是简要总结一下,具体还需要自己真正将图解HTTP这本书好好看完之后能够认识的更加完善,等到以后再慢慢完善
下面以访问baidu页面来做一个过程分析
输入 URL:http://www.baidu.com
DNS 域名解析
计算机无法识别域名,计算机与计算机之间要想进行通信,必须通过ip地址用来定位该计算机所在的位置
在浏览器中,输入的ip地址或者域名,默认给你加了一个80端口号(对方的服务器监听的就是80端口)
158.12.25.652 域名就是为了好记
为了好记,所以我们的万维网提供了 一个 域名这样的概念
当你输入了 ip 地址后,浏览器会自动去 找DNS域名解析服务器,
建立 TCP 连接(Socket):三次握手,确保这个一定是一个有效的请求和响应,这个三次握手在业界相信大多数人都不陌生,虽然它是提高了传输的有效性,但是这个导致的直接问题就是整个传输过程是很耗时的,也就是说每次http请求都会经历三次握手这个过程,消耗的时间也是不言而喻,并且传统的http协议规定一次请求只能请求一个文件,所以一些顶级网站千方百计的采取一些减少http请求的策略,大多数就是采取一次http请求能够请求多个文件这样的实现,欣喜的是,http2.0已经支持能够一次http能够请求多个文件,这个还是值得期待全部推行开来的,只不过肯定需要过上一段时间,慢慢去等待推行吧。
将用户输入的地址封装成 HTTP Request 请求报文 发送到服务器
浏览器将用户输入的 URL 地址根据HTTP协议 封装成了 http 请求报文(请求头+请求行+请求体)
该报文说白了也就是字符串而已,最终也要被转成了二进制数据再发送到服务器
后台服务器接收到用户HTTP Request 请求报文
后台服务器接收到 客户端发送给自己的数据(二进制数据)
- 首先把二进制数据按照编码解析成字符,(人类可以识别的)
- 解析成字符之后,再按照 HTTP 协议规范中定义的格式解析出来
后台服务器处理用户请求信息
当得到用户请求报文之后,根据请求报文中的 get、port或者 URL、或者URL中的查询字符串或者 请求体中的数据
根据用户的特定的请求数据做特定的处理
后台服务器将相应结果封装到 HTTP Response 响应报文中 发送给客户端
当我们解析和处理完用户请求报文消息之后
服务器开始将具体的 要发送给客户端的数据 根据 HTTP 协议规范 封装成 HTTP协议响应报文
响应头、响应字段、响应体
该数据说白了也是具有特定格式的字符串而已,最终这个字符串也要转换成二进制数据发送到客户端
发送到客户端也是通过 Socket(ip地址、端口号) 发送到了该客户单
用户浏览器接收到响应后开始渲染html、css,解析和执行 JavaScript 代码
当客户端解析到 服务器发送过来的 二进制数据
客户端浏览器也会将 二进制数据 根据编码类型解析成 字符串
然后根据 HTTP 协议,解析服务器发送过来的 响应报文
然后根据响应报文中的报文内容(报文头、报文体)做具体的解析
当浏览器在解析的过程中遇到 一些静态资源时,会再次重复上面的步骤