本文最后更新于 392 天前,其中的信息可能已经有所发展或是发生改变。
Http 1.0
存在的问题
- 无法复用链接:每个请求都需要建立TCP链接。
- 对头阻塞:第二个请求必须等第一个请求响应后才能发起。
Http 1.1
特性
- 默认使用长连接,可配置Keep-alive来控制连接时间
- 支持请求管道化,客户端可以发送多个请求,而不用等待前一个请求响应。
存在的问题
- 为了让客户端识别请求对应的响应,服务端响应时,必须按照请求的顺序进行响应,哪怕第二个响应准备好了,也得等第一个响应先返回。
Http 2.0
特性
- 采用二进制格式传输数据,而非Http 1.x的文本格式,解析更高效。
- HTTP 1.x的请求和响应报文,都是由起始行,首部和实体正文(可选)组成,各部分之间以文本换行符分隔。HTTP2.0 将请求和响应数据分割为更小的帧,并且它们采用二进制编码,乱序发送,最终组装。
- 压缩header,并缓存header。
- 同个域名只需要占用一个TCP连接,使用一个连接并行发送多个请求和响应。
- 多个请求之间、多个响应之间互不影响,实现并发。
存在的问题
- 由于复用一个TCP链接,一旦出现丢包,就得重传,后面所有请求都被阻塞。
Http 3.0
特性
- 谷歌基于UDP 协议来定义的 QUIC 协议,应用到Http 3.0上。
- 不需要链接,所以没有额外的链接时间。
- 一个连接上的多个stream之间没有依赖,如果某个Stream丢了一个包,是不影响后续的Stream。
- 向前纠错:每个数据包除了它本身的内容之外,还包括了部分其他数据包的数据,因此少量的丢包可以通过其他包的冗余数据直接组装而无需重传。
- 加密认证的报文: TCP协议头部没有经过任何加密和认证,所以在传输过程中很容易被中间网络设备篡改。QUIC 所有报文头部都是经过认证的,报文Body都是经过加密的。
- QUIC在移动端的表现也会比TCP好。因为TCP是基于IP和端口去识别连接的,这种方式在多变的移动端网络环境下是很脆弱的。但是QUIC是通过ID的方式去识别一个连接,不管你网络环境如何变化,只要ID不变,就能迅速重连上。
如何衡量网络的质量?
带宽
单位时间内传输的数据量。
时延
发送数据到就收数据总共花费的时间,包含发送时延,处理时延(网络设备),排队时延(网络设备),传播时延。
抖动
最大时延与最小时延的差值。
丢包
某些原因下会出现丢包,例如网络阻塞:某个网络设备处理不了这么多数据,有的数据包排队很久了,就可能会被丢掉。