HTTP - 2 - 从输入URL到页面展示,中间发生了什么?

请求过程

    1. 用户输入URL, 浏览器会根据用户输入的信息判断是搜索还是网址, 如果是搜索内容, 就将搜索内容+默认搜索引擎合成新的URL;如果用户输入的内容符合URL规则, 浏览器就会根据URL协议, 在这段内容上加上协议合成合法的URL
    1. 用户输入完内容, 按下回车键, 浏览器导航栏显示loading状态, 但是页面还是呈现前一个页面, 这是因为新页面的响应数据还没有获得
    1. 浏览器进程构建请求信息, 会通过进程间通信(IPC)将URL请求发送给网络进程
    1. 网络进程获取到URL, 先去本地缓存中查找是否有缓存文件, 如果有, 拦截请求, 直接200返回;否则, 进入网络请求过程
    1. 网络进程请求DNS返回域名对应的IP和端口号, 如果之前DNS数据缓存服务缓存过当前域名信息 ==> 直接返回缓存信息; 否则, 根据DNS解析出来的IP/PORT发起请求,如果没有PORT, HTTP默认80端口, HTTPS默认443端口,如果是HTTPS请求,还需要建立TLS(传输层安全性协议)连接.
    1. Chrome浏览器有个机制, 同一个域名同时最多只能建立 6 个TCP 连接, 如果在同一个域名下同时有 10 个请求发生, 那么其中 4 个请求会进入排队等待状态, 直至进行中的请求完成. 直至进行中的请求完成。如果当前请求数量少于6个, 会直接建立TCP连接
    1. TCP三次握手建立连接: http请求加上TCP头部(源端口号,目的端口号,和用于校验数据完整性的序号)向下传输
    1. 网络层在数据包上加上IP头部——包括源IP地址和目的IP地址, 继续向下传输到底层
    1. 底层通过物理网络传输给目的服务器主机
    1. 目的服务器主机网络层接收到数据包, 解析出IP头部, 识别出数据部分, 将解开的数据包向上传输到传输层
    1. 目的服务器主机传输层获取到数据包, 解析出TCP头部, 识别端口, 将解开的数据包向上传输到应用层
    1. 应用层HTTP解析请求头和请求体, 如果需要重定向, HTTP直接返回HTTP响应数据的状态code301或者302, 同时在请求头的Location字段中附上重定向地址, 浏览器会根据code和Location进行重定向操作;如果不是重定向, 首先服务器会根据 请求头中的If-None-Match 的值来判断请求的资源是否被更新, 如果没有更新, 就返回304状态码, 相当于告诉浏览器之前的缓存还可以使用, 就不返回新数据了;否则, 返回新数据, 200的状态码, 并且如果想要浏览器缓存数据的话, 就在相应头中加入字段: Cache-Control:Max-age=2000, 响应数据又顺着应用层——传输层——网络层——网络层——传输层——应用层的顺序返回到网络进程
    1. 数据传输完成, TCP四次挥手断开连接。如果浏览器或者服务器在HTTP头部加上Connection:Keep-Alive信息, TCP就一直保持连接。保持TCP连接可以省下下次需要建立连接的时间, 提示资源加载速度
    1. 网络进程将获取到的数据包进行解析, 根据响应头中的Content-type来判断响应数据的类型, 如果是字节流类型, 就将该请求交给下载管理器, 该导航流程结束, 不再进行;如果是text/html类型, 就通知浏览器进程获取到文档准备渲染
    1. 浏览器进程获取到通知, 根据当前页面B是否是从页面A打开的并且和页面A是否是同一个站点(根域名和协议一样就被认为是同一个站点), 如果满足上述条件, 就复用之前网页的进程, 否则, 新创建一个单独的渲染进程
    1. 浏览器会发出提交文档的消息给渲染进程, 渲染进程收到消息后, 会和网络进程建立传输数据的管道, 文档数据传输完成后, 渲染进程会返回确认提交的消息给浏览器进程
    1. 浏览器收到确认提交的消息后, 会更新浏览器的页面状态, 包括了安全状态、地址栏的 URL、前进后退的历史状态, 并更新web页面, 此时的web页面是空白页
    1. 渲染进程对文档进行页面解析和子资源加载, HTML 通过HTM 解析器转成DOM Tree(二叉树类似结构的东西), CSS按照CSS 规则和CSS解释器转成CSSOM TREE, 两个tree结合, 形成render tree(不包含HTML的具体元素和元素要画的具体位置), 通过Layout可以计算出每个元素具体的宽高颜色位置, 结合起来, 开始绘制, 最后显示在屏幕中新页面显示出来
      HTTP - 2 - 从输入URL到页面展示,中间发生了什么?