这是我参与「第四届青训营 」笔记创作活动的第2天。
1.什么是HTTP
HTTP是超文本传输协议。是应用层协议,传输层基于TCP。简单可扩展,无状态。
2.协议分析
- 0.9单行协议
最初只为解决用户与服务器通信的需求,只能通过get+url来获取html文档
- 1.0构建可拓展性
增加了Header,有了状态码,支持多种响应文档类型
- 1.1标准化协议
因为基于TCP,为减少握手增加了连接复用;缓存、内容协商等功能
- 2更优异的表现
二进制协议,压缩header,服务器推送
- 3草案
报文
安全(不修改服务器数据):get,head,options
幂等(多次执行服务器状态一样):get,head,options,put,delete
RESTful API
Representational State Transfer,一种API设计风格
- 每一个URL代表一种资源
- 客户端与服务器之间传递这种资源的某种表现层
- 通过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:最后修改时间
cookie
HTTP2
- 不直接传输文本,而是使用二进制编码封装成帧,以加快传输
- 多条消息可以放在一起发送,接受方重组排序
- tcp复用,减少建立链接次数
- 流控制,对需要带宽的进程分配优先级,根据优先级分配资源
- 智能推送,提前预测用户可能需要的文件,更快传输
3.场景分析
获取页面静态数据
静态资源不一定每次都找服务端请求。缓存->CDN->文件名hash
如何保证用户的资源最新?
通过文件名hash,每次版本更新文件名都发生变化,之后用户的缓存的资源无法匹配,则需要重新获取
表单登录
两个请求:
- OPTIONS请求,跨域请求。
- 真正的POST登录请求。
其他跨域解决方案:
- 同域的代理服务器接受并转发
- iframe(很少用)
如何鉴权?
- session+cookie
- jwt
发布信息
从观看网站带着用户信息跳转到发布网站:单点登录(Single sign on,SSO)相当于有一个代理服务器记录登录信息。
4.网络优化
速度
- 使用http2
- CDN动态加速
- DNS预解析、网络预连接
- 域名设计、数据压缩、https性能优化
稳定性
- 重试
- 缓存
- 数据安全
5.其他
实时性高的场景(如聊天室)可以使用websocket方案,全双工技术,延时小(url以ws://或wss://开头)
QUIC基于UDP封装,0RTT建联(首次除外)。实现了类似TCP的可靠传输,有加密、拥塞控制、多路复用、无队头阻塞。