# 四.在浏览器地址栏键入 url,按下回车之后会经历什么事

# 1.URL 解析

一个 URL 包括协议,网络地址,资源路径

协议:最常用的比如 HTTP(超文本传输协议)FTP(文件传输协议)

网络地址:可以是域名或者 ip 地址,包括端口号,如果没有默认为 80 端口

如果是不合法的地址,会转给默认的搜索引擎,例如如果你正在使用 chrome,可以在 url 输入框输入你想要的搜索内容,然后搜索引擎会根据关键字进行搜索

# 2.DNS 域名解析

# 1.先到各种缓存信息中查找

先到浏览器缓存记录中查找----浏览器会缓存 DNS 一段时间

系统缓存----如果浏览器中没有找到,浏览器会有一个系统调用,获得系统缓存中的记录

路由缓存---接着讲请求发给路由器,路由器一般也有自己的 DNS 缓存

# 2.DNS 服务器查找

没有则发送请求到本地域名服务器,每一个本地域名服务器都维护一个高速缓存,存放最近用过的域名及其 ip 地址,如果还没有则发出递归查询(本地服务器请求比他高一级的服务器,如此递归直到根域名服务器,肯定能找到这个服务器的 IP 地址)通过这个 IP 可以找到客户端服务器端的唯一路径

# 3.浏览器主机根据 ip 地址与服务器建立 TCP 连接

浏览器向服务器端发送 SYN 连接请求,经过服务器与浏览器三次报文的交互连接建立完成,就可以发送数据了。

找到了正确的 IP 地址以后就要开始建立连接了,建立连接的过程一般会使用 TCP 协议,通过三次握手建立连接。

# TCP 三次握手

客户端发出建立连接的请求,数据包携带有 SYN

如果服务端有开放的端口,可以接受并建立连接,那么服务端会返回 SYN+ACK,告诉客户端我可以接受你的请求。

客户端收到服务端的回应,发送 ACK 给服务端,连接建立。

# 4.发送 HTTP 请求

与服务器建立了连接后,就可以向服务器发送请求了

根据 HTTP 协议的要求,组织一个 HTTP 数据包,向服务器发送 HTTP 请求,HTTP 的请求报头有请求行和请求报头,空行

在浏览器中查看报文首部

请求行包括请求方法,URI,HTTP 版本。首部字段传递重要信息,包括请求首部字段,通用首部字段和实体首部字段。我们可以从报文中看到发出的请求的具体信息。具体每个首部字段的作用

# 5.服务器处理请求

服务器收到请求并响应,生成一个 HTTP 响应报文,通过 TCP 协议发送给浏览器主机

通过 HTTP 请求服务器后,服务器会向浏览器返回一个应答信息----HTTP 响应。

在 HTTP 里,有请求就会有响应,哪怕是错误信息,这里我们同样看下响应报文的组成结构。

在响应结果中都会有一个 HTTP 状态码,比如我们熟知的 200、301、404、500 等。通过这个状态码我们可以知道服务端的处理是否正常,并能了解具体的错误。

状态码

  • 1xx:信息性状态码
  • 2xx:成功状态码
  • 3xx:重定向状态码
  • 4xx:客户端错误状态码
  • 5xx:服务端错误状态码

# 6.端开 TCP 连接

为了避免服务器与客户端双方的资源占用和损耗,当双方没有请求或响应传递时,任意一方都可以发起关闭请求。与创建 TCP3 次握手类似,关闭 TCP 连接时需要 4 次握手。

  • 客户端发起中断请求,发送 FIN 到服务端

  • 服务端收到请求,可能数据还没有发完,这个时候不会关闭 socket,而是回复 ACK,告诉客户端知道了

  • 客户端进入 Fin_Wait 状态,继续等待服务端的 FIN 报文。服务端发送完毕后,回想客户端发送 FIN

  • 客户端收到回复后就回复 ACK,并关闭连接

# 7.浏览器解析文件

浏览器通过解析 HTML,生成 DOM 树,解析 CSS,生成 CSS 规则树,然后通过 DOM 树和 CSS 规则树生成渲染树。渲染树与 DOM 树不同,渲染树总并没有 head,dispaly 为 none 等不必显示的节点。

浏览器的解析过程并非是串连进行的,比如在解析 CSS 的同时,可以继续加重解析 HTML,但在解析执行 JS 脚本时,会停止解析后续 HTML,这就会出现阻塞问题

# 8.浏览器布局渲染

根据渲染树布局,计算 CSS 样式,即每个节点在页面中的大小和位置等几何信息,HTML 默认是流式布局的,CSS 和 js 会打破这种布局,改变 DOM 的外观样式以及大小和位置,这时就要提到两个重要概念:重排和重绘

我们应该尽量减少重排和重绘,良好的 css 规范会减少这种操作

最后浏览器绘制各个节点,将页面展示给用户