# http 协议

HyperText Transfer Protocal 超文本传输协议,应用层协议

# 特点

  • 灵活可扩展:语法上只定义了基本格式,空格分隔单词,换行分隔字段等。另外一个就是传输形式上不仅可以传输文本,还可以传输图片,视频等任意数据
  • 客户端/服务器模式:通常而言,就是一方发送消息,另外一方要接受消息,或者是做出响应等
  • 可靠传输:基于 TCP/IP
  • 无状态:无法保存之前的状态需要重传
  • 明文传输:容易被攻击

# URI

http 协议使用 URI 定位互联网上的资源:

  • URI 统一资源标识符
    • URL 统一资源定位符
    • URN 统一资源名称

# 版本

  • 1.1

    • 引入持久连接:连接默认不关闭,可以被多个请求复用,通过请求头的 keep-alive 设置
      • 容易产生性能问题
    • 引入管道机制:在同一个连接,客户端可以同时发送多个请求
      • 需要按序处理,队头任务太慢 ,可能会导致队头阻塞
    • 增加缓存控制
    • 支持断点续传:通过设置请求头的 Range
    • 使用了虚拟网络:在一台物理服务器上可以存在多个虚拟主机并共享 ip 地址
    • 新增方法:PUT PATCH OPTIONS DELETE
  • 2.0

    • 二进制分帧:头信息和数据都是二进制帧
    • 头部压缩:使用 HPACK 对头部字段进行压缩
    • 多路复用:一个连接,客户端和浏览器都可以同时发送多个请求和响应,不需要按序进行,解决了队头阻塞的问题
    • 服务器推送:允许服务器未经请求,主动向客户端发送资源
    • 请求优先级:可以设置数据帧的优先级,让服务器优先处理重要资源,提高用户体验

# 请求方法

  • GET:向特定资源发出请求,不应该用于产生副作用的操作
    • 会主动缓存
  • HEAD:类似 GET,只是返回的响应没有响应体,用于获取报头中的信息
  • POST:向指定资源提交数据进行处理请求,数据在请求体中,可能会导致创建和修改资源
  • PUT:向指定资源上传最新内容替代
  • DELETE:请求服务器刪除指定内容
  • OPTIONS:返回服务器对指定资源所支持的 HTTP 请求方法,也可以用来测试服务器功能
  • TRACE:回显服务器收到的请求,主要用于测试或诊断
  • CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器

# 跨域请求

在浏览器发送跨域请求的时候会分为

  • 简单请求
    • 请求方法为 HEAD GET POST
    • 无自定义请求头
    • Content-Type 只能是 text/plain multipart/form-data application/x-www-form-urlencoded
  • 复杂请求

如果是复杂请求就会先发送一个 OPTIONS 预检请求

# 状态码

  • 1xx 请求已被接收,需要继续处理
  • 2xx 成功状态
    • 200 OK 表示从客户端发来的请求在服务器端被正确请求
    • 204 No content 表示请求成功,但没有资源可返回
    • 206 Partial Content 该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求 响应报文中包含由 「Content-Range」 指定范围的实体内容。
  • 3xx 重定向
    • 301 moved permanently 永久性重定向,表示资源已被分配了新的 URL
    • 302 found 临时性重定向,表示资源临时被分配了新的 URL
    • 303 see other 表示资源存在着另一个 URL,应使用 GET 方法获取资源(对于 301/302/303 响应,几乎所有浏览器都会删除报文主体并自动用 GET 重新请求)
    • 304 not modified 表示服务器允许访问资源,但请求未满足条件的情况(与重定向无关)
    • 307 temporary redirect 临时重定向,和 302 含义类似,但是期望客户端保持请求方法不变向新的地址发出请求
  • 4xx 客户端错误
    • 400 bad request 请求报文存在语法错误
    • 401 unauthorized 表示发送的请求需要有通过 HTTP 认证的认证信息
    • 403 forbidden 表示对请求资源的访问被服务器拒绝,可在实体主体部分返回原因描述
    • 404 not found 表示在服务器上没有找到请求的资源
  • 5xx 服务器错误
    • 500 internal sever error 表示服务器端在执行请求时发生了错误
    • 501 Not Implemented 表示服务器不支持当前请求所需要的某个功能
    • 503 service unavailable 表明服务器暂时处于超负载或正在停机维护,无法处理请求

# 缓存策略

浏览器缓存:

  • Service Worker 脱离浏览器窗口,无法访问 DOM
    • 离线缓存
    • 消息推送
    • 网络代理
  • Memory Cache 内存缓存 速度最快 存活时间最短
  • Disk Cache 磁盘缓存 比内存慢 存储时间长容量大
  • Push Cache 推送缓存
流程

下面的标签都是响应头中由服务器配置的

# 强缓存

缓存有数据且未过期就直接返回数据,否则向服务器获取数据更新缓存

  • Expires 过期时间,通过服务器返回的响应头获取,过期之前可以直接从缓存中获取数据
    • 1.0 版本 由于服务器时间和客户端时间可能存在误差,现在大多数用 Cache-Control
  • Cache-Control
    • private 客户端可以缓存
    • public 客户端和服务器都可以缓存
    • max-age 缓存失效时间
    • no-cache 需要协商缓存来验证
    • no-store 所有都不缓存

两个字段都存在优先考虑 Cache-Control

# 协商缓存

从缓存获取缓存数据标识,带着标识向服务器请求是否失效,没有失效服务器返回 304,客户端就直接从缓存中获取请求数据,如果标识失效,服务器返回更新后端数据

  • Last-Modified 资源修改时间
    • 如果编辑了文件,内容没改也会导致缓存失效
    • 单位是秒,如果一秒内改变,无法感知修改
  • ETag 文件标识 和服务器上的进行对比

# 缓存优点

  • 减少了冗余的数据传递,节省宽带流量
  • 减少了服务器的负担,大大提高了网站性能
  • 加快了客户端加载网页的速度 这也正是 HTTP 缓存属于客户端缓存的原因。

# 浏览器不同刷新

  1. 浏览器地址栏中写入 URL,回车浏览器发现缓存中有这个文件了,不用继续请求了,直接去缓存拿。(最快)
  2. F5 就是告诉浏览器,别偷懒,好歹去服务器看看这个文件是否有过期了。于是浏览器就胆胆襟襟的发送一个请求带上 If-Modify-since
  3. Ctrl+F5 告诉浏览器,你先把你缓存中的这个文件给我删了,然后再去服务器请求个完整的资源文件下来。于是客户端就完成了强行更新的操作

# HTTPS

HTTPS = HTTP + SSL/TLS

  • 加密传输
  • SEO 更好
  • 端口 443
  • 需要证书

TLSSSL 的后续版本,用于身份校验和加密的一种协议

优点:

  • 更安全
  • 用来避免运营商劫持

缺点:

  • 使得页面加载时间延长
  • 成本更高
  • 依赖证书安全
  • 无法防御 黑客攻击 DDOS 和服务器劫持

名词:

  • 对称加密:加密 解密使用相同的密钥,常用:DES -> AES
  • 非对称加密:公钥加密 私钥解密,常用 RSA

# 流程

  1. 发起 https 请求
  2. 服务器收到请求,返回数字证书
  3. 客户端收到证书,验证证书公钥是否有效,有效则生成一个随机数(密钥),用证书公钥对其进行(非对称)加密返回给服务器
  4. 服务器用证书私钥对加密进行解密,得到密钥后,把需要返回的内容用该密钥进行(对称)加密返回
  5. 客户端用本地密钥进行解密