这是我参与「第四届青训营 」笔记创作活动的的第11天
HTTP实用指南
背景知识
Hyper Text Transfer Protocol超文本传输协议。 应用层协议,基于TCP协议
特点:
- 请求 响应
- 简单可扩展
- 无状态
协议分析
HTTP/1.1
start line-->headers-->empty line-->body
- Request重要:声明地址
- response重要:响应结果 |Method | | | |---|---|---| |Safe(安全的)|不会修改服务器数据的方法| GET\HEAD\OPTIONS| Idempotent(幂等)| 同样的请求被执行一次与连续执行多次的效果是一样的,服务器状态也是一样的| GET\HEAD\OPTIONS\PUT(替换资源)\DELETE
所有safe的方法都是Idempotent的
状态码
| 1xx | 提示信息,表请求已接收,继续处理 |
| 2xx | 成功,表请求已被成功接收、理解、接受 |
| 3xx | 重定向,要完成请求必须继续更进一步操作 |
| 4xx | 客户端错误,请求有语法错误或请求无法实现 |
| 5xx | 服务端错误,服务器未能实现合法的请求 |
- 200 OK-客户端请求成功
- 301 资源(网页等)被永久转移到其他URL
- 302 临时跳转
- 401 请求资源不存在,可能输入错误URL
- 500 服务器内部发生不可预期错误
- 504 网关或代理服务器超时
缓存
在HTTP中具有缓存功能的是浏览器缓存, HTTP缓存作为web性能优化的重要手段。
缓存规则
HTTP的缓存属于客户端缓存,而浏览器则存在缓存数据库,用于存储一些不经常变化的静态文件
本篇介绍:强缓存与协商缓存;强缓存,本地有则直接使用;协商缓存,本地有但需要双方协商确认后再使用
- 强缓存
当缓存数据库中已有所请求的数据时。客户端直接从缓存数据库中获取数据,否则从服务端获取数据。
- Expires,时间戳
- 为服务端返回的数据到期时间(但由于是 HTTP/1.0 的产物,目前逐渐被 Cache-Control 替代)
- Cache-Control
- 可缓存性
- no-cache:需要使用协商缓存来验证缓存数据
- no-store:所有内容都不会缓存
- private:客户端可以缓存
- private:客户端可以缓存
- 到期
- max-age:单位(秒),存储的最大周期,相对于请求的时间
- 重新验证-重新加载
- must-revalidate:一旦资源过期,在成功向原始服务器验证之前,不能使用
- 可缓存性
- 协商缓存
又称对比缓存
- 客户端会先从缓存数据库中获取到一个缓存数据的标识
- 得到标识后请求服务端验证是否失效
- 如果没有失效,服务端会返回304,直接从缓存中获取所请求的数据;
- 如果失效,服务端会返回更新后的数据
- Etag:资源的特点版本的标识符,类似于指纹
- If-None-Match:同Etag。服务器接收到次报文后发现If-None-Match则与被请求资源的唯一标识进行对比。
- 不同则说明资源被修改,响应整个资源内容,返回200
- 相同则说明资源并未修改,响应header,浏览器直接从缓存中获取数据信息,返回304
- Last-Modified:返回最后修改时间
- If-Modified-Since:返回最后修改时间,判断文件是否被修改
- 若被修改,传输响应整体,则返回200
- 未被修改,传输响应header,返回304 Not Modified
小总结:
两类缓存机制可以同时存在,强制缓存的优先级高于协商缓存,当执行强制缓存时,如若缓存命中,则直接使用缓存数据库数据,不在进行缓存协商。
HTTP/2
较HTTP1更快、更稳定、更简单。使用了二进制编码。
帧
HTTP/2通信的最小单位,每个帧都包含帧头,表示出当前帧所属的数据流。
- 使用二进制编码
- 并行,交错发送,接收方进行重组织
消息
与逻辑请求或响应消息对应的完整的一系列帧,逻辑概念
数据流
已建立的连接内的双字节流可以承载一条或多条消息
HTTP/2协议特性:
- HTTP/2连接都是永久的,而且仅需要每个来源一个连接
- 流控制:阻止发送方向接收方发送大量数据的机制(主动拒绝)
- 服务器推送(主动推送可能需要的信息)
常见场景
- 静态资源方案:缓存 + CDN + 文件名 hash
- CDN:Content Delivery Network
- 通过用户就近性和服务器负载的判断,CDN确保内容以一种极为高效的方式为用户请求提供服务
(保证拿到内容,尽量就近)
- SSO:Single Sign On单点登录
实际应用
用户体验最优--网络优化
总结
听完本节课...觉得自己还需要再打打基础,网络协议的内容基本都忘光光...不过最近探索到一个新的学习方式,就是在听完课程之后,去阅读相关的好文,可以大大加深理解程度,同时也可以巩固所学知识。