大致分为以下几步:
- URL 解析
- 查找本地缓存
- DNS 查询
- TCP 连接
- 发送HTTP请求
- 构建响应数据
- 浏览器接受响应
- 断开TCP连接
- 浏览器解析渲染页面
1.URL解析
判断浏览器输入的是搜索内容还是URL,生成http请求信息。 由于安全隐患,会使用 HSTS 强制客户端使用 HTTPS 访问页面(大部分浏览器的策略)。
一个完整的url包含方案、用户名、密码、主机名、端口、路径、参数、查询和片段
例如:http://admin:password@192.168.1.1/html/index.html?test&bmg
2.查找本地缓存
如果能找到缓存则直接返回页面,如果没有缓存则需要发送网络请求页面。
3.DNS查询
4.TCP连接
建立连接
TCP建立连接和断开连接(三次握手、四次挥手)以及相关几个问题
5.发送HTTP请求
6.构建响应数据
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
后端从在固定的端口接收到TCP报文开始,这一部分对应于编程语言中的socket。它会对TCP连接进行处理,对HTTP协议进行解析,并按照报文格式进一步封装成HTTP Request对象,供上层使用。这一部分工作一般是由Web服务器去进行,我使用过的Web服务器有Tomcat, Jetty和Netty等等。
7.浏览器接受响应
网络进程接收到响应数据后进行解析, 首先查看 Response header,根据不同状态码做不同的事(比如上面提到的重定向)。
8.断开TCP连接
9.浏览器解析渲染页面
- 解析HTML,构建DOM树
- 解析CSS,生成CSS规则树
- 合并DOM树和CSS规则,生成render树
- 布局render树(Layout/reflow),负责各元素尺寸、位置的计算
- 绘制render树(paint),绘制页面像素信息
- 浏览器会将各层的信息发送给GPU,GPU会将各层合成(composite),显示在屏幕上