用户从输入url到显示页面这个过程发生了什么

361 阅读4分钟

URL解析

当我们输入一个地址 www.baidu.com ,首先会把该 URL 解构

URL 的格式

protocol :// hostname[:port] / path / [;parameters][?query]#fragment

URL的构成

  • protocol(协议)
  • hostname(主机名)
  • port(端口号)
  • path(路径)
  • parameters(参数)
  • query(查询)
  • fragment(信息片断)

域名解析

域名注册商有 DNS服务器, 它可以将我们输入的 URL解析到一台 WEB 服务器的 IP地址上。

什么是 DNS

DNS也叫做域名系统,它将域名和 IP映射成为一个分布式数据库, 它可以帮助我们将域名转换为 IP 地址。

客户机域名解析的顺序

  1. 用户在浏览器中输入 www.fxiaoe.com
  2. 首先会查看本地DNS缓存, 如果本地没有缓存,
  3. 再查看本地hosts文件, 如果hosts文件中未找到映射,
  4. 从本地TCP/IP配置中的首选的DNS服务器查询, 如果还未查询到,
  5. 则从备用DNS服务器查询。

服务器域名解析的顺序

  1. 本地 DNS 服务器会调用域名解析函数,
  2. 默认情况下, 解析器先向根域名服务器发起解析请求(.)
  3. 再由根域名逐级向下级域名查询。
  4. 如果配置了转发器, 解析器会多次向响应的根域名、顶级域名、权威域名发起解析请求。

总结一下,客户机属于递归查询, 服务器属于迭代查询

DNS常见的记录类型

  • 主机记录(A记录)

    返回域名指向的IP地址

  • 别名记录(CNAME记录)

    返回另一个域名,即当前查询的域名是另一个域名的跳转

  • 域名服务器记录(NS记录)

    返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。

DNS优化

dns-prefetch

**dns-prefetch**是DNS 预解析技术, 浏览器页面加载时会提前解析页面内的其他域名,当我们点击网址的时候,无需等待预等待解析。

如何使用dns-prefetch

<meta http-equiv="x-dns-prefetch-control" content="on" />   //开启dns-prefetch
<link rel="dns-prefetch" href="https://www.baidu.com" />

建立TCP连接

三次握手建立连接

  1. 客户端向服务器发送一个连接请求
  2. 服务器收到连接请求后,若同意连接, 则发送一个确认响应
  3. 客户端收到后, 回应服务器已收到。

为什么要进行三次握手?

一些因网络阻塞等原因,让失效的客户端请求,延迟请求到服务器上, 服务器触发误确认的操作。

当我们发出一个客户端连接请求后, 由于网络原因,请求会延迟在网络的某个节点上, 若客户端未收到服务器响应的确认连接,客户端会再次发送一次连接请求, 第二次请求同样延迟, 这时服务器收到第一次链接请求, 成功建立TCP连接, 传输完毕数据又释放了连接,释放结束后,第二次客户端的连接请求才到达服务器, 若没有第三次握手, 服务器会认为客户端又需要建立连接, 但其实并不是新的连接, 而是上一次的延迟连接请求。

发送HTTP请求

负载均衡

用户发起的请求都指向调度服务器(反向代理服务器,譬如安装了nginx控制负载均衡),然后调度服务器根据实际的调度算法,分配不同的请求给对应集群中的服务器执行,然后调度器等待实际服务器的HTTP响应,并将它反馈给用户。

http报文结构

报文一般包括了:通用头部请求/响应头部请求/响应体

状态码

1xx——指示信息,表示请求已接收,继续处理
2xx——成功,表示请求已被成功接收、理解、接受
3xx——重定向,要完成请求必须进行更进一步的操作
4xx——客户端错误,请求有语法错误或请求无法实现
5xx——服务器端错误,服务器未能实现合法的请求

服务器处理请求

服务器返回一个 HTTP 响应

浏览器显示 HTML

接受完从服务器发送至浏览器的内容之后,浏览器渲染网页,把网页内容呈献给用户。

1. 解析HTML,构建DOM树

2. 解析CSS,生成CSS规则树

3. 合并DOM树和CSS规则,生成render树

4. 布局render树(Layout/reflow),负责各元素尺寸、位置的计算

5. 绘制render树(paint),绘制页面像素信息

6. 浏览器会将各层的信息发送给GPU,GPU会将各层合成(composite),显示在屏幕上

连接结束

客户端与服务端断开连接,进行四次挥手