1、HTTP基础概念
Hyper Text Transfer Protocol,超文本传输协议,HTTP指定了客户端发送给服务器什么样的消息以及得到什么样的响应。
1.1 请求报文构成
请求方法
GET、HEAD、POST、PUT、DELETE、TRACE、OPTIONS、CONNECT
- GET提交的数据会放在URL之后,也就是请求行里面,以?分割URL和传输数据,参数之间以&相连;
- POST方法是把提交的数据放在HTTP包的请求体中,通过请求头content-type参数来指定格式;
- OPTIONS可使服务器传回该资源所支持的所有HTTP请求方法,向Web服务器发送OPTIONS请求,可以测试服务器是否正常运作;
常见请求头字段
Accept:告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型;
Cache-Control:控制请求的缓存策略,比如no-cache不缓存,max-age最大缓存期限;
Connection:是否保持TCP长连接(keepallive、close),Http1.1默认使用keepallive;
Content-Type:请求体内容实体的格式,如:application/x-www-form-urlencoded、application/json、multipart/form-data等;
User-Agent:告诉服务器浏览器的内核版本信息,如:Mozilla/5.0 (Windows NT 10.0; Win64; x64;
Referer:告诉服务器是从哪个来源页面点击到此URL访问请求的;
1.2 响应报文构成
状态码
1xx消息:请求已被服务器接收,继续处理
2xx成功:请求已成功被服务器接收、理解、并接受
3xx重定向:需要后续操作才能完成这一请求
4xx请求错误:请求含有词法错误或者无法被执行
5xx服务器错误:服务器在处理某个正确请求时发生错误
2、HTTP/2新特性
HTTP1.1的不足
http1.1默认启用KeepAlive保持长连接,该模式下虽然同一个域名的http请求可以复用一个TCP连接,但是多个http请求依旧要保持串行执行,也就是要等前一个http请求响应回来后才能发起第二个请求。该问题称作http队头堵塞。即使开启http1.1的管道化模式也只能支持请求并行发起,但响应时依旧要严格按照顺序返回。
http队头堵塞的问题很大限制了http1.1的并行请求效率,在http1.1的实际使用场景中,浏览器往往会启用多个TCP连接来提升并发速度(chome是6个),或者使用域名分片的方式,划分出多个二级域名来访问的网站资源。
HTTP/2的多路复用特性
HTTP/2引入了一个二进制分帧层,客户端和服务端进行传输时,数据会先经过二进制分帧层处理,转化为一个个带有请求ID的帧,这些帧在传输完成后根据ID组合成对应的数据。多个帧之间可以乱序发送,根据帧首部的流标识可以重新组装。
HTTP/2的多路复用机制使得同一域名的请求可以高效的复用同一个TCP连接,大大提升了并发访问的效率。下图展示了HTTP/1.1和HTTP/2请求处理流程差异。
3、HTTP/3与QUIC
QUIC(Quick UDP Internet Connection)是谷歌推出的一套基于UDP的传输协议,它实现了TCP + TLS的功能,目的是保证可靠性的同时降低网络延迟。QUIC 协议基于 UDP,既有UDP 特有的优势,同时它又提取了 TCP 中的精华,实现了即快又可靠的协议。
2022年6月6日,IETF QUIC和HTTP工作组成员Robin Mark在推特上宣布,历时5年,HTTP/3终于被标准化为 RFC 9114。
4、HTTP与HTTPS
https 是在 http 的基础上加入了 SSL/TSL 协议,SSL/TSL 依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。
https加密流程
https整体流程是使用了RSA非对称加密(CA证书的公钥和服务器的私钥)和ESA对称加密(随机生成密钥,用于传输数据)
- 客户端发起 https 请求;
- 服务端返回数字证书文件,即CA证书;
- 客户端验证数字证书,并且提取服务端公钥;
- 数字证书通过则随机生成一个对称加密的 key,并使用服务器公钥对 key加密;
- 客户端发送加密后的 key 到服务端;
- 服务端使用私钥解密拿到 key;
- 客户端与服务端使用该 key 对称加解密通讯信息。
客户端验证数字证书流程
- 浏览器安装后会自带一些权威 CA 公钥;
- 使用相匹配的 CA 公钥对数字证书中的数字签名解密,如果能够解密则得到数字证书的摘要,由此证明数字证书是可信的;
- 根据数字证书中的散列算法对网站信息进行哈希运算,将得到的结果与上一步得到的摘要对比,如果两者一致,就证明证书未被修改过。
数字证书的签发过程