看似简单的问题, 算是对这几天的记录做一个回顾.

更新


[2019-3-23]

Added

  • 新增IP协议描述
  • 新增ICMP协议描述

[2019-3-25]

Added

  • 补充检查浏览器缓存相关内容
  • 新增分析url
  • 新增提取url中的域名
  • 新增DNS解析相关过程

Changed

  • 更改DNS解析 -> 非转发模式相关条目

[2019-3-28]

Changed

  • 更改CDN位置
  • 分析url内部分组
  • TCP四次分手下的SYN -> FIN

Added

  • 新增超时重传机制
  • 新增滑动窗口机制

[2019-5-9]

Changed

  • 文章格式调整
  • 步骤更改
    • CDN应在DNS解析
    • 检查浏览器缓存应在DNS解析前

[2020-11-3]

Changed

  • 优化 DNS解析过程

[2020-11-7]

Changed

  • 优化 DNS 解析过程

[2020-11-14]

Fixed

  • SSL 握手应在 TCP 握手之后

一、过程


  • 输入关键词
  • 浏览器联想
  • 键入Enter
  • 分析url
    • url组成
      • 协议
      • 主机
      • 虚拟目录
      • url参数
  • 提取url中的域名
  • 检查浏览器缓存
    • Service Worker
      • 运行在浏览器背后的独立线程
      • 可用作缓存
    • Memory Cache
      • 内存缓存
      • 页面关闭释放
      • 一般用作JSCSS文件
    • Disk Cache
      • 磁盘缓存
      • 长期有效
      • 一般用作图片资源缓存
    • Push Cache
      • HTTP/2新功能
      • 在一次资源请求中, 服务器可以主动推送客户端可能需要的资源
      • 可与H5SSE(监听服务端发送事件)配合使用
    • New Request
  • DNS解析
    • 提取url中的域名信息
    • 检查浏览器缓存
    • 检查操作系统缓存的Hosts文件
    • 检查路由器缓存
    • 检查运营商提供的本地DNS服务器(localDNS)缓存, 不具有权威性
    • 检查是否在本地区域配置文件中, 返回解析结果, 具有权威性
    • localDNS 进行转发 or 非转发
      • 转发模式: localDNS 将域名解析请求转发给 CNAME 指向的 CDN 的 DNS 负载均衡系统
      • 非转发模式: 进行下一步
    • localDNS 进行递归 or 迭代查询
      • 递归查询:localDNSrootDNS 发起域名解析请求 => rootDNS 再去找顶级 DNS 服务器 => 顶级 DNS 找权威 DNS => 权威 DNS 将解析到的结果原路返回给 localDNS
      • 迭代查询:localDNS 向 rootDNS 发起域名解析请求 => rootDNS 返回顶级 DNS 服务器的地址给 localDNS => localDNS 再去找顶级 DNS => … => 最终得到解析结果
    • 本地DNS服务器接收到IP地址
      • 写入缓存
    • 返回给客户端
  • CDN
    • 提取url中的域名
    • 本地DNS服务器解析
    • 将域名解析权交给 CNAME 指向的 CDN 的 DNS 负载均衡系统
    • DNS负载均衡返回离用户最近的IP地址给本地DNS服务器
    • 本地DNS返回IP地址给用户
  • TCP三次握手
    • 客户端发送SYN(seq = x)到服务器, 进入SYN-SEND状态
    • 服务端发送SYN + (ACK = x + 1) + (seq = y)到服务器, 进入SYN-RECEIVED状态
    • 客户端发送ACK = y + 1, 确认接受连接, 双方进入ESTABLISHED状态
    • 超时重传机制
      • 停止等待ARQ
        • 正常传输
          • 一方发送数据报文, 在规定的时间内对方接收到应答, 就取消定时器
        • 报文丢失
          • 发送备份的数据
        • ACK超时
          • 重传报文
      • 连续ARQ
        • 滑动窗口机制
          • 控制流量
  • TLS/SSL四次握手
    • Client Hello(随机数X, 支持的加密方法)
    • Server Hello(rsa公钥, 随机选取客户端支持的加密方法, 随机数Y, 证书)
    • Client生成随机数secret, 发送使用公钥加密后的secret
    • Server通过私钥解密secret, 利用X、Y、secret生成session-key(唯一的对话密钥)
  • IP、ICMP
    • IP
      • 寻址
        • 路由功能
      • 分段
        • 数据包的分片和重组, 以适应数据链路层的传输限制
    • ICMP
      • ping命令
      • 报告无法传送的数据包的错误
  • ARP
    • 地址解析协议
    • IP地址 -> MAC地址(路由器、网卡的‘身份证号’)
  • 以太网
    • 信道传输
  • 回溯⬆
  • 服务端返回各种资源
  • 浏览器渲染机制
    • 解析构建DOM树
      • 浏览器根据html文件的编码方式, 将字节转化为对应字符
      • 将字符串转化为符合H5标准的令牌(尖括号字符串)
      • 转化为对应的DOM节点, 并完善其属性
      • 根据节点的对应关系构建DOM树
    • 解析构建CSSOM树
      • 浏览器根据css文件的编码方式, 将字节转化为对应字符
      • 将字符串转化为符合H5标准的令牌(尖括号字符串)
      • 将令牌转化为相应的CSS Rules样式对象
      • 根据CSS样式的层级关系, 构建CSSOM树
    • 构建Render Tree
      • 从DOM树的根节点开始遍历
      • 只添加可见节点
    • 计算节点(flow)
    • 绘制(paint)
  • TCP四次分手
    • 客户端发送FIN + (seq = x)至服务器, 进入FIN-WAIT-1状态
    • 服务端发送(ACK = x + 1) + (seq = y)到客户端, 进入CLOSE-WAIT状态, 此时仍然可以发送数据到client
    • 等待资源发送完成, 再次发送FIN + (seq = z)到客户端, 进入LAST-ACK状态, 此时客户端进入FIN-WAIT-2状态.
    • 客户端发送(ACK = z + 1)确认应答, 通过延时确认机制, 等待2MSL, 确保服务端接收到消息.

参考


DNS原理及其解析过程