HTTP 踩入

141 阅读4分钟

URL 地址解析

http://

传输协议:能够把客户端和服务端通信的信息进行传输的工具。

常用的传输协议:

  • http 超文本传输协议:除了传输文本还可以传输媒体资源文件(流文件)XML格式数据
  • https: 更安全的http s:ssl加密传输
  • ftp: 文件传输协议 (把本地资源上传到服务端)

域名

给服务器通网后,会有两个ip地址(内网ip,外网ip)。不通过域名,直接用服务器的外网ip也能访问到服务器,但是ip很难记。(域名方便记忆)

DNS 域名解析

DNS 服务器(域名解析服务器),我们发送请求时所谓的DNS解析,其实就是根据域名在DNS服务器上查找到对应服务器的外网IP

DNS优化

  • DNS缓存:一般浏览器会在第一次解析后,默认建立缓存(时间很短,1min左右)
  • 减少DNS解析次数:发送请求的域名和服务器尽可能少
  • DNS预获取(dns-prefetch):在页面加载开始的时候就把当前页面中需要访问其他域名(服务器)的信息进行提前DNS解析,以后加载到具体内容部分可以不用解析了

TCP

建立TCP连接

三次握手之后就能保证前后端正常交流

  • 第一次握手:浏览器发起,告诉服务器我要发送请求了
  • 第二次握手:服务器发起,告诉浏览器我准备接收了,发吧
  • 第三次握手:浏览器发起,告诉服务器我要发了,接吧

断开TCP协议

四次握手后断开客户端与服务器的连接

  • 第一次:浏览器发起,发送服务器请求报文发送完了,你准备关闭
  • 第二次:服务器发起,告诉浏览器接收完请求报文,我准备关闭,你也准备
  • 第三次:服务器发起,告诉浏览器响应报文发送完毕,你准备关闭
  • 第四次:浏览器发起,告诉服务器响应报文接收完毕,我准备关闭,你也准备

经典面试题

用户输入地址到看到页面经历了什么?

请求阶段

  • URL 地址解析
  • DNS 域名解析
  • 和服务器建立TCP连接
  • 发送HTTP请求

响应阶段

  • 服务器得到并处理请求(http响应内容)

断开连接

  • 和服务器断开TCP连接

渲染页面

  • 客户端渲染服务器返回的内容

渲染页面

  • 生成DOM树,(渲染了所有的HTML标签)
  • 生成CSSOM树,(请求回来CSS后,渲染完CSS)
  • DOM树 + CSSOM树 =》RENDER-TREE(渲染树)
  • 按照 RENDER-TREE在设备的是口中进行结构和位置的相关计算(布局layout或重排/回流reflow)
  • 根据渲染树以及回流得到的几何信息得到节点的绝对像素(绘制painting或栅格化)

浏览器线程

浏览器是多线程的,但是js渲染或者页面渲染是单线程的

对于浏览器来说,没新建一个页卡访问一个页面就是开辟一个新进程,一个进程中会包含多个线程。

  • GUI渲染进程:渲染和绘制页面
  • JS引擎线程:运行和渲染JS代码

css样式渲染

  • link>引入:浏览器会开辟一个新的请求线程,专门去服务器加载css样式内容,此时GUI线程继续向下渲染,---异步操作
  • @import:不会开辟新线程,css没有加载回来下面的代码不会执行,---同步操作
  • 行内,内嵌式:css代码少 html代码回来了css也就回来了

回流和重绘

回流

元素的大小或者位置发生了变化,触发了重新布局导致渲染树重新计算布局和渲染

引发回流:

  • 添加或删除可见的DOM元素
  • 元素的位置发生变化
  • 元素的尺寸发生变化
  • 内容发生变化(文本变化或图片被另一个不同尺寸的图片替代)
  • 页面一开始渲染的时候
  • 因为回流是根据视扣大小来计算元素的位置和大小的,所以浏览器的窗口尺寸变化也会引发回流

重绘

元素样式改变(但宽高,大小,位置等不变)

outline,visibility,color,background-color....

重绘不是很耗性能,但是回流很耗性能,一旦发生回流重新计算完后还需要重绘。

回流一定会触发重绘,而重绘不一定会回流

避免DOM的回流

  • 动画效果应用到position属性为absolute或fixed的元素上(脱离文档流)