一个页面输入URL到页面加载显示完成,中间发生了什么?

  1. 在浏览器地址栏输入URL
  2. 浏览器查看缓存,如果请求资源在缓存中并且新鲜,跳转到转码步骤
  • 如果资源未缓存,发起新请求
  • 如果资源已缓存,查看缓存是否新鲜,新鲜提供给客户端,否则与与服务器验证
  • 检验新鲜通常有两个http头控制,Expires值为一个绝对时间表示缓存新鲜日期,cache-control值为以秒为单位的最大新鲜时间
  1. 浏览器解析URL获取协议、主机、端口、path
  2. 浏览器组装一个http请求报文
  3. 浏览器获取主机IP地址
  • 浏览器缓存
  • 本机缓存
  • hosts缓存
  • 路由器缓存
  • ISP DNS缓存
  • DNS递归查询(可能存在负载均衡导致每次IP不一样)
  1. 打开一个socket与目标IP地址,端口建立TCP连接三次握手
  • 客户端发送一个TCP的SYN=1,Seq=X的包到服务器端口
  • 服务器返回SYN=1,ACK=X+1,Seq=Y的响应包
  • 客户端发送ACK=Y+1,Seq=Z
  1. TCP建立后发送HTTP请求
  2. 服务器接受请求并解析,将请求转发到服务程序,如虚拟主机使用HTTP Hosts头部判断请求的服务程序
  3. 服务器检查HTTP请求头中是否包含缓存验证信息,如果验证缓存新鲜,则返回304等对应状态码
  4. 处理程序读取完整请求并准备http响应,可能需要查询数据库操作
  5. 服务器将响应报文通过TCP连接发送给浏览器
  6. 浏览器接收http响应,然后根据情况选择关闭TCP连接或者保留重用,关闭TCP连接的四次握手
  7. 浏览器检查响应状态码,是否位1XX,3XX,4XX,5XX,这些情况处理与2XX不同
  8. 如果资源可缓存,进行缓存
  9. 对响应进行解码(例如gzip压缩)
  10. 根据资源类型决定如何处理
  11. 解析HTML文档,构建DOM树,下载资源,构建CSSDOM树,执行JS脚本,这些操作没有严格的顺序
  12. 显示页面

一个页面输入URL到页面加载显示完成,中间发生了什么?

上一篇:极简 Node.js 入门 - 4.3 可读流


下一篇:idhttp验证用户和密码