结构图
HTTP1.0
- 默认无连接,使用 keep-alive 参数建立长连接
- 队头阻塞:前一个请求响应后才能发送下一个请求
- 缓存:主要使用header里的协商缓存 last-modified\if-modified-since,强缓存 Expires来做为缓存判断的标准
- 不支持断点续传:每次都会传送全部的页面和数据
- 没有host域:认为每个服务器绑定唯一一个IP地址,因此在请求消息的URL中没有主机名
last-modified\if-modified-since:资源的更新时间。确认本地资源有效期。如果服务器端该时间更新则说明资源更新过,需要客户端重新获取。
Expires :缓存有效期。超过该时间,浏览器中一个网页或 URL 地址缓存失效,浏览器应联系原始服务器。
由于推断的失效时间也许会降低语义透明度,应该谨慎使用,原始服务器尽可能提供确切的失效时间。”
HTTP1.1
- 长连接。减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。如果HTTP 长连接超过keep-alive没有任何数据交互,服务端就会主动断开这个连接。
- 管道传输:在同一个 TCP 连接里面,客户端可以同时发起多个请求,可以减少整体的响应时间。不是默认开启,而且浏览器基本都没有支持
- 队头堵塞:服务器必须按照接收请求的顺序处理,如果A 请求时耗时比较长,则后续请求阻塞。
管道解决了请求的队头阻塞,但是没有解决响应的队头阻塞。
HTTP2.0
HTTP/2.0协议是基于HTTPS的,更加安全
- 头部压缩:如果同时多个请求其头部一样或相似,则消除重复部分(HPAK算法)。
- 二进制格式:HTTP/1.x中,报文以文本格式,简单易读;2.0中,头信息帧+数据帧=帧,数据以数据流的形式以字节单位发送,数据包乱序发送
每个请求/响应的所有数据包,称为一个数据流
客户端还可以指定数据流的优先级。服务器优先响应 - 多路复用:可以在一个连接中并发多个请求或回应。解决「队头阻塞」问题,延迟↓,连接的利用率↑。
- 服务端推送:服务端可以主动向客户端推送消息
- TCP导致队头阻塞
HPAK算法:在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,就不用重复发送同样字段了,只发送索引号,减少数据量提高速度
每个数据流以消息的形式发送,而消息由一或多个帧组成。
HTTP3.0
TCP导致队头阻塞,所以HTTP3.0使用UDP实现可靠传输(QUIC)
QUIC
- 三次握手来建立连接:需要 1 RTT,确认双方的「连接 ID」
- 无队头阻塞:在同一条连接上并发传输多个Stream。多个 Stream 之间独立,当某个流发生丢包时,只会阻塞这个流,其他流不会受到影响,
- 连接迁移:各端选择一组 ID 来标记自己,通过连接ID建立QUIC。IP变化,只要有上下文信息(比如连接 ID、TLS 密钥等),即可复用原连接,达到连接迁移。
TCP建立连接,需要四元组: 源 IP、源端口、目的 IP、目的端口。ip变化则重新连接
QUIC 是一个在 UDP 之上的伪 TCP + TLS + HTTP/2 的多路复用的协议。
HTTPS
http | https | |
---|---|---|
定义 | B/S 应用层通信协议。Web服务器上存放超文本信息,客户端通过HTTP协议传输所要访问的超文本信息。 | HTTP + SSL(加密),HTTPS不是一个新的协议。 |
特点 | 简单,灵活,服务器不用额外资源记录,减轻服务器负担,提高CPU内存利用效率 | 服务器需要购买ca申请证书,客户端先和第三方确认服务器身份,再与服务器通信 |
无连接,无状态,支持B/S C/S | 因加密,消耗资源且通信效率低,证书付费 | |
问题 | 明文通信,窃听 | 通信加密 |
报文可能被篡改,无法确完整性(使用MD5/SHA-1检测,但MD5值本身可能被修改) | 完整性保护 | |
通信双方的身份未验证,伪装 | 证书认证 | |
每次都要通过Cookie验证用户 |
SSL
用于数据压缩,解压,加密,身份认证
独立于http协议,可用于其他协议加密
加密方式
共享密钥加密(对称密钥)
双方使用同一密钥对传输报文进行加密解密,保证报文的安全。
问题:需要将密钥传输给对方,传输过程中密钥不安全,则报文依旧不安全。
公开密钥加密(非对称密钥)
发送方用公钥对报文加密并传输,接收方使用私钥对报文解密。
问题:
-
公钥的安全性? ==》 第三方机构证书认证
-
公钥机制复杂,处理速度慢
混合加密(HTTPS的加密方式)
使用非对称密钥加密的方式对共享密钥加密,共享密钥安全后,使用共享密钥加密的方式传输报文。
暂未解决问题:
- 因任何人都可以向服务器发送请求,服务器全盘接收,所以服务器容易被DOS攻击。
- SSL