这是我参与「第五届青训营 」笔记创作活动的第5天
初识
背景知识
当输入url到页面展示经过了几步:
- 查找url对应服务器的IP地址
- 浏览器根据这个ip以及相应的端口号,构造一个http请求,这个请求封装在一个tcp包中
- 服务器响应并返回HTML等文件数据
- 浏览器构造DOM树并渲染页面
什么是HTTP:
-
HTTP(Hyper Text Transfer Protocol),即超文本传输协议
-
是应用层的协议,是一个用于传输超文本数据的一个协议
-
超文本指的是文本,还有图片、视频等等
-
一般来说,它运行在TCP协议之上并基于TCP协议,具有简单可扩展、无状态(没有记忆能力,所有请求都是独立的)的特点。
协议分析
发展历程
Method
- safe(安全的):我们认为不会修改服务器的数据的方法是安全的(比如GET HEAD OPTION)
- Idempotent(幂等):同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的,所有safe的方法都是Idempotent
状态码
RESTful API 一种API设计风格
- 每一个URL代表一种资源
- 客户端和服务器之间,传递这种资源的某种表现层
- 客户端通过HTTP method,对服务器端资源进行操作,实现“表现层状态转化”
问题讨论(个人观点,错误可反驳):
如果服务端接收到调用,但是发现有错误,该怎么返回?
我认为应该返回2xx,并告知错误原因;如果请求的是页面文件,则进行重定向
我们传输的参数类型错误导致解析失败,是返回5xx还是200比较好呢?
个人认为是5xx
常用请求头
常用响应头
缓存
must-revalidate,配合max-age使用。一个场景是客户端和服务端断开连接后,如果must-revalidate则不能用缓存
cookie
HTTP/2 概述:更快、更稳定、更简单
帧:HTTP/2通信的最小单位,每个帧都包含帧头,至少也会标识出当前帧所属的数据流
消息:与逻辑请求或响应信息对应的完整的一系列帧
数据流:已建立的连接内的双向字节流,可以承载一条或多条信息 控制流:阻止发送方向接收方发送大量数据的机制(比如,暂停视频,那么视频数据的发送就会暂停)
- 使用二进制传输,效率高
- 交叉发送,接收方重组织
- HTTP/2连接都是永久的,而且仅需要每个来源一个连接
- 服务器推送:
举例解析:当客户端请求
html文件,那么服务端会将对用的js和css文件推动给客户端
HTTPS
- 经过TSL/SSL加密
- 对称加密:加密和解密都是使用同一密钥
- 非对称加密:加密和解密需要使用两种不同的密钥:公钥和私钥
常见场景
静态资源
我们可以通过
from disk cache可知,实际上并没有发起请求,数据是从缓存中获取的
静态资源方案:缓存+CDN+文件名hash
CDN:通过用户就近性和服务负载的判断,CDN确保内容以一种极为高效的方式为用户的请求提供服务;距离较近,传输距离小,那么响应的速度就会较快
登录
业务场景:
- 表单登录
- 扫码登录
技术方案:SSO
我们登录今日头条,查看对应的接口:
我们查看第一个请求,发现
method为OPTIONS,那么为什么又OPTIONS的请求?
请求的URL与头条的URL不符合,那么就牵扯到跨域问题了
options请求就是预检请求,可用于检测服务器允许的http方法。当发起跨域请求时,由于安全原因,触发一定条件时浏览器会在正式请求之前自动先发起OPTIONS请求,即CORS预检请求,服务器若接受该跨域请求,浏览器才继续发起正式请求。
跨域
协议,域名,端口有一处不同就会出现跨域问题
处理跨域问题:
-
CORS
预请求:获取服务端是否允许该跨域请求
相关协议头:
-
Access-Control-Allow-Orign
-
Access-Control-Expose-Headers
-
Access-Control-Max-Age
-
Access-Control-Allow-Credentials
-
Access-Control-Allow-Methods
-
Access-Control-Allow-Headers
-
Access-Control-Request-Method
-
Access-Control-Request-Headers
-
Orign
-
-
代理服务器
同源策略是浏览器的安全策略,不是HTTP的
记住登录状态
适合使用jwt的场景:
- 有效期短
- 只希望被使用一次
比如,用户注册后发一封邮件让其激活账户,通常邮件中需要有一个链接,这个链接需要具备以下的特性:能够标识用户,该链接具有时效性(通常只允许几小时之内激活),不能被篡改以激活其他可能的账户,一次性的。这种场景就适合使用jwt。
而由于jwt具有一次性的特性。单点登录和会话管理非常不适合用jwt,如果在服务端部署额外的逻辑存储jwt的状态,那还不如使用session。基于session有很多成熟的框架可以开箱即用,但是用jwt还要自己实现逻辑。
实际应用
AJAX之Fetch
- XMLHttpRequest的升级版
- 使用Promise
- 模块化设计,Response、Request、Header对象
- 通过数据流处理对象,支持分块读取
用户体验
稳定性
- 重试是保证稳定的有效手段,但要防止加剧恶劣情况
- 缓存合理使用,作为最后一道防线
了解更多
WebSocket
- 浏览器与服务器进行全双工通讯的网络技术
- 典型场景:实用性要求高,例如聊天室
- URL使用
ws://或wss://等开头
QUIC(Quick UDP Internet COnnection)
- 0-RTT建联(首次建联除外)
- 类似TCP的可靠传输
- 类似TLS的加密传输,支持完美前向安全
- 用户空间的拥塞控制,最新的BBR算法
- 支持h2的基于流的多路复用,但是没有TCP的HOL问题
- 前向纠错FEC
- 类似MPTCP的Connection migration