HTTP实用指南 | 青训营笔记

47 阅读3分钟

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

1.什么是HTTP

HTTP是超文本传输协议。是应用层协议,传输层基于TCP。简单可扩展,无状态。

2.协议分析

  1. 0.9单行协议

最初只为解决用户与服务器通信的需求,只能通过get+url来获取html文档

  1. 1.0构建可拓展性

增加了Header,有了状态码,支持多种响应文档类型

  1. 1.1标准化协议

因为基于TCP,为减少握手增加了连接复用;缓存、内容协商等功能

  1. 2更优异的表现

二进制协议,压缩header,服务器推送

  1. 3草案

报文

安全(不修改服务器数据):get,head,options

幂等(多次执行服务器状态一样):get,head,options,put,delete

RESTful API

Representational State Transfer,一种API设计风格

  1. 每一个URL代表一种资源
  2. 客户端与服务器之间传递这种资源的某种表现层
  3. 通过HTTP方法对资源操作,实现表现层状态转化

常用请求头

  • Accept:接受类型
  • cookie:有cookie且同域访问会自动带上
  • referer:页面的来源url
  • origin:最初请求从哪里发起的
  • user-agent:客户端的一些必要信息,如UA头部

常用响应头

  • content-type:返回内容类型
  • set-cookie:设置和页面相关的cookie,服务器通过这个头部把cookie传给客户端
  • access-control-allow-origin:服务器允许的请求origin头部(譬如为*)

缓存相关的header

强缓存(有就可用):

  • expires,时间戳,到期时间
  • cache-control
    • 可缓存性:
      • no-cache:协商缓存验证
      • no-store:不使用任何缓存
    • 到期:max-age,单位是秒,请求的超时时间
    • 重新验证/加载:must-revalidate,一旦资源过期,在成功向原始服务器验证之前不能使用

协商缓存(时效需要与服务端协商,在请求与响应成对出现):

  • Etag/if-none-match:资源的特定版本标识符,类似于指纹
  • last-modified/if-modified-since:最后修改时间

2022-08-01 21-39-25 的屏幕截图.png

cookie

2022-08-01 21-42-26 的屏幕截图.png

HTTP2

  1. 不直接传输文本,而是使用二进制编码封装成帧,以加快传输
  2. 多条消息可以放在一起发送,接受方重组排序
  3. tcp复用,减少建立链接次数
  4. 流控制,对需要带宽的进程分配优先级,根据优先级分配资源
  5. 智能推送,提前预测用户可能需要的文件,更快传输

3.场景分析

获取页面静态数据

静态资源不一定每次都找服务端请求。缓存->CDN->文件名hash

如何保证用户的资源最新?

通过文件名hash,每次版本更新文件名都发生变化,之后用户的缓存的资源无法匹配,则需要重新获取

表单登录

两个请求:

  1. OPTIONS请求,跨域请求。
  2. 真正的POST登录请求。

其他跨域解决方案:

  1. 同域的代理服务器接受并转发
  2. iframe(很少用)

如何鉴权?

  1. session+cookie
  2. jwt

发布信息

从观看网站带着用户信息跳转到发布网站:单点登录(Single sign on,SSO)相当于有一个代理服务器记录登录信息。

4.网络优化

速度

  1. 使用http2
  2. CDN动态加速
  3. DNS预解析、网络预连接
  4. 域名设计、数据压缩、https性能优化

稳定性

  1. 重试
  2. 缓存
  3. 数据安全

5.其他

实时性高的场景(如聊天室)可以使用websocket方案,全双工技术,延时小(url以ws://wss://开头)

QUIC基于UDP封装,0RTT建联(首次除外)。实现了类似TCP的可靠传输,有加密、拥塞控制、多路复用、无队头阻塞。