浏览器输入 URL 后发生了什么

一、解析 URL

首先,用户输入 URL 后浏览器根据输入的信息判断是进行 “搜索” 还是进行 “跳转网址”。如果是搜索内容,则将搜索内容加上默认的搜索引擎组合成新的 URL。如果用户输入的 URL 是合法网址,则直接跳转至输入的 URL 网址。

二、DNS 域名解析

浏览器通过 DNS 域名解析服务将输入的域名 解析为对应服务的 IP 地址,这样才能访问到域名指定的服务器。DNS 域名解析的过程如下:

1. 本地 DNS 服务器查询

客户端会依次在 浏览器缓存、本地 hosts 文件、本地 DNS 服务器缓存、本地 DNS 服务器 去查询域名,如果在任意一步查询到域名,直接返回域名对应的 IP 地址。

2. 根域名服务器、顶级域名服务器、权威域名服务器

如果在本地 DNS 服务器查询不到。那么本地 DNS 服务器则向上级域名服务器进行查询。查询过程为:

  • 首先本地 DNS 服务器向 根域名服务器 发起请求,根域名服务器是最高层次的,他只会返回 顶级域名服务器 的地址
  • 然后本地 DNS 服务器拿到这个 顶级域名服务器 的地址后,向其发起请求,获取 权威域名服务器 的地址
  • 最后本地 DNS 服务器通过 权威域名服务器,得到该域名对应的 IP 地址

当本地 DNS 服务器获取到这个域名对应的 IP 地址后,会进行缓存到 本地 DNS 服务器缓存中。然后给客户端(浏览器),浏览器也会进行缓存。

需要注意的是,DNS 使用的 UDP 协议。

三、TCP 连接

接下来判断应用层协议,如果是 HTTPS 协议,则会在 HTTP 的基本上加上 SSL/TLS 协议,用于加密安全通信。

1. TCP三次握手连接

  • 第一次握手:客户端发送连接请求报文,将SYN位置为1,seq为X,然后客户端进入SYN_SEND状态,等待服务器的确认。
  • 第二次握手:服务器收到客户端的SYN报文段,就知道这是一个要建立连接的请求,然后服务器也回复一个 SYN+ACK 的报文段,其中 seq 为 y,ACK 为 x+1,用于确认收到了第一次握手请求的信息。发送后服务端进入SYN_RECV状态。
  • 第三次握手:客户端收到了服务器的 SYN+ACK 信息后,也返回一个ACK(ACK置为y+1)的确认报文。此后客户端和服务端都进入ESTABLISHED 状态,完成三次握手。

2. SSL握手连接

  • 第一阶段 :客户端向服务器发送握手请求,包括自己的 TLS 版本 和所支持的 加密方式列表 以供服务器选择,还有一个”client random” 随机数字符串
  • 第二阶段 :服务器对客户端进行回应,包括数字证书,服务器选择的 加密方式 和”server random” 随机数字符串
  • 第三阶段 :客户端对服务器发来的数字证书进行验证,确保对方的合法身份,验证过程具体为(1)检查数字签名(2)验证证书链(3)检查证书有效期(4)检查证书的撤回状态
  • 第四阶段 :客户端生成一个随机数字符串“pre_master”,然后将这个字符串经过服务器的公钥加密后,发送给服务器
  • 第五阶段 :服务器使用私钥解密这个随机数字符串“pre_master”。以上就是非对称加密的过程
  • 第六阶段 :那么此时,客户端和服务器均都有了相同的 client random、server random、pre_master,并使用相同的加密算法生成相同的对称密钥
  • 第七阶段 : 客户端发送经过对称密钥加密过的 “finished” 信号
  • 第八阶段 : 服务器发送经过对称密钥加密过的 “finished” 信号
  • 第九阶段 :握手完成,之后双方通信使用对称密钥 进行加密,保证了安全通信。

四、HTTP 请求,服务器处理并返回请求

传输层连接建立后,浏览器就可以利用 HTTP/HTTPS 协议向服务器发送请求了。

HTTP 报文一般包括:请求行、请求头、请求体。

请求行:GET / HTTP/1.1,表示请求方法是 GET,路径为根路径,HTTP 协议版本为 1.1。

请求头,允许客户端向服务器传递请求的一些附加信息和客户端自身的信息。

最后是请求体,也就是请求正文。

服务器接收到请求后,进行解析请求头,如果头部有缓存相关信息,如:if-none-matchif-modified-since,服务器则会验证缓存是否有效,若有效则返回状态码为 304(表示自从上次请求后,请求的数据未修改过。服务器返回此响应时,不会返回数据内容);若无效则重新返回资源,状态码为 200。

服务器返回的 HTTP 响应报文。一般包括:响应行、响应头、响应体。

响应行:HTTP/1.1 200 OK,表示 HTTP 协议版本,状态码和状态描述。

响应头:包含了服务器及其返回数据的一些信息,服务器生成数据的时间、返回的数据类型等待

响应体:服务器返回给浏览器的文本信息,通过是 HTML、CSS、JS、图片等文件

五、浏览器解析并渲染页面

浏览器拿到服务器返回的数据之后,进行构建 DOM 树、样式计算、布局阶段、分层、栅格化和显示等等步骤

六、断开连接

如果连接之间没有数据传输了,那么就需要断开连接。进入到 TCP 四次挥手的阶段。

  • 第一次挥手 :客户端(也可以是服务器端)发送一个 FIN 报文段给服务器,然后客户端进入FIN_WAIT_1 状态
  • 第二次挥手 :服务器端收到了客户端发送的FIN报文段,向客户端回一个ACK确认报文,客户端进入FIN_WAIT_2状态
  • 第三次挥手 : 服务器端向客户端发送 FIN 报文表示这是一个要关闭连接的请求,同时服务端进入 LAST_ACK 状态。
  • 第四次挥手 :客户端收到服务器端发送的FIN报文,向服务端发送ACK确认报文,然后客户端进入TIME_WAIT状态,服务端收到ACK确认报文后关闭连接,客户端等待 2MSL 时间(最大报文存活时间)后关闭连接。