15 | 海纳百川:HTTP的实体数据
小结今天我们学习了 HTTP 里的数据类型和语言类型,在这里为今天的内容做个小结。
①数据类型表示实体数据的内容是什么,使用的是 MIME type,相关的头字段是 Accept 和 Content-Type;
②数据编码表示实体数据的压缩方式,相关的头字段是 Accept-Encoding 和 Content-Encoding;
③语言类型表示实体数据的自然语言,相关的头字段是 Accept-Language 和 Content-Language;
④字符集表示实体数据的编码方式,相关的头字段是 Accept-Charset 和 Content-Type;
⑤客户端需要在请求头里使用 Accept 等头字段与服务器进行“内容协商”,要求服务器返回最合适的数据;
⑥Accept 等头字段可以用“,”顺序列出多个可能的选项,还可以用“;q=”参数来精确指定权重。
课下作业
试着解释一下这个请求头“Accept-Encoding: gzip, deflate;q=1.0, *;q=0.5, br;q=0”,再模拟一下服务器的响应头。
客户端接受gzip,deflate的压缩格式权重都是1,请优先给我这两种合适的压缩形式,对于其他形式的压缩接受权重为0.5,拒绝br形式的压缩
服务器的响应:Content-Encoding:gzip
假设你要使用 POST 方法向服务器提交一些 JSON 格式的数据,里面包含有中文,请求头应该是什么样子的呢?
content-type: zh-CN, zh, charset=utf-8, application/json
试着用快递发货收货比喻一下 MIME、Encoding 等概念。
比如说我想在某宝上买乐高,
MIME 确定了我购买的乐高种类,是成品呢, 还是零散的需要自己拼装。
Encoding好比这个乐高的包装方式,某宝可以选择把所有的乐高零件全都放在一个包装里, 也可以分模块把零件放在不同的包装里。 我也可以主动告诉某宝我想要哪一种包装方式。
16 | 把大象装进冰箱:HTTP传输大文件的方法
小结
今天我们学习了 HTTP 传输大文件相关的知识,在这里做一下简单小结:
①压缩 HTML 等文本文件是传输大文件最基本的方法;
②分块传输可以流式收发数据,节约内存和带宽,使用响应头字段“Transfer-Encoding: chunked”来表示,分块的格式是 16 进制长度头 + 数据块;
③范围请求可以只获取部分数据,即“分块请求”,实现视频拖拽或者断点续传,使用请求头字段“Range”和响应头字段“Content-Range”,响应状态码必须是 206;
④也可以一次请求多个范围,这时候响应报文的数据类型是“multipart/byteranges”,body 里的多个部分会用 boundary 字符串分隔。
17 | 排队也要讲效率:HTTP的连接管理
小结
这一讲中我们学习了 HTTP 协议里的短连接和长连接,简单小结一下今天的内容:
①早期的 HTTP 协议使用短连接,收到响应后就立即关闭连接,效率很低;
②HTTP/1.1 默认启用长连接,在一个连接上收发多个请求响应,提高了传输效率;
③服务器会发送“Connection: keep-alive”字段表示启用了长连接;
④报文头里如果有“Connection: close”就意味着长连接即将关闭;过多的长连接会占用服务器资源,所以服务器会用一些策略有选择地关闭长连接;
⑤“队头阻塞”问题会导致性能下降,可以用“并发连接”和“域名分片”技术缓解。
18 | 四通八达:HTTP的重定向和跳转
小结
今天我们学习了 HTTP 里的重定向和跳转,简单小结一下这次的内容:
①重定向是服务器发起的跳转,要求客户端改用新的 URI 重新发送请求,通常会自动进行,用户是无感知的;
②301/302 是最常用的重定向状态码,分别是“永久重定向”和“临时重定向”;
③响应头字段 Location 指示了要跳转的 URI,可以用绝对或相对的形式;
④重定向可以把一个 URI 指向另一个 URI,也可以把多个 URI 指向同一个 URI,用途很多;
⑤使用重定向时需要当心性能损耗,还要避免出现循环跳转。
19 | 让我知道你是谁:HTTP的Cookie机制
小结
今天我们学习了 HTTP 里的 Cookie 知识。虽然现在已经出现了多种 Local Web Storage 技术,能够比 Cookie 存储更多的数据,但 Cookie 仍然是最通用、兼容性最强的客户端数据存储手段。
简单小结一下今天的内容:
①Cookie 是服务器委托浏览器存储的一些数据,让服务器有了“记忆能力”;
②响应报文使用 Set-Cookie 字段发送“key=value”形式的 Cookie 值;
③请求报文里用 Cookie 字段发送多个 Cookie 值;
④为了保护 Cookie,还要给它设置有效期、作用域等属性,常用的有 Max-Age、Expires、Domain、HttpOnly 等;
⑤Cookie 最基本的用途是身份识别,实现有状态的会话事务。
还要提醒你一点,因为 Cookie 并不属于 HTTP 标准(RFC6265,而不是 RFC2616/7230),所以语法上与其他字段不太一致,使用的分隔符是“;”,与 Accept 等字段的“,”不同,小心不要弄错了。
课下作业
如果 Cookie 的 Max-Age 属性设置为 0,会有什么效果呢?
设置为0,服务器0秒就让Cookie失效,即立即失效,服务器不存Cookie。
Cookie 的好处已经很清楚了,你觉得它有什么缺点呢?
好处:方便了市民
缺点:方便了黑客:)
20 | 生鲜速递:HTTP的缓存控制
总结
今天我们学习了 HTTP 的缓存控制和条件请求,用好它们可以减少响应时间、节约网络流量,一起小结一下今天的内容吧:
①缓存是优化系统性能的重要手段,HTTP 传输的每一个环节中都可以有缓存;
②服务器使用“Cache-Control”设置缓存策略,常用的是“max-age”,表示资源的有效期;
③浏览器收到数据就会存入缓存,如果没过期就可以直接使用,过期就要去服务器验证是否仍然可用;
④验证资源是否失效需要使用“条件请求”,常用的是“if-Modified-Since”和“If-None-Match”,收到 304 就可以复用缓存里的资源;
⑤验证资源是否被修改的条件有两个:“Last-modified”和“ETag”,需要服务器预先在响应报文里设置,搭配条件请求使用;
⑥浏览器也可以发送“Cache-Control”字段,使用“max-age=0”或“no_cache”刷新数据。
⑦HTTP 缓存看上去很复杂,但基本原理说白了就是一句话:“没有消息就是好消息”,“没有请求的请求,才是最快的请求。”
课下作业
①Cache 和 Cookie 都是服务器发给客户端并存储的数据,你能比较一下两者的异同吗?
Cache 和 Cookie 的相同点是:都会保存到浏览器中,并可以设置过期时间。
不同点:
1. Cookie 会随请求报文发送到服务器,而 Cache 不会,但可能会携带 if-Modified-Since(保存资源的最后修改时间)和 If-None-Match(保存资源唯一标识) 字段来验证资源是否过期。
2. Cookie 在浏览器可以通过脚本获取(如果 cookie 没有设置 HttpOnly),Cache 则无法在浏览器中获取(出于安全原因)。
3. Cookie 通过响应报文的 Set-Cookie 字段获得,Cache 则是位于 body 中。
4. 用途不同。Cookie 常用于身份识别,Cache 则是由浏览器管理,用于节省带宽和加快响应速度。
5. Cookie 的 max-age 是从浏览器拿到响应报文时开始计算的,而 Cache 的 max-age 是从响应报文的生成时间(Date 头字段)开始计算。
作者回复: 总结的非常好。
第三点感觉有点问题,cache缓存的是完整的报文,不单单是body。
②即使有“Last-modified”和“ETag”,强制刷新(Ctrl+F5)也能够从服务器获取最新数据(返回 200 而不是 304),请你在实验环境里试一下,观察请求头和响应头,解释原因。
强制刷新,请求头里有Pragma: no-cache和Cache-Control: no-cache,没有If-Modified-Since/If-None-Match,这个Pragma: no-cache的意思是禁用缓存
21 | 良心中间商:HTTP的代理服务
小结
①HTTP 代理就是客户端和服务器通信链路中的一个中间环节,为两端提供“代理服务”;
②代理处于中间层,为 HTTP 处理增加了更多的灵活性,可以实现负载均衡、安全防护、数据过滤等功能;
③代理服务器需要使用字段“Via”标记自己的身份,多个代理会形成一个列表;
④如果想要知道客户端的真实 IP 地址,可以使用字段“X-Forwarded-For”和“X-Real-IP”;
⑤专门的“代理协议”可以在不改动原始报文的情况下传递客户端的真实 IP。
课下作业
你觉得代理有什么缺点?实际应用时如何避免?
代理代理就是找她人代替你去打理一些事情,让他人代办事情你必须交代好沟通好,那效率自然会低一些,另外,如果代理出问题了,那你的事自然也办不成了,所以,可能存在单点问题,不过一般还好
代理会增加链路长度,在代理上做一些复杂的处理。会很耗费性能,增加响应时间。
你知道多少反向代理中使用的负载均衡算法?它们有什么优缺点?
随机——简单,是否均匀看随机情况
轮询(一般轮询、加权轮询)——相对简单,也会考虑机器资源和性能的均衡性
哈希(一般哈希、一致性哈希、带虚拟节点的一致性哈希)——相对复杂,要求越公平就会越复杂,而且适当考虑了请求
哈希槽,和redis类似
22 | 冷链周转:HTTP的缓存代理
小结
源服务器的缓存控制
客户端的缓存控制
①计算机领域里最常用的性能优化手段是“时空转换”,也就是“时间换空间”或者“空间换时间”,HTTP 缓存属于后者;
②缓存代理是增加了缓存功能的代理服务,缓存源服务器的数据,分发给下游的客户端;
③“Cache-Control”字段也可以控制缓存代理,常用的有“private”“s-maxage”“no-transform”等,同样必须配合“Last-modified”“ETag”等字段才能使用;
④缓存代理有时候也会带来负面影响,缓存不良数据,需要及时刷新或删除。