http进化(http1.0/http2.0)
HTTP 是一种能够获取如 HTML 这样的网络资源的 protocol(通讯协议)。http是可扩展的,是无状态的,单向传输。
一.Http发展
1.HTTP/0.9——单行协议
请求由单行指令构成,以唯一可用方法 GET 开头,其后跟目标资源的路径。
2.HTTP/1.0——构建可扩展性
协议版本信息会随着每个请求发送(HTTP/1.0 被追加到了 GET 行)。
状态码会在响应开始时发送,使浏览器能了解请求执行成功或失败。
引入了 HTTP 标头的概念,无论是对于请求还是响应,允许传输元数据,使协议变得非常灵活,更具扩展性。
具备了传输除纯文本 HTML 文件以外其他类型文档的能力(凭借 Content-Type 标头)。
3.HTTP/1.1——标准化的协议
连接可以复用,节省了多次打开 TCP 连接加载网页文档资源的时间。
增加管线化技术,允许在第一个应答被完全发送之前就发送第二个请求,以降低通信延迟。
引入额外的缓存控制机制。
引入内容协商机制,包括语言、编码、类型等。并允许客户端和服务器之间约定以最合适的内容进行交换。
凭借 Host 标头,能够使不同域名配置在同一个 IP 地址的服务器上。
支持响应分块。
4.HTTP/2——为了更优异的表现
HTTP/2 是二进制协议而不是文本协议。不再可读,也不可无障碍的手动创建,改善的优化技术现在可被实施。
这是一个多路复用协议。并行的请求能在同一个链接中处理,移除了 HTTP/1.x 中顺序和阻塞的约束。
压缩了标头。因为标头在一系列请求中常常是相似的,其移除了重复和传输重复数据的成本。
服务端推送。其允许服务器在客户端缓存中填充数据,通过一个叫服务器推送的机制来提前请求。
5.HTTP/2 进化
对 Alt-Svc 的支持允许了给定资源的位置和资源鉴定,允许了更智能的 CDN 缓冲机制。
在 Cookie 头中引入安全相关的的前缀,现在帮助保证一个安全的 Cookie 没被更改过。
客户端提示(client hint) 的引入允许浏览器或者客户端来主动交流它的需求,或者是硬件约束的信息给服务端。
6.HTTP/3——基于 QUIC 的 HTTP
QUIC 旨在为 HTTP 连接设计更低的延迟。类似于 HTTP/2,它是一个多路复用协议,但是 HTTP/2 通过单个 TCP(可靠)
连接运行,所以在 TCP 层处理的数据包丢失检测和重传可以阻止所有流。QUIC 通过 UDP (不可靠)运行多个流,并为每个
流独立实现数据包丢失检测和重传,因此如果发生错误,只有该数据包中包含数据的流才会被阻止。
二.Http消息
1.HTTP 请求和响应结构
一行起始行用于描述要执行的请求,或者是对应的状态,成功或失败。这个起始行总是单行的。
一个可选的 HTTP 标头集合指明请求或描述消息主体(body)。
一个空行指示所有关于请求的元数据已经发送完毕。
一个可选的包含请求相关数据的主体(比如 HTML 表单内容),或者响应相关的文档。主体的大小有起始行的 HTTP 头来指定。
三.连接
1.短连接
每一个 HTTP 请求都由它自己独立的连接完成;这意味着发起每一个 HTTP 请求之前都会有一次 TCP 握手,而且是连续不断的。
标头Connection:close
2.长连接
长连接会保持一段时间,重复用于发送一系列请求,节省了新建 TCP 连接握手的时间,还可以利用 TCP 的性能增强能力。
标头Connection:keep-alive
四.安全
1.内容安全策略
内容安全策略(CSP)是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本(XSS)和数据注入攻击等。
配置网络服务器返回 Content-Security-Policy HTTP 标头
2.Strict-Transport-Security
HTTP Strict-Transport-Security(通常简称为 HSTS)响应标头用来通知浏览器应该只通过 HTTPS 访问该站点,
并且以后使用 HTTP 访问该站点的所有尝试都应自动重定向到 HTTPS。
3.HTTP Cookie
服务器收到 HTTP 请求后,服务器可以在响应标头里面添加一个或多个 Set-Cookie 选项。
浏览器收到响应后通常会保存下 Cookie,并将其放在 HTTP Cookie 标头内,向同一服务器发出请求时一起发送。
两种方法可以确保 Cookie 被安全发送,并且不会被意外的参与者或脚本访问:Secure 属性和 HttpOnly 属性。
SameSite 属性允许服务器指定是否/何时通过跨站点请求发送(其中站点由注册的域和方案定义:http 或 https)。
这提供了一些针对跨站点请求伪造攻击(CSRF)的保护。它采用三个可能的值:Strict、Lax 和 None。
Set-Cookie: mykey=myvalue; SameSite=Strict