# DNS解析

域名从右向左分为顶级域名、二级域名、三级域名依次类推

输入url过后,先查找浏览器是否有dns缓存,没找到再查找host文件是否有记录。没找到再去本地的dns服务器查找是否有缓存。然后再去计算机上配置的dns服务器上是否有缓存,还是没有就去查找根dns服务器,全球13台,固定ip地址,然后判断.com域名是哪个服务器管理。找到过后就返回ip。

浏览器 -> 系统 -> 路由器 -> ISP(互联网服务提供商,也就是域名系统)

前端dns优化

<meta http-equiv="x-dns-prefetch-control" content="on" />
<link rel="dns-prefetch" href="http://bdimg.share.baidu.com" />

# 拿到ip过后就进行TPC解析

首先建立三次握手

为什么是三次握手:第一次握手,主机A发送SYN=1的TCP包给服务器,并且随机产生一个作为确认号。主机B收到SYN码过后,确认主机A的发送能力正常。第二次握手,主机B收到请求后,向A发送确认号(主机A的seq+1),syn=1 ,seq = 随机数的TCP包。第三次握手,主机A收到后检车确认号是否正确,可以确定主机B发送能力和接受能力正常,但是目前不清楚主机A的接受能力是否正常,因为主机B不知道第二次握手是否成功,所以才有了第三次握手。也就是主机A会再次发送确认号(主机B的seq+1),ack=1,主机B收到后检查是否正确则建立成功。

# 发送HTTP请求

握手完毕过后,客户端发起html资源请求,服务器判断请求头中的资源过期时间,答复客户端是从本地缓存取资源还是服务器返回最新的资源。缓存方式通过判断cache-control如果是no-cache就是协商缓存。如果没有no-cache则会取expires的命中强缓存,来对比是否过期。 协商缓存:if-none-match 搭配 etag。 if-modifed-since搭配 last-modified。命中协商缓存。请求返回304。如果不一致有改动,则返回新的过期时间或etag,并返回200. 什么是from disk cache和from memory cache:强缓存触发,也就是硬盘加载还是从内存加载。先查找内存,再查找硬盘,如果都没有则进行网络请求之后再缓存到硬盘和内存。

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

# 浏览器解析渲染页面

  1. 构建dom树,从上到下解析html文档生成dom节点树
  2. 加载解析样式生成css树
  3. 加载并执行js
  4. 构建渲染树,render tree,根据dom树和css树,生成渲染树
  5. 渲染树,按顺序展示在屏幕上的一系列带有字体,颜色,尺寸等属性的矩形
  6. 布局layout:根据渲染树将节点树的每一个节点布局到屏幕上的正确位置
  7. 绘制:遍历渲染树绘制所有节点,为每一个节点适应对应的样式 连接结束。
  • 构建请求
  • 查找缓存
  • 准备 IP 和端口
  • 等待 TCP 队列
  • 建立 TCP 连接
  • 发起 HTTP 请求
  • 服务器处理请求
  • 服务器返回请求和断开连接