http1.1
http1.1 是基于tcp实现的应用层协议,所以请求需要建立连接,由于建立连接和断开连接的过程很耗费资源,通过keep-alive机制可以让多个请求复用同一个连接。文本协议,每次请求都需发送完整的数据。
虽然可以多个请求复用同一个连接,但实际是在一个队列中排队发送,当队头的请求出现问题时,就会堵塞整个发送,也就是队头堵塞问题。
请求的格式
由三部分组成:
- 请求头:用于表示本次请求的方法,路劲,协议版本
- 首部:配置信息
-
实体:具体参数
image.png
GET /search HTTP/1.1
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)
Connection: Keep-Alive
响应的格式
也是三部分组成:
- 响应头:协议版本,响应状态,描述信息
- 首部:配置信息
-
实体:响应结果
image.png
http 2.0
是对http1.1的优化,主要有几个方面:
- 减少请求头的无效传输,通过在通信两端建立索引表,相同的头字段只需发送索引id即可。
- 将tcp连接虚拟成多个流,彼此互不干扰,不同的请求就可以通过不同的流发送,从而避免对队头堵塞问题。同时流也是有优先级的,确定不同请求的紧急程度。
- 内容编码,信息编程成二进制,分割成更小的帧,header帧传输Header,data帧传输实体内容。每一个header帧都代表着一个新的流。帧的发送是乱序的,目的是为了避免队头堵塞。
quic
- tcp的包是严格有序的,仍然存在串行问题。所以为了彻底解决这个问题,quic选择使用udp作为底层的传输协议。
- 自定义连接机制:不再通过四元组表示一个连接(源ip,源端口,目标ip,目标端口),而是通过一个64位(8字节)的随机数标识一个连接。
- 自定义重传机制:通过包的序号持续递增的机制,哪怕包丢失,重发的包序号也会递增,从而确认更加准确的RTT(往返时间)。而发送的位置通过offset来确认。
- 无堵塞的多路复用: udp的多个流之间没有依赖,也不需要有序发送,做到了真正的并发。
- 自定义的流量控制:滑动窗口中位置不再依据最近一次连续递增的应答,而是依据实际应答的个数,哪怕中间有包丢失,应答依然有效,窗口右移。
网友评论