完整的http请求流程
- 域名解析
1.1. 浏览器、系统、路由等网络本地缓存
1.2. isp服务缓存
1.3. 根域名服务器递归搜索 - tcp三次握手
- 发起http请求
3.1. 请求行:请求方法、url、http版本协议
3.2. 请求头:host、user-agent、connection、accept、accept-encoding、accept-language、cookie、cache-control、Authorization
3.3. 请求数据: 出现于post请求,Content-Length、Content-Type、data - 服务器响应http请求
4.1 状态行: 协议版本、状态码、状态码描述
4.2 响应头:server、content-type、content-length、content-language、content-encoding
4.3 响应数据:用户数据,如html - 浏览器解析html代码,请求html代码中的资源
5.1 keep-alive特性,建立一次http连接,可以请求多个资源。
5.2 如果静态资源未过期,服务器发起询问请求,服务端返回304为未修改,直接读取本地缓存。 - 浏览器对页面进行渲染
http各版本对比
HTTP 0.9
- 无状态性,一次请求一次连接
- 只支持get请求,纯文本格式
HTTP 1.0
- 支持请求头、响应头
- 支持响应行
- 响应数据支持MIME
- 支持POST、HEAD、POST方法
- 支持长连接(Keep-Alive)、缓存机制、身份认证
HTTP 1.1
- 默认启动Keep-Alive连接
- 支持chunked编码传输,分块传输数据,并标明长度
- 支持字节范围请求:允许客户端只请求部分数据,以节约流量。Content-Range表明长度及偏移量。响应码为206
- Pipelining:支持发送多个顺序请求而不必等待每一个响应。类似tcp的滑动窗口
- 支持host请求头、响应头
- 增加了OPTIONS,PUT, DELETE, TRACE, CONNECT方法
- 增强了缓存机制:Cache-Control头
HTTP 2.0
目的:在http1.x基础上提升网络性能,降低延时
- Multiplexing多路复用,允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息。(浏览器客户端对同一时间针对同一域名的请求数有限制)
- 二进制分帧,在应用层与传输层之间增加了二进制分帧层,头部信息会封装到HEADER frame,请求数据会被封装到DATA frame。并在一个连接中完成多资源传输。降低网络延时,提升网络吞吐。
- Header Compression首部压缩,使用HPACK算法,要求传输过程有序
- Server Push服务器推送,主动推动内嵌资源,相当于获取到html页面的同时获取到内嵌的资源
- 优先权和依赖
http 3.0
- 使用基于udp为底层传输协议的quic协议,上层仍然为http 2
1.1. 多路流复用
1.2. 灵活的拥塞控制算法
1.3. 增强丢失恢复机制和转发纠错功能
1.4. 更快的握手过程:减少冗余协议交换
1.5. 在quic协议过程中完成了tls加密 - 增强了首部压缩,使用QPACK算法,无需有序传输
https
- 三次握手
- 交换公钥
2.1. 客户端第一次发送https请求,把客户端支持的加密算法发送给服务端
2.2. 服务端接收到请求后,和自己支持的加密算法进行比对,如果不符合,则断开连接。否则,服务端会把符合的算法和证书发给客户端,包括证书时间、证书日期、证书颁发的机构。 - 验证证书
3.1. 客户端验证证书,包括颁发证书的机构是否合法与是否过期,证书中包含的网站地址是否与正在访问的地址一致等
3.2. 验证通过后(或者用户接受了不信任的证书),客户端会生成一个随机字符串,然后用服务端的公钥进行加密。这里就保证了只有服务端才能看到这串随机字符串(因为服务端拥有公钥对应的私钥,RSA解密,可以知道客户端的随机字符串)。 - 交换随机字符串,并完成握手
4.1. 客户端生成握手信息 用约定好的HASH算法,对握手信息进行取HASH,然后用随机字符串加密握手信息和握手信息的签名HASH值,把结果发给服务端。这里之所以要带上握手信息的HASH是因为,防止信息被篡改。如果信息被篡改,那么服务端接收到信息进行HASH时,就会发现HASH值和客户端传回来的不一样。这里就保证了信息不会被篡改。
4.2. 服务端接收到加密信息后,首先用私钥解密得到随机字符串。然后用随机字符串解密握手信息,获得握手信息和握手信息的HASH值,服务端对握手信息进行HASH,比对客户端传回来的HASH。如果相同,则说明信息没有被篡改。服务端验证完客户端的信息以后,同样使用随机字符串加密握手信息和握手信息的HASH值发给客户端。
4.4. 客户端接收到服务端发回来的握手信息后,用一开始生成的随机字符串对密文进行解密,得到握手信息和握手信息的HASH值,像一步服务端验证一样对握手信息进行校验,校验通过后,握手完毕。从这里开始,客户端和服务端的通信就使用那串随机字符串进行AES对称加密通信。
SSL TLS HTTPS
ssl是早期的https下的协议加密层。ssl3.0版本后修订为TLS