Contents
  1. 1. 一、首先提两个问题
    1. 1.1. 1. 一个页面从输入URL到页面加载完成,这个过程都发生了什么?
    2. 1.2. 2. 如何把一个URL 变成一个屏幕上显示的网页?
  2. 2. 二、网络通讯
    1. 2.1. 1. HTTP
    2. 2.2. 2. HTTP method
    3. 2.3. 3. HTTP Status code(状态码)和 Status text(状态文本)
      1. 2.3.1. response line 的状态码以及所表达的意义
    4. 2.4. 4. HTTP HEAD
    5. 2.5. 5. HTTP Request Body
  3. 3. 三、HTTPS
    1. 3.1. 1. HTTPS 的作用
    2. 3.2. 2. HTTPS 如何加密
      1. 3.2.0.0.0.1. https 是通过首先和服务端建立一条 TLS 加密通道,然后使用加密通道来传输http 的内容
  • 4. 四、HTTP2
    1. 4.1. 1. HTTP2 的改进
  • @[toc]

    一、首先提两个问题

    1. 一个页面从输入URL到页面加载完成,这个过程都发生了什么?

    1. 当发送一个URL 请求,不管这个页面是URL web 页面的URL 还是Web 页面上每个资源的URL ,浏览器都会开启一个线程去处理这个请求,同时在远程DNS 服务器上启动一个DNS查询,使得浏览器获得对应的ip地址
    2. 浏览器和远程服务器通过TCP 三次握手建立一个TCP/IP 连接。(该握手包括一个同步报文,一个同步-应答报文,一个应答报文,这三个报文在浏览器和服务器之间传递)该握手首先由客户端尝试建立通信,然后服务器应答并接受客户端的请求,最后由客户端发出该请求已经被接受的报文
    3. 一旦TCP/IP 连接建立,浏览器就会通过该链接向远程服务器发送http 的get 请求。远程服务器找到资源并使用http 响应返回该资源,值为200 的HTTP 响应状态表示一个正确的响应
    4. web 服务器提供该资源服务,客户端开始下载资源

    2. 如何把一个URL 变成一个屏幕上显示的网页?

    1. 浏览器首先使用http 协议或者https 协议,向服务器请求页面
    2. 把请求回来的HTML 代码经过解析,构建成DOM 树
    3. 计算dom 树上的css 属性
    4. 最后根据css属性对元素逐个进行渲染,得到内存中的位图(点阵图,是由像素的单个点组成的,这些点可以进行不同的排列和染色构成图样)
    5. 一个可选的步骤是对位图进行合成,这会极大的增加后续绘制的速度
    6. 合成之后,再绘制到界面上

    需要知道的是:
    从http请求回来开始,这个过程就并非一般想象中的一步做完再做下一步,而是一条流水线

    从http请求回来,就产生了流式的数据,后续的DOM 树构建,css计算,渲染,合成,绘制,都是尽可能的流式的处理前一步的产出;即不需要等到上一步完全结束,就直接开始上一步的输出,这样我们在浏览网页时,才会看到逐步出现的页面。

    二、网络通讯

    1. HTTP

    • http协议是基于tcp协议出现的,对于tcp协议来说,tcp是一种双向的通讯信道
    • http 在tcp 的基础上,规定了Request-Response 的模式。这个模式决定了通讯必定是由浏览器首先发起的
    • http 协议是纯粹的文本协议,规定了使用tcp 协议来传输文本格式的一个应用层协议
      在这里插入图片描述
    1. 请求部分:第一行被称作 request line,分为三个部分:http method(请求方法),请求路径和请求的协议和版本

      1
      2
      GET / HTTP/1.1
      Host: time.geekbang.org
    2. 响应部分:第一行被称作response line ,分为三个部分:协议和版本,状态码,状态文本

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      HTTP/1.1 301 Moved Permanently
      Date: Fri, 25 Jan 2019 13:28:12 GMT
      Content-Type: text/html
      Content-Length: 182
      Connection: keep-alive
      Location: https://time.geekbang.org/
      Strict-Transport-Security: max-age=15768000

      <html>
      <head><title>301 Moved Permanently</title></head>
      <body bgcolor="white">
      <center><h1>301 Moved Permanently</h1></center>
      <hr><center>openresty</center>
      </body>
      </html>
    3. 在 request line/response line 之后,是请求头/响应头,这些头由若干行组成,每行是用冒号分割的名称和值

    4. 在头之后,以一个空行(两个换行符)为分割,是请求体/响应体,请求体可能包含文件或者表单数据,响应体则是html 代码

    2. HTTP method

    • GET 浏览器通过地址栏访问页面都是get 方法
    • POST 表单提交
    • HEAD 跟get类似,只是返回请求头
    • PUT 添加资源
    • DELETE 删除资源
    • CONNECT 用于https 和websocket
    • OPTION 用于调试,多数线上服务器不支持
    • TRACE用于调试,多数线上服务器不支持

    3. HTTP Status code(状态码)和 Status text(状态文本)

    response line 的状态码以及所表达的意义

    • 1xx 临时回应,表示客户端请继续(通常情况下,1xx的状态码都会被浏览器 http库直接处理掉了,不会让上层知道)
    • 2xx 请求成功 (网页请求成功的标志)
      • 200 请求成功
    • 3xx 表示请求的目标有变化,希望客户端做进一步处理
      • 301 永久性重定向(实际上,301更接近一种报错,提示客户端下次别来了)
      • 302 临时重定向
      • 304 客户端缓存没有更新(产生这个状态的前提是:客户端本地已经有缓存的版本了,并在请求中告诉了服务端,当服务端发现没有更新的时候,就会返回一个不含body 的304状态)
    • 4xx 客户端请求错误
      • 403 无权限
      • 404 表示请求页面不存在
    • 5xx 服务端错误
      • 500 服务端错误
      • 503 服务端暂时性错误,可以一会再试

    4. HTTP HEAD

    http 头可以看做一个键值对。原则上http 也是一种数据,我们可以自由定义 http 头和值

    • 请求头
      在这里插入图片描述
    • 响应头
      在这里插入图片描述

      5. HTTP Request Body

      http 请求的body 主要用于提交表单场景。(一般情况下,http请求的body 是比较自由的格式,只要浏览器发送的body 服务端认可就可以了)
      常见的body格式:
    • application/json
    • application/x-www-form-urlencoded(使用html的form 标签提交时产生的html请求,默认会使用这种格式)
    • multipart/form-data (文件上传)
    • text/xml

    三、HTTPS

    不管是https 还是http2 ,基本上保持了HTTP 的设计思想,即:使用上的Request-Response 模式

    1. HTTPS 的作用

    1. 确定请求目标服务端身份
    2. 保证传输的数据不会被网络中间节点窃听或篡改

    2. HTTPS 如何加密

    https 是通过首先和服务端建立一条 TLS 加密通道,然后使用加密通道来传输http 的内容

    TLS 构建于 tcp 协议之上,实际上是对传输内容做一次加密,所以从传输内容上来看,https 和 http 没有任何区别

    四、HTTP2

    HTTP2是 HTTP 1.1 的升级版本

    1. HTTP2 的改进

    1. 支持服务端推送
      在客户端发送一个请求到服务端时,提前把一部分内容推送给客户端,放入缓存中,这可以避免客户端请求顺序带来的并行度不高,从而导致的性能问题
    2. 支持TCP 连接复用
      使用同一个TCP 连接传输多个http 请求,避免了TCP 连接建立的三次握手开销,和初建TCP 连接时传输窗口小的问题

    (本文来自我对极客时间winter的重学前端的知识整理,如有转载请声明,同时有不全可以参考原著)

    Contents
    1. 1. 一、首先提两个问题
      1. 1.1. 1. 一个页面从输入URL到页面加载完成,这个过程都发生了什么?
      2. 1.2. 2. 如何把一个URL 变成一个屏幕上显示的网页?
    2. 2. 二、网络通讯
      1. 2.1. 1. HTTP
      2. 2.2. 2. HTTP method
      3. 2.3. 3. HTTP Status code(状态码)和 Status text(状态文本)
        1. 2.3.1. response line 的状态码以及所表达的意义
      4. 2.4. 4. HTTP HEAD
      5. 2.5. 5. HTTP Request Body
    3. 3. 三、HTTPS
      1. 3.1. 1. HTTPS 的作用
      2. 3.2. 2. HTTPS 如何加密
        1. 3.2.0.0.0.1. https 是通过首先和服务端建立一条 TLS 加密通道,然后使用加密通道来传输http 的内容
  • 4. 四、HTTP2
    1. 4.1. 1. HTTP2 的改进