浏览器发起请求-> 解析域名得到ip进行TCP连接 ->浏览器发送HTTP请求和头信息发送->服务器对浏览器进行应答,响应头信息和浏览器所需的内容-> 关闭TCP连接或保持-> 浏览器得到数据数据进行操作。
1、构造请求
首先,浏览器构造请求行,信息如下
构建好之后,浏览器准备发起网络请求
//GET /api/article HTTP/1.1
2、查找缓存
在正在发起网络请求之前,浏览器会现在浏览器缓存中查询是否有请求的文件,其实浏览器缓存是一种本地保存的资源副本,以供下次请求时直接使用的技术。
当浏览器发现请求的资源已经在浏览器缓存中存有副本,它会拦截请求,返回该资源的副本,并直接结束请求。而不会再去源服务器中重新下载。这样做的好处:
● 缓解服务的压力,提升性能
如果缓存查找失败,则进入网络请求。
3、准备IP地址和端口
4、等待TCP队列
IP地址和端口已经准备好了,是不是可以马上建立TCP连接。
不行,因为Chrome有个机制,同一个域名同时最多只能建立6个TCP连接。如果请求书少于6个,直接进入下一步,建立TCP连接。
5、建立TCP连接
排队等待结束后,建立TCP连接
6、发送HTTP请求
服务端处理HTTP请求流程
历经千辛万苦,HTTP 的请求信息终于被送达了服务器。接下来,服务器会根据浏览器的请求信息来准备相应的内容。
1、返回请求
2、断开连接
通常情况下,一旦服务器向可短返回了请求数据,它就要关闭TCP连接。不过如果在浏览器或服务器在其头部信息加入
Connection:Keep-Alive
为什么很多站点第二次打开会很快
简要来说,很多网站第二次访问能够秒开,是因为这些网站把很多资源都缓存在了本地,浏览器缓存直接使用本地副本来回应请求,而不会产生真实的网络请求,从而节省了时间。同时,DNS 数据也被浏览器缓存了,这又省去了 DNS 查询环节。
输入url地址到浏览器显示页面发生了什么
我们首先回顾一下浏览器进程、渲染进程、和网络进程的主要职责。
● 浏览器进程主要负责用户交互、子进程管理和文件存储等功能。
● 网络进程是面向渲染进程和浏览器进程等提供网络下载功能。
● 渲染进程的主要职责就是把从网络上下载的HTML、JavaScript、CSS、图片等资源解析为可以显示和用户交互的页面。 因为渲染进程所有的内容都是通过网络获取的,会存在一些恶意代码利用浏览器漏洞对系统进行攻击,所有运行在渲染进程里的代码是不被信任的。这也是为什么Chrome会让渲染进程运行在安全沙箱中,就是为了保证系统的安全。
回顾了浏览器的进程架构之后,我们再结合上图我们从进程的角度,描述一下
1、浏览器进程接收到用户输入的URL请求,浏览器进程便将URL转发给网络进程
2、网络进程中发起真正的URL请求
3、网络进程接收到响应头数据,便解析响应头数据,并将数据转发给浏览器进程。
4、浏览器进程接收到网络进程的响应头数据之后,发送"提交文档"消息到渲染进程;
5、渲染进程接收到"提交文档"的消息之后,便开始准备接收HTML数据,接收数据的方式是直接和网络进程建立数据管道。
6、等文档数据传输完成之后,渲染进程会返回“确认提交”的消息给浏览器进程;
7、浏览器进程接收到渲染进程"确认提交"的消息之后,便开始移除之前旧的文档,然后更新浏览器进程中的页面状态。
所谓提交文档,就是浏览器主进程,将网络进程接收到的HTML数据提交给渲染进程