目录
一 http简介
二 quic协议详解
1 重传机制
2 流量控制
3连接迁移
一 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加密。
二 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 的变化,连接在逻辑上仍然是通的。