Skip to content

输入URL到看见页面发生了什么

 at 03:31(Updated)

简单总结:

  1. 解析URL

    • 分析URL中的协议(http[s]://、域名、端口等,若不是有效链接则转为搜索
  2. 检查缓存 浏览器判断请求资源是否在本地缓存,如果有缓存并且在缓存有效期内,直接使用缓存内容

    这一步的缓存使用的是强缓存:Expires (http1.0) / Cache-Control (http1.1)

  3. DNS解析 举个例子,比如用户在浏览器中输入这个域名:123.abc.qq.com.cn

    1. 浏览器会先看自身有没有对这个域名的缓存、如果有、就直接返回、如果没有、就去问操作系统、操作系统也会去看自己的缓存、如果有、就直接返回、如果没有、再去主机文件看、也没有、才会去问LDNS。
    2. LDNS会去先看看自己有没有123.abc.qq.com.cn的A记录,要有就直接返回,要没有,就去看有没有abc.qq.com.cn的NS记录,如果有,就去问它要答案,如果没有,就去看有无qq.com.cn的NS的记录,如果有,就去问它,没有就去看有无com.cn的DNS,还没有就去看有无cn的DNS,如果连cn的NS记录都没有,才去问根。

    只有在各处都没有缓存的时候,我们才会问根。

    优化:

    • dns-prefetch
    <link rel="dns-prefetch" href="//g.alicdn.com"/>
    

    注:dns-prefetch需慎用,多页面重复DNS预解析会增加重复DNS查询次数。

    • dns负载均衡
  4. 建立TCP连接

    ACK(确认标志) 与 ack(确认号字段) 需要区分开

    三次握手:

    1. 客户端发送一个标志位 SYN = 1、序列号 seq = x 的数据包,客户端进入 SYN_SEND 状态,等待服务端确认
      • 标志位 SYN 表示要建立连接
      • 序列号 seq = x 表示向接收端发送的数据
    2. 服务端收到 SYN 包,必须确认客户的 SYN(ack=x+1),同时自己也发送一个 标志位 SYN = 1、标志位 ACK = 1、序列号 seq = y 、确认号 ack = x + 1 的数据包,服务端进入 SYN_RCVD 状态
      • 标志位 SYN 表示要建立连接
      • 标志位 ACK 表示收到了请求
      • 序列号 seq = y 表示向接收端发送的数据
      • 确认号 ack = x + 1 表示上一次握手发来的序列号 seq 的值 + 1
    3. 客户端发送一个标志位为 标志位 ACK = 1、确认号 ack = y + 1 、序列号 seq = x + 1 的数据包
      • 标志位 ACK 表示收到请求
      • 序列号 seq = x + 1 表示上一次握手发来的 ack 的值
      • 确认号 ack = y + 1 表示上一次握手发来的序列号 seq 的值 + 1

    四次挥手:

    1. 客户端发送一个标志位 FIN、序列号 seq = x 的数据包,客户端进入 FIN_WAIT_1 状态
      • 标志位 FIN 表示要释放连接
    2. 服务端防止还有数据没有传输完成,所以并没有发送标志位为 FIN 的释放连接数据包,而是先发送了一个确认收到的应答数据包 标志位 ACK = 1、序列号 seq = y、确认号 ack = x + 1。发送后,服务端进入 CLOSE_WAIT 状态。也就是告诉客户端:请求已经收到,但是我还没有准备好,请继续等待我释放连接的消息。当客户端收到之后,客户端进入 FIN_WAIT_2 状态。
      • 标志位 ACK 表示收到了请求,应答上次连接
    3. 服务端确认数据已经传输完成,向客服端发送 标志位 FIN = 1、标志位 ACK = 1、序列号 seq = z、确认号 ack = x + 1 的数据包,告诉客户端:服务器这边数据传输完成,已经准备好关闭连接了。服务端发送之后进入 LAST_ACK 状态。
      • 标志位 FIN 表示释放连接
      • 标志位 ACK 表示收到了请求,应答上次连接
    4. 客户端收到服务器发起的第三次挥手之后,已经知道可以关闭连接了,同时它需要应答服务端的最后一次确认,所以会向服务器发送 标志位 ACK、序列号 seq = x + 1、确认号 ack = z + 1 的数据包。发送成功后客户端进入 TIME_WAIT 状态。服务端收到后正式服务端正式断开连接,进入 CLOSED 状态。同时客户端在发送之后等待 2MSL 后依然没有收到回复则证明服务端已正常关闭,客户端随即也断开连接进入 CLOSED 状态。
  5. 发送HTTP请求

  6. 服务器处理请求并返回 HTTP 报文

  7. 浏览器解析渲染页面

js变量提升

所谓的变量提升,是指在JavaScript代码执行过程中,JavaScript 引擎把变量的声明部分和函数的声明部分提升到代码开头的“行为”。变量被提升后,会给变量设置默认值,这个默认值就是我们熟悉的 undefined。

js闭包

function f1(){

	var n=999;

	function f2(){
		alert(n);
	}

	return f2;

}

var result=f1();

result(); // 999

闭包的用途:

使用闭包的注意点:

浏览器渲染过程

vue双向绑定与响应式原理

双向绑定:

响应式:

Vue 采用的是数据劫持结合发布和-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。

image

EventLoop

宏任务:

微任务:

HTTP/1.1

HTTP/2

队头阻塞:

HTTP/1.1 使用持久连接时,一个连接中同一时刻只能处理一个请求。当前的请求没有结束之前,其他的请求只能处于阻塞状态。

Angular、Vue、React

区别

什么是Vue的渐进式

Vue的渐进式是指Vue框架的设计理念,它允许开发者逐步采用Vue的特性和功能来构建应用程序。这意味着你可以选择只使用Vue的核心库来进行简单的交互,也可以结合Vue的路由、状态管理和其他插件来构建更复杂的应用。

渐进式的Vue框架有什么优势