HTTP实用指南 | 青训营

50 阅读3分钟

1. 初识

  • Hyper Text Transfer Protocol超文本传输协议
  • 应用层协议,基于TCP协议
  • 请求 响应
  • 简单可扩展
  • 无状态

image.png

2. 协议分析

2.1. 报文

image.png

2.2. 缓存

  • 强缓存(资源如果本地有则直接用)
  • 协商缓存(需要与服务端协商通信看看本地的缓存是否为最新、是否能用)

image.png

2.3. HTTPS

  • Hypertext TransferProtocol Secure
  • 经过TSL/SSL加密
  • 对称加密:加密和解密都是使用同一个密钥
  • 非对称加密:加密和解密需要使用两个不同的密钥:公钥 (public key)和私钥 (private key)

image.png

3. 常见场景

3.1. 静态资源

  • 缓存 + CDN + 文件名hash静态资源方案:
  • CDN:Content Delivery Network
  • 通过用户就近性和服务器负载的判断,CDN确保内容以一种极为高效的方式为用户的请求提供服务

image.png

3.2. 登录

  1. 跨域解决方案
    • CORS
    • 代理服务器(同源策略是浏览器的安全策略,不是HTTP的)
    • lframe(诸多不便)

image.png

  1. 页面如何记住登录状态(鉴权)
标题Session + cookieJWT(JSON web token)
如何鉴权登录成功后发起提交请求给server,并携带用户信息密码,server判断正确性后生成session并存储起来,借由Set-Cookie,下次访问时浏览器自动携带cookie的策略会将之前种的cookie携带出来,server便可以与之前存储的cookie相比较、解析同样提交后server会生成一个token,server本地不会存储而是直接通过response返回,浏览器下次请求时将其放在请求头的某个字段中,server接收到后再去解析、判断用户信息
特点和使用场景1. 有效效期期短
2. 只着望被使用一次
3. 比如,用户注册后发一封的邮件让其激活账户,通常邮件需要有一个链接,这个链接需要具备以下的特性:能够标识用户,该链接具有时效性(通常只允许几小时内激活),不能被篡改以激活其他可能的账户,一次性的
4. 而由于jwt具有一次性的特性,单点登录和会活营理非常不适合用jwt,如果在服务端部署额外的逻辑存储jwt的状态,那还不如使用session。基于session有很多成熟的框架可以开箱即用,但是jwt还要自己实现逻辑

3.3. 单点登录(SSO,Single Sign On)

  • 子应用登录后访问另一子应用无需再次登录的解决方案

image.png

4. 实际应用

4.1. 浏览器篇

  • AJAX之XHR:XMLHttpRequest
  • AJAX之Fetch:
    • XMLHttpRequet的升级版
    • 使用Promise
    • 模块化设计,ResponseRequest,Header对象
    • 通过数据流处理对象,支持分块读取

4.2. node篇

  • 标准库: HTTP/HTTPS(默认模块,无需安装其他依赖,功能有限/不是十分友好)

4.3. 实战

  • 常用的请求库: axios(支持浏览器、nodejs,环境丰富的拦截器)
  • 用户体验
    • 网络优化
    • 稳定性(1. 重试是保证稳定的有效手段,但要防止加剧恶劣情况;2. 缓存合理使用,作为最后一道防线) image.png

image.png

5. 了解更多

5.1. WebSocket

  • 浏览器与服务器进行全双工通讯的网络技术
  • 典型场景: 实时性要求高,例如聊天室
  • URL 使用 ws:// 或 wss:// 等开头

image.png

5.2. QUIC:Quick UDP Internet Connection

  • 0-RTT 建联 (首次建联除外)
  • 类似TCP的可靠传输
  • 类似TLS的加密传输,支持完美前向安全
  • 用户空间的拥塞控制,最新的BBR算法
  • 支持h2的基于流的多路复用,但没有TCP的HOL问题
  • 前向纠错FEC
  • 类似MPTCP的Connection migration

image.png