从点击url到浏览器显示页面,这个过程中发生了什么?

从点击url到浏览器显示页面这个过程可以分为六步

浏览器通过域名找出其IP地址(DNS解析)

客户端先检查本地是否有对应的IP地址,若找到则返回响应的IP地址。若没找到则请求上级DNS服务器,直至找到或到根节点。(浏览器缓存系统缓存路由器缓存ISP DNS缓存从根域名服务器递归搜索) 注意⚠️:

  1. URL和域名的区别:域名:需要注册和购买,域名经过解析为ip地址。。。就是说用ip地址和域名都可以访问同一资源。url:简单说网址=ip或域名 + 端口号 + 资源位置 + 参数 + 锚点
  2. IP 地址与域名的关系:多个提供相同服务的服务器 IP 可设置为同一个域名,但同一时刻一个域名只能解析出一个 IP地址。
    一个 IP 地址可以绑定多个域名。
  3. 若修改hosts文件,可自己指定域名的IP,绕过DNS。

浏览器和服务器建立连接(TCP/TP三次握手)

  1. 客户端发送SYN包到服务器,等待服务器确认接收。(浏览器问服务器:我可以连接你吗?)
  2. 服务器确认接收SYN包并确认客户的SYN,并发送回来一个SYN+ACK的包给客户端。(服务器:好,连吧)
  3. 客户端确认接收服务器的SYN+ACK包,并向服务器发送确认包ACK,二者相互建立联系完成TCP三次握手后,就可以开始传输数据了。(浏览器:嗯,那我连接了)

浏览器向服务器发送HTTP请求

建立连接成功后,浏览器给web服务器发送一个HTTP请求。

服务器接受到请求并返回HTTP响应

服务器接到请求后,会根据 HTTP 请求中的内容来决定如何获取相应的文件,并将文件发送给浏览器

浏览器解析渲染页面

浏览器根据响应先解析HTML文件构建DOM树,然后解析CSS文件构建渲染树,等到渲染树构建完成后,浏览器开始布局渲染树并将其绘制到屏幕上。

客户端和服务端发送四次数据包断开连接(四次挥手)

  1. 客户端主动关闭连接,发送FIN报文给服务器,然后进入FIN_WAIT_1状态。(浏览器问服务器:不早了,我该走了)
  2. 服务器收到FIN报文,回应一个ACK报文,进入CLOSED_WAIT状态;客户端收到FIN报文,进入FIN_WAIT_2状态。(服务器:知道了)
  3. 服务器向客户端发送FIN报文,进入LAST_ACK状态。(服务器:我也该走了)
  4. 客户端收到FIN报文后,向服务器发送ACK报文,进入TIME_WAIT状态,等待2MLS(它是任何报文在网络丢弃前在网络内的最长时间)后客户端就自动关闭。服务器在接收数据后经过判断无误后,服务器进入关闭状态。(浏览器回复:嗯,好的,然后等待2MLS。同时服务器那边收到浏览器的回复后断开连接)