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