1. 合成URL
用户输入URL后浏览器根据输入的信息判断是搜索还是跳转网址,如果是搜索内容则将搜索内容 + 默认的搜索引擎组合成新的URL,如果用户数据的URL是合法网址则直接跳转至输入的URL网址。
2. DNS域名解析
浏览器通过DNS域名解析服务器将输入的域名 解析 为对应服务的IP地址,这样才能访问到域名指定的服务器。
本地DNS服务器查询
本地DNS服务器之间递归查询,在任意一步查询到域名时就会终止递归,返回域名对应的IP地址。
根域名服务器、顶级域名服务器、权威域名服务器
- 根DNS服务器负责 返回顶级域 DNS 服务器的 IP 地址,顶级域 DNS 服务器负责 返回权威 DNS 服务器的 IP 地址,权威 DNS 服务器负责 返回相应主机的 IP 地址
- 如果本地的DNS服务器无法查询,则迭代到根域名服务器、顶级域名服务器、权威域名服务器 查询。
3. 建立 TCP 连接
首先判断请求是否是https的,如果是则在http的基础上套上一层ssl/tls外壳,用于加密通信,每次传输的都是加密后的数据。
TCP三次握手连接:
- 第一次握手:建立连接,客户端发送连接请求报文,将SYN位置为1,seq为X,然后客户端进入SYN_SEND状态,等待服务器的确认。
- 第二次握手:服务器收到SYN报文段,服务器收到客户端的SYN报文段,就知道这是一个要建立连接的请求,然后服务器也回复一个SYN的报文段(seq为y),
并且附带ACK(ACK置为X+1)信息用于确认收到了第一次握手请求的信息。发送后服务端进入SYN_RECV状态。
- 第三次握手:客户端收到了服务器的SYN+ACK信息后,也返回一个ACK(ACK置为y+1)的确认报文。此后客户端和服务端都进入ESTABLISHED状态,完成三次握手。
SSL握手连接
- 第一阶段 :客户端向服务器发送握手请求,包括所支持的TLS版本和密码组合以供服务器选择,还有一个"client random" 随机字符串
- 第二阶段 :服务器对客户端进行回应,包括数据证书,服务器选择的密码组合和"server random" 随机字符串
- 第三阶段 :客户端对服务器发来的证书进行验证,确保对方的合法身份,验证过程具体为(1)检查数字签名(2)验证证书链(3)检查证书有效期(4)检查证书的撤回状态
- 第四阶段 :客户端向服务器发送另一个随机字符串"premaster secret"(预主密钥),这个字符串经过服务的公钥加密,只有服务器的私钥才能解密。
- 第五阶段 :服务器使用私钥解密 "premaster secret" 字符串
- 第六阶段 :生成共享密钥,客户端和服务器均使用 client random、server random、premaster secret,并使用相同的算法生成相同的共享密钥KEY。
- 第七阶段 : 客户端发送经过共享密钥 KEY 加密过的 "finished" 信号。
- 第八阶段 : 服务器发送经过共享密钥 KEY 加密过的 "finished" 信号。
- 第九阶段 :握手完成,之后双方通信使用 共享密钥 KEY 对称加密 安全通信。
4. 发送HTTP请求,服务器处理并返回请求
TCP连接建立后,浏览器就可以利用HTTP/HTTPS协议向服务器发送请求了。服务器接受到请求,就解析请求头,如果头部有缓存相关信息如if-none-match与if-modified-since,则验证缓存是否有效,若有效测返回状态码304,若无效则重新返回资源,状态码为200.
5. 关闭TCP连接
TCP四次挥手
- 第一次挥手 :客户端(也可以是服务器端)发送一个FIN报文段给服务器,然后客户端进入FIN_WAIT_1状态
- 第二次挥手 :服务器端收到了客户端发送的FIN报文段,向客户端回一个ACK确认报文,客户端进入FIN_WAIT_2状态
- 第三次挥手 : 服务器端向客户端发送FIN报文表示这是一个要关闭连接的请求,同事服务端进入LAST_ACL状态。
- 第四次挥手 :客户端收到服务器端发送的FIN报文,向服务端发送ACK确认报文,然后客户端进入TIME_WAIT状态,服务端收到ACK确认报文后关闭连接,客户端等待1-2MS后关闭连接。
6. 浏览器渲染
- 渲染进程将 HTML 内容转换为能够读懂DOM 树结构。
- 渲染引擎将 CSS 样式表转化为浏览器可以理解的styleSheets,计算出 DOM 节点的样式。
- 创建布局树,并计算元素的布局信息。
- 对布局树进行分层,并生成分层树。
- 为每个图层生成绘制列表,并将其提交到合成线程。合成线程将图层分图块,并栅格化将图块转换成位图。
- 合成线程发送绘制图块命令给浏览器进程。浏览器进程根据指令生成页面,并显示到显示器上。