好,我们来聊聊HTTP的版本区别。HTTP,也就是超文本传输协议,大家上网刷网页、看视频都离不开它。从最早的HTTP/0.9到现在的HTTP/3,这一路走来,就像从一个简陋的小推车升级成了高速动车组。咱就从最朴素的版本开始,看看它是怎么一步步变得更牛的。
HTTP/0.9:最原始的起点
HTTP/0.9是1991年搞出来的,简单得不能再简单。想象一下,那会儿互联网刚起步,需求也很直白:我发个请求,你给我传个HTML页面就行。所以它支持的只有GET请求,服务器收到后直接把页面丢回来,完了,连状态码都没有。响应头?更别提了,就纯纯的HTML内容。
这听起来是不是挺干脆?但问题马上就暴露了。比如我请求一个页面,服务器要是挂了或者文件找不着,根本没啥反馈,我就干瞪眼等着。再比如,客户端和服务器之间完全没啥"沟通余地",只能传HTML,想传个图片啥的?抱歉,没门儿。
那咋优化呢?显然得加点反馈机制,比如告诉客户端请求到底成功没,还得支持更多文件类型。这不,HTTP/1.0就应运而生了。
HTTP/1.0:稍微聪明点了
1996年,HTTP/1.0来了。这次可没那么寒酸了,它加了请求头和响应头,还有状态码,像200表示成功、404表示找不到页面,总算能让人知道发生了啥。还能传图片、音频这些东西,因为它支持了Content-Type,告诉浏览器这是啥玩意儿。
但这版本还是有毛病。因为每次请求都得重新建个TCP连接,干完活就断开。比如我打开个网页,里面有10张图,那就是10次连接,建了拆、建了拆,太费劲了。时间都浪费在握手上了,效率低得不行。而且头信息还不能压缩,啰啰嗦嗦传一堆东西,带宽也遭罪。
咋整?一个方向是能不能少建点连接,另一个是把头信息压一压。这两条路子,HTTP/1.1都给整上了。
HTTP/1.1:开始有点现代味儿
1997年,HTTP/1.1登场,算是HTTP家族里用得最久的版本。它直接把"持久连接"加了进来,默认开了Keep-Alive,一个TCP连接能处理多个请求,省了老建连接的麻烦。比如我加载网页,那10张图可以复用一个连接,效率蹭蹭往上涨。
还加了个管道化功能,啥意思呢?就是我可以把多个请求攒一块儿发出去,不用等第一个回来再发第二个。但这里有个坑,服务器还是得按顺序回,前面要是卡住了,后面的还得排队等着,这叫"队头阻塞"。再加上头信息还是没压缩,遇到复杂的网页,传输量一大,照样慢吞吞。
咋改进呢?一是得解决这个排队问题,让请求能并行跑;二是把头信息再精简下,别那么臃肿。这两条思路,直接指向了HTTP/2。
HTTP/2:并行跑起来
2015年,HTTP/2来了,基于SPDY协议改的。这回可牛了,它把数据切成一个个小块(叫帧),通过"二进制分帧"传。啥好处呢?多个请求可以一块儿跑,不用排队了,队头阻塞基本解决了。比如我加载网页,HTML、CSS、图片可以同时下,不用傻乎乎等。
还有个大招,头部压缩。用了个叫HPACK的算法,把重复的头信息压得贼小,传起来更快。更别提它还支持服务器推送,浏览器还没问呢,服务器就主动把资源塞过来,比如你点开网页,CSS文件直接就到手了。
但HTTP/2也有短板。它还是跑在TCP上,TCP这家伙太"小心眼儿"了,丢了个包就得重传,底层的队头阻塞还是没跑掉。咋办?干脆换个跑道,UDP走起,这就有了HTTP/3。
HTTP/3:彻底拥抱UDP
HTTP/3是现在最潮的版本,基于QUIC协议,用UDP代替了TCP。UDP本身不靠谱,但QUIC在上面加了可靠性和拥塞控制,比TCP还灵活。最大的亮点是"零RTT建连",啥意思呢?就是第一次握手后,后续连接几乎不用等,直接开干。丢包也不怕,每个数据流独立跑,一个卡了不影响别的。
比如我看4K视频,HTTP/3能保证画面流畅加载,哪怕网络抖一下,也不至于全卡住。相比HTTP/2,它在弱网环境下的表现简直不要太香。
总结一下
从HTTP/0.9到HTTP/3,每一步都在解决前面的痛点。0.9太简陋,加了反馈和多样性就有了1.0;1.0太费连接,1.1就搞了复用;1.1排队烦人,2.0就并行跑;2.0被TCP拖后腿,3.0直接上UDP。优化方向无非是更快、更稳、更省资源,跟现在的主流方案完全吻合。数字上,比如HTTP/1.1复用连接能省下几十毫秒的建连时间,HTTP/2并行能再砍掉几百毫秒的等待,HTTP/3在弱网下延迟能低到个位数毫秒,这进步可不是盖的!