目录
一 http简介
1 http版本
http0.9
目录
1991年发布, 没有header,功能非常简单,只支持GET
http1.0
1996年发布,明文传输安全性差,header特别大。它相对0.9有以下增强:
- 增加了header(使用元数据与数据解耦)
- 增加了status code,用于声明请求的结果。
- content-type可以传输其它文件。
- 请求头增加了http/1.0版本号。
支持GET, POST 和 HEAD方法
缓存策略:http1.0的缓存策略主要是依赖header中的If-Modiified-Since,Expire(到期)
缺点:短连接,每请求一次资源就新建一次tcp连接
http1.1
1997发布,是现在使用最广泛的版本。它相对1.0有以下增强:
- 可以设置keepalive让http重用tcp连接(请求必需串行发送),长连接
- 支持pipeline传输,请求发出后可以继续发送请求
- 增加了HOST头,让服务端知道用户请求的是哪个域名
- 增加了type、language、encoding等header
- 断点续传(通过在 Header 设置参数)
- 新增OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
缓存策略:http1.1的缓存策略要比http1.0略多,例如 Entity tag(实体标签), If-Unmodified-Since, If-Match, If-None-Match等.
2014年更新了内容:
- 增加了TLS支持,即https传输
- 支持四种模型:短连接,可重用tcp的长链接,服务端push模型(服务端主动将数据推送到客户端cache中),websocket模型
缺点:还是文本协议,客户端服务端都需要利用cpu解压缩
http2.0
2015年发布,主要是提升安全性与性能。它相对1.1的增强有:
- header压缩(合并同时发出请求的相同部分)
- 二进制分帧传输,更方便头部只传输差异部分
- 流多路复用,同一服务下只需要用一个连接,节省了连接
- 服务器推送,一次客户端请求服务端可以多次响应。
- 可以在一个tcp连接中并发发送请求
缺点:基于tcp传输,会有队头阻塞问题(丢包停止窗口滑动),tcp会丢包重传。tcp握手延时长,协议僵化问题。
http3.0
2018年发布,基于谷歌的QUIC,底层使用udp代码tcp协议,用户空间使用。(TCP/udp由操作系统内核实现,系统空间)
这样解决了队头阻塞问题,同样无需握手,性能大大地提升,默认使用tls加密。
2http应用层参数意义
range:下载范围
connection:close 短连接,keep alive长连接
延伸http1.0和http1.1的区别:
a http1.0只支持短连接,http1.1可支持长连接
b http1.1新增host字段,支持虚拟主机。同一个物理主机上可能对应多个虚拟ip,分别对应不同的网站,通过host字段可以区分不同的网站
c 请求方法
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
3 队头阻塞问题
队头阻塞(Head-of-Line blocking, 简写:HOL blocking), 是http协议的一个著名问题, 它会导致延时的提高。队头阻塞, 是指第一个数据包(队头)受阻而导致整列数据包传输受阻。队头阻塞在OSI的多个层中都有, 例如:
HTTP队头阻塞
TLS队头阻塞
TCP队头阻塞
在http1.0中, http队头阻塞是指:在同一个TCP通道上,客户端的第一个http请求, 会阻塞该客户端后续的http请求,直到客户端接收完毕第一个http请求的响应。如下图所示:请求1发出后, 不能立即发出请求2, 要等响应1收到后, 才能发出请求2。要点:阻塞在客户端请求
http1.0队头阻塞
在http1.1中, http队头阻塞是指:在同一个TCP通道上,服务端的第一个http响应, 会阻塞服务端后续的http响应,直到服务端发送完毕第一个http响应。要点:阻塞在服务端响应
http1.1队头阻塞
http队头阻塞的原因, 是因为http协议设计上, 不支持响应的乱序。应对方式: 请求和响应都带上同一个唯一ID。在http2中, 增加了streamId, 一对请求和响应, 会带有同一个streamId.
TLS队头阻塞是指:在同一个TCP通道上,接收端, 要等待组成完整数据的所有TCP包, 都接收完毕后, TLS才可以进行解密。
TCP队头阻塞, 既包含了发送端的队头阻塞, 也包含了接收端的队头阻塞.
TCP发送端队头阻塞是指:在同一个TCP通道上,第一个TCP滑动窗口内的多个分组, 在全部发送且ack确认完成前, 会阻塞后续的滑动窗口的发送。
TCP接收端队头阻塞是指:在同一个TCP通道上,如果sequence number较小的包丢失了,则后续sequence number较大的包都会积压在接收端缓存中, 且无法被应用层获取到。
二 quic协议详解
1 重传机制
packet number;PKN=4,重传的PKN=2的数据包。offset表示该数据包在总数据中的偏移
2 流量控制
与tcp流量控制滑动窗口原理类似
和 TCP 不同的是:QUIC 的滑动窗口分为 Connection 和 Stream 两种级别。Connection 流量控制:规定了所有数据流的总窗口大小;Stream 流量控制:规定了每个流的窗口大小。
则整个 Connection 的可用窗口大小为:20+30+10 = 60
3连接迁移
当客户端切换网络时,和服务器的连接并不会断开,仍然可以正常通信,对于 TCP 协议而言,这是不可能做到的。因为 TCP 的连接基于 4 元组:源 IP、源端口、目的 IP、目的端口,只要其中 1 个发生变化,就需要重新建立连接。但 QUIC 的连接是基于 64 位的 Connection ID,网络切换并不会影响 Connection ID 的变化,连接在逻辑上仍然是通的。