《透视HTTP协议-学习笔记》--进阶篇

177 阅读8分钟

15 | 海纳百川:HTTP的实体数据

  1. 数据类型与编码
  • MIME type

  • Encoding type

    • gzip:GNU zip 压缩格式,也是互联网上最流行的压缩格式;
    • deflate:zlib(deflate)压缩格式,流行程度仅次于 gzip;
    • br:一种专门为 HTTP 优化的新压缩算法(Brotli)。
  1. 数据类型使用的头字段
  • Accept:数据类型表示实体数据的内容是什么,使用的是 MIME type
  • Content-Type
  • Accept-Encoding :数据编码表示实体数据的压缩方式
  • Content-Encoding
  1. 语言类型使用的头字段
  • Accept-Language :语言类型表示实体数据的自然语言
  • Content-Language
  • Accept-Charset:字符集表示实体数据的编码方式
  1. 内容协商的质量值 客户端需要在请求头里使用 Accept 等头字段与服务器进行“内容协商”,要求服务器返回最合适的数据;
    Accept 等头字段可以用“,”顺序列出多个可能的选项,还可以用“;q=”参数来精确指定权重。

16 | 把大象装进冰箱:HTTP传输大文件的方法

  1. 数据压缩
    压缩 HTML 等文本文件是传输大文件最基本的方法;
    gzip 等压缩算法通常只对文本文件有较好的压缩率,而图片、音频视频等多媒体数据本身就已经是高度压缩的,再用 gzip 处理也不会变小(甚至还有可能会增大一点),所以它就失效了。
  2. 分块传输
    可以流式收发数据,节约内存和带宽,使用响应头字段Transfer-Encoding: chunked来表示,分块的格式是 16 进制长度头 + 数据块;
  • 在 HTTP 协议里就是“chunked”分块传输编码。在响应报文里用头字段Transfer-Encoding: chunked来表示。
  • Transfer-Encoding: chunkedContent-Length这两个字段是互斥的,也就是说响应报文里这两个字段不能同时出现,一个响应报文的传输要么是长度已知,要么是长度未知(chunked),
  1. 范围请求 可以只获取部分数据,即“分块请求”,实现视频拖拽或者断点续传,使用请求头字段Range和响应头字段Content-Range,响应状态码必须是 206;
  • 允许客户端在请求头里使用专用字段来表示只获取文件的一部分,相当于是客户端的“化整为零”。
  • 范围请求不是 Web 服务器必备的功能,可以实现也可以不实现,所以服务器必须在响应头里使用字段Accept-Ranges: bytes明确告知客户端:“我是支持范围请求的”。如果不支持的话,服务器可以发送Accept-Ranges: none,或者干脆不发送“Accept-Ranges”字段。
  1. 多段数据
  • 这种情况需要使用一种特殊的 MIME 类型:multipart/byteranges,表示报文的 body 是由多段字节序列组成的,并且还要用一个参数boundary=xxx给出段之间的分隔标记。

17 | 排队也要讲效率:HTTP的连接管理

  1. 短连接 客户端与服务器的整个连接过程很短暂,不会与服务器保持长时间的连接状态,所以就被称为“短连接”(short-lived connections)。

  2. 长连接 也叫“持久连接”(persistent connections)、“连接保活”(keep alive)、“连接复用”(connection reuse)。即建立tcp连接后不会立即关闭,后续http请求可以复用这个tcp连接。

image.png

  1. 连接相关的头字段
  • Connection: keep-alive
  • Connection: close,表示通信后就关闭连接。
  • 过多的长连接会占用服务器资源,导致耗尽资源“拒绝服务”即DDos所以服务器会用一些策略有选择地关闭长连接。
  1. 对头阻塞 HTTP报文必须是“一发一收”,这就会形成先进先出的“串行”队列。队列里没有优先级,如果前面的请求处理的太慢,会阻塞后面的所有请求。

image.png 5. 性能优化

  • 并发连接。同时对一个域名发起多个长连接。但是HTTP协议和浏览器会显示并发请求的数量。浏览器对于单个域名的连接数量有限制,一般是6-8个。
  • 域名分片。把原来的域名分成多个域名。

18 | 四通八达:HTTP的重定向和跳转

  1. 重定向的应用场景
  • 资源不可用
  • 避免重复
  • 系统维护时可以使用302临时重定向
  1. 重定向的相关问题
  • 性能损耗
  • 循环跳转

19 | 让我知道你是谁:HTTP的Cookie机制

  1. Cookie 的工作过程

image.png 2. Cookie 的属性

  • Cookie 的生存周期

    • Expires俗称“过期时间”,用的是绝对时间点,可以理解为“截止日期”(deadline)。
    • Max-Age用的是相对时间,单位是秒,浏览器用收到报文的时间点再加上 Max-Age,就可以得到失效的绝对时间。
    • 会优先使用Max-Age
  • Cookie 的作用域

    • Domain,Cookie 所属的域名
    • Path
  • Cookie 的安全性

    • HttpOnly,此 Cookie 只能通过浏览器 HTTP 协议传输,禁止其他方式访问,浏览器的 JS 引擎就会禁用 document.cookie 等一切相关的 API,脚本攻击也就无从谈起了。
    • SameSite,可以防范“跨站请求伪造”(XSRF)攻击,设置成SameSite=Strict可以严格限定 Cookie 不能随着跳转链接跨站发送,而SameSite=Lax则略宽松一点,允许 GET/HEAD 等安全方法,但禁止 POST 跨站发送。
    • Secure,表示这个 Cookie 仅能用 HTTPS 协议加密传输,明文的 HTTP 协议会禁止发送。但 Cookie 本身不是加密的,浏览器里还是以明文的形式存在。
  1. Cookie 的应用
  • 身份识别
  • 广告跟踪

20 | 生鲜速递:HTTP的缓存控制

  1. 服务器的缓存控制 服务器标记资源有效期使用的头字段是Cache-Control
  • no-store:不允许缓存,用于某些变化非常频繁的数据,例如秒杀页面;
  • no-cache:它的字面含义容易与 no-store 搞混,实际的意思并不是不允许缓存,而是可以缓存,但在使用之前必须要去服务器验证是否过期,是否有最新的版本;
  • must-revalidate:又是一个和 no-cache 相似的词,它的意思是如果缓存不过期就可以继续使用,但过期了如果还想用就必须去服务器验证。

image.png

  1. 客户端的缓存控制
  • 浏览器也可以发送Cache-Control字段,使用max-age=0no_cache刷新数据
  • “刷新”页面时,浏览器会在请求头里加一个Cache-Control: max-age=0
  • "强制刷新"时,其实是发了Cache-Control: no-cache
  • “前进”“后退”“跳转”这些重定向动作中浏览器不会“夹带私货”,只用最基本的请求头,没有Cache-Control,所以就会检查缓存,直接利用之前的资源,不再进行网络通信。
  1. 条件请求
  • 条件请求一共有 5 个头字段,我们最常用的是if-Modified-SinceIf-None-Match这两个。需要第一次的响应报文预先提供Last-modifiedETag,然后第二次请求时就可以带上缓存里的原值,验证资源是否是最新的。
  • 如果资源没有变,服务器就回应一个304 Not Modified,表示缓存依然有效。
  • ETag 是“实体标签”(Entity Tag)的缩写,是资源的一个唯一标识,主要是用来解决修改时间无法准确区分文件变化的问题。
    • 强 ETag 要求资源在字节级别必须完全相符,弱 ETag 在值前有个“W/”标记,只要求资源在语义上没有变化,但内部可能会有部分发生了改变(例如 HTML 里的标签顺序调整,或者多了几个空格)。

21 | 良心中间商:HTTP的代理服务

  1. 代理服务 所谓的“代理服务”就是指服务本身不生产内容,而是处于中间位置转发上下游的请求和响应,具有双重身份。
  2. 代理的作用
  • 负载均衡
  • 健康检查
  • 安全防护
  • 加密卸载
  • 数据过滤
  • 内容缓存
  1. 代理相关的头字段
  • X-Forwarded-For
  • X-Real-IP

22 | 冷链周转:HTTP的缓存代理

  1. 缓存代理服务 代理服务收到源服务器发来的响应数据后需要做两件事。第一个当然是把报文转发给客户端,而第二个就是把报文存入自己的 Cache 里。
  2. 源服务器的缓存控制 “private”表示缓存只能在客户端保存,是用户“私有”的,不能放在代理上与别人共享。而“public”的意思就是缓存完全开放,谁都可以存,谁都可以用。 下面的流程图是完整的服务器端缓存控制策略,可以同时控制客户端和代理。

image.png 3. 客户端的缓存控制

image.png

  • max-stale的意思是如果代理上的缓存过期了也可以接受,但不能过期太多,超过 x 秒也会不要。
  • min-fresh的意思是缓存必须有效,而且必须在 x 秒后依然有效。