HTTP 实用指南|青训营笔记

146 阅读7分钟

这是我参与「第四届青训营 」笔记创作活动的的第7天

HTTP 实用指南

1. 初识 HTTP

  • 超文本传输协议(Hyper Text Transfer Protocol)
    • 超文本:可以承载多种题材(HTML 、 CSS 、……)
  • 应用层协议,基于 TCP 协议
    • HTTP 是应用层协议, TCP 协议为传输层协议
  • 请求 响应
  • 简单可扩展
    • 可以自定义一些请求头
  • 无状态
    • 每个请求之间都是孤立的

2. 协议分析

发展

image.png

报文分析

报文实例: image.png

1 请求方法: image.png
请求特点:
Safe(安全的):不会修改服务器的数据的方法(GET HEAD OPTIONS)。
Idempotent(幂等):同样的请求被指向一次与连续执行多次的效果是一样的,服务器的状态也是一样的,所有 Safe 方法都是 Idempotent 的(GET HEAD OPTIONS PUT DELETE)。

2. 状态码及含义: image.png

3. 常用请求头及含义: image.png Cache-Control 、 If-Modified-Since 、 Expires 、 Max-age 、 If-None-Match 都是和缓存相关的协议头;
Cookie 携带用户状态信息;
Referer 、 Origin 都表示请求来源相关的字段, Origin 可以做接口访问权限控制。

4. 常用响应头及含义: image.png Cache-Control 、 Last-Modified 、 Expires 、 Max-age 、 Etag 跟请求头缓存相关能对上的字段。
Set-Cookie 告诉浏览器我要设置哪些 cookie 信息,以及这些 cookie 信息有一些怎样的权限控制。

5. 缓存
缓存分为两类:

  1. 强缓存(资源本地有了,直接用)
    • Expires ,时间戳(到期时间)
    • Cache-Control
      • 可缓存
        • no-cache : 协商缓存验证
        • no-store : 不使用任何缓存
      • 到期
        • max-age : 单位是秒,存储的最大周期,相对于请求的时间
      • 重新验证 * 重新加载
        • must-revalidate : 一旦资源过期,在成功向原始服务器验证之前,不能使用
  2. 协商缓存(资源本地有了,跟服务器端通信确认缓存能不能用是不是最新的)
    • Etag (响应头)/ If-None-Match (请求头): 资源的特定版本的标识符,类似于指纹
    • Last-Modified (响应头)/ If-Modified-Since (请求头): 最后修改时间

缓存处理顺序: image.png

6. cookie image.png secure 、 HttpOnly 、 SameSite 可以加强 cookie 的安全性。

7. RESTful API
RESTful API 是一种 API 设计风格。
Representational State Transfer (REST ,表现层状态转化)。
应遵循的关键点:

  1. 每一个 URL 代表一种资源;
  2. 客户端和服务器之间,传递这种资源的某种表现层;
  3. 客户端通过 HTTP method ,对服务器端资源进行操作,实现“表现层状态转化”。

例如: image.png

HTTP/2 概述

更快、更稳定、更简单。

  • 帧(frame)
    • HTTP/2 通信的最小单位,每个帧都包含帧头,至少也会标识出当前帧所属的数据流。
    • 在 HTTP/1.x 中以完整的文本进行传输,在 HTTP/2 中把每个 message 划分成若干帧,每个帧至少包含一个帧头,帧以二进制编码的形式进行传输。
    • 帧交错发送,接收方重组织。
  • 消息
    • 与逻辑请求或响应消息对应的完整的一系列帧聚合在一起。
  • 数据流
    • 已建立的连接内的双向字节流,可以承载一条或多条消息。
  • HTTP/2 连接都是永久的,而且仅需要每个来源一个连接
    • 每一个来源或目标地址建立连接后是可以被永久运用的(复用性)。
  • 流控制
    • 阻止发送方向接收方发送大量数据的机制。 流控制的例子:看视频看了一部分就暂停了,浏览器不会把后续视频缓存下来,浏览器不会把资源放在接收请求、接收视频上,它会把带宽、计算资源用在优先级更高的其它应用上。
      服务器推送: image.png         浏览器端请求了 page.html , Server 接收了这个请求并且把 page.html 返回给浏览器,但是 Server 又分析了 page.html ,发现里面引用了 secript.js 和 style.css , 服务器认为你接下来大概率要向我要这两份文件,为了加快浏览器的处理效率,服务器就提前把这两份文件一起发给浏览器。

HTTPS 概述

在 HTTP 的基础上经过 TSL/SSL 加密,使其安全性更高。 对称加密:加密和解密都是使用同一个密钥。
非对称加密:加密和解密需要使用两个不同的密钥(公钥(public key)和私钥(private key))。 image.png
浏览器证书校验不合法警告提示:
image.png


3. 常见场景

静态资源

静态资源方案:缓存+ CDN + 文件名 hash。

状态码是 200 就一定发起了请求吗?不一定 image.png image.png 强缓存,30天(cache-control: max-age=2592000(单位:秒))
允许所有域名访问(access-control-allow-origin: *)
Content Delivery Network (CDN ,内容分发网络)

  • 通过用户就近性和服务器负载的判断, CDN 确保内容以一种极为高效的方式为用户的请求提供服务。 image.png

文件名 hash 可以确保每次拿到的文件最新(因为缓存,缓存有效期内同名文件都不能更新到,例子:在 vendor.3f3422b8.css 中,3f3422b8 每次文件有变时文件名都会变化)。

静态资源部署可以性能优化、用户体验优化等。

今日头条登录

image.png

image.png 为什么有 options 的请求?跨域(cross-origin , sso.toutiao.com 和 www.toutiao.com
如何处理跨域请求?

  1. CORS
  2. 代理服务器
    • 同源策略是浏览器的安全策略,不是 HTTP 的
  3. Iframe
    • 诸多不便

-------------------------------------------------- CORS --------------------------------------------------- 请求分两类:

  1. 简单请求
  2. 复杂请求(大部分)

只有在复杂请求的情况下才会发起跨域请求。
Cross-Origin Resource Sharing (CORS ,跨域资源共享)。
处理跨域请求的步骤:

  1. 先发起一个预请求(OPTIONS):获取服务端是否允许该跨源请求
  2. 允许的话,开始以下流程 image.png

跨域相关协议头:

  1. Access-Control-Allow-Origin
  2. Access-Control-Expose-Headers
  3. Access-Control-Max-Age
  4. Access-Control-Allow-Credentials
  5. Access-Control-Allow-Methods
  6. Access-Control-Allow-Headers
  7. Access-Control-Request-Method
  8. Access-Control-Request-Headers
  9. Origin

============================= CORS ============================== ----------------------------------------------- 代理服务器 ------------------------------------------------ image.png
代理服务器跟浏览器同域。
=========================== 代理服务器 ============================= 下一次进入页面为什么能记住登录态?
浏览器有自动携带 cookie 策略(不影响无状态)。

鉴权:

  1. Session + cookie image.png
    Server 接收到正确的用户名和密码之后会生成 session 并且存储起来,同时通过响应头 Set-Cookie 将 session 发给浏览器。
  2. JWT (JSON web token) image.png
    Server 接收到正确的用户名和密码之后会生成 token ,浏览器把收到的 token 放到请求头相应字段里面提交给 Server , Server 会把这个 token 解析出来,看看 token 是不是有效的,携带的是那个用户的信息,解析做验证然后返回给我们。
    访问不同域名的网站,但是登录的用户被自动带到新网站
    技术方式: Single Sign On (SSO ,单点登录) image.png

4. 实际应用

浏览器

发起 HTTP 协议: image.png image.png 使用 Promise 一定程度上可以缓解回调地狱;
分块处理处理大数据返回是非常有用的。

node.js

发起 HTTP 协议: image.png 功能是比较有限的。

常用库

image.png 有逻辑判断,能够识别当前所属的环境(浏览器环境还是 nodejs 环境),然后执行相应的请求方式。

用户体验优化

image.png image.png 重试要慎重使用!


5. 了解更多

通信方式(WebSocket)

HTTP 通信方案上来了解。 HTTP 是一个选择,也是大部分时候比较常见的选择,实时性要求高的场景(例如:聊天室)用 WebSocket 方案可能会更好。

  • 延时比较小
  • 浏览器和服务器进行全双工通讯的网络技术
  • URL 使用 ws:// 或 wss:// 开头

image.png

Quick UDP Internet Connection (QUIC)

HTTP 通信底层来了解。 目前还在研究阶段,应用的不多。

  • 基于 UDP 封装的新版本协议
  • HTTP/3 草案的一部分
  • O-RTT 建联(首次建联除外)
  • 类似 TCP 的可靠传输
  • 实现 TSL 的加密传输,支持完美前向安全
  • 用户空间的拥塞控制,最新的 BBR 算法
  • 支持 h2 的基于流的多路复用,但没有 TCP 的 HOL 问题
  • 前向纠错 FEC
  • 类似 MPTCP 的 Connection migration

image.png image.png