HTTP0.9
HTTP0.9是HTTP最早的版本,最开始的需求只是用来传输体积很小html文件,一个Get index.html就可以了,所以它有以下特点:
-
只有一个请求行,没有请求头和请求体
-
服务器也没有返回头信息,只需要返回数据就可以了
-
以ASCII字符流进行传输
HTTP1.0
随着时代的发展,简单的html网页已经无法满足人们的需求,所以HTTP升级了1.0版本,有以下特点:
-
为了支持多类型文件下载,需要有文件编码、类型等信息,于是多加了请求头和响应头
-
为了方便服务器统计客服端的信息,如windows系统用户数,加入了用户代理字段
-
为了减轻服务器压力,提供了cache机制,缓存下载过的数据
-
引入了状态码,告诉浏览器最终请求结果
HTTP1.1
很快HTTP1.0也不能满足需求了,所以又做了大量的更新。
改进:
-
改进持久连接,同一域名默认允许同时建立6个TCP连接 Connection: keep-alive
-
虚拟主机技术发展,同一主机可以绑定多个域名,用host字段做不同处理,CDN实现域名分片机制,每个域名可以维护6个连接。
-
动态生成技术发展,引进Chunk transfers机制,客户端不需要知道数据大小,每个数据块发送时会附上上个数据块的长度,最后使用一个零长度的块作为发送数据完成的标志。
-
引入Cookie、同源策略等安全机制
不足:带宽利用率不高(核心问题)
-
尝试用管线化技术解决队头阻塞问题(TCP通道请求未及时回复导致管道阻塞),但最终放弃
-
TCP慢启动,为了减少网络拥塞的一种策略,但对小文件传输而言效率太低
-
容易受到Dos攻击
HTTP2.0
HTTP2.0主要对HTTP1.1的慢启动问题和队头阻塞问题做出优化
-
一个域名只使用一个TCP长链接,这样就只需要一次慢启动,同时也避免多个TCP竞争带宽
-
多路复用技术解队头阻塞问题
HTTP2.0实现多路复用的原理是在HTTP请求之后添加了一个二进制分帧层,将数据切成一个个带ID的帧,再通过底层传输。
HTTP2.0相对于HTTP1.1改变的只是传输方式而已,在语义上是一样的,所以对于我们开发者来说使用起来不需要做出什么改变,对于HTTP2.0推广更加轻松。
HTTP2.0还有一些其他新加的特性:
-
可以设置请求的优先级,对于一些优先级较高的资源可以优先处理
-
服务器推送功能,比方当请求HTML文件时,服务器直接将对应CSS、JavaScript文件推送过去
-
支持对请求头、响应头进行压缩
HTTP3.0
HTTP2.0看似完美解决了TCP的队头阻塞问题,但对于TCP传输的过程的问题来说,却是无可奈何。
你们是否还记得滑动窗口这个东西?如果单个数据包丢失,会导致滑动窗口停止,这种现象成为TCP上的队头阻塞。所以随着丢包率的增加,HTTP2.0效率也越来越差,当丢包率大于2%时,效率反而不如建立多个连接的HTTP1.0。
我们是不是可以升级下TCP协议的版本呢?很难,互联网大量中间设备依赖一些很少更新的软件,像路由器、交换机、防火墙等,都使用了大量的TCP特性。而且TCP协议是通过操作系统的内核来实现的,所以想要更新TCP这种底层协议,需要软件、硬件大换血,十分困难。
升级困难,发明一个新的传输协议同样也是面临这些问题,所以HTTP3.0大胆的舍弃了TCP协议,基于UDP协议来实现TCP多路复用、传输可靠等功能,这套功能称为QUIC协议。
缺点:
-
目前操作系统对UDP协议的优化远不如TCP
-
网络硬件方面,对UDP的优化程度也远低于TCP
我相信,随着时间的推移和技术的发展,HTTP3.0也会逐渐站上历史的舞台。
参考资料:
浏览器执行原理:https://time.geekbang.org/column/intro/100033601
计算机网络(第7版) 谢希仁著