32 全面解析HTTP:从HTTP 0.9到HTTP 3的演变
你好,我是Barry。
从这节课开始,我们正式开启直播模块的学习。
在开发直播平台前,我们需要先学习HTTP相关技术。直播平台的核心功能就是基于网络传输实时音视频数据,而HTTP是用于在客户端和服务器之间传输数据的协议,它能优化数据传输效率、实现实时性和稳定性,保护用户隐私和数据安全,实现与服务器的交互和集成。
与此同时,网络知识也是一个技术人员的基本功,但是很多技术人员会忽视掉这一块的内容,在工作和面试中吃了很多的亏,所以这节课我们就以HTTP为切入点,系统梳理一下这部分内容。
初识HTTP
HTTP是一种用于传输超文本(如HTML、XML、JSON等)的应用层协议。它是互联网上最常用的协议之一。
因为网络协议是我们的必备知识,这里我也顺便说说其他的传输协议。
- FTP,用来做文件传输的协议,使用客户端和服务器之间的连接来传输文件。
- SMTP,用于发送电子邮件的协议,它使用客户端和服务器之间的连接来传输邮件。
- SSH,这是用于远程登录和管理计算机的协议,它使用客户端和服务器之间的安全连接来传输数据。
HTTP的发展历程从20世纪80年代开始算起,当时互联网还处于发展的早期阶段。在HTTP的早期版本中,它主要用来在客户端和服务器之间传输静态文本和图像文件。
随着互联网的发展,为了适应不断变化的需求,支持更多功能和特性(例如多媒体、动态内容、安全性、可扩展性等),HTTP协议也在逐渐扩展和改进。
从最初的HTTP/0.9的版本到现在的HTTP/3,HTTP始终在不断地创新优化,所以才成为了互联网最常用的协议之一。
我这就来为你梳理一下HTTP整个发展历程,看看它在每个阶段都有什么发展变革。
HTTP详解
梳理完HTTP的发展历程和每个阶段做出的重要调整,我们还需要更深入地了解每个阶段的细节,这才是掌握HTTP相关知识的核心。掌握了这些,不仅能够巩固我们对HTTP的应用理解,也能让你轻松应对在技术面试中网络相关的技能考察。
HTTP/0.9
我们先从HTTP/0.9这个版本开始说起,HTTP/0.9最初诞生主要用来在网络之间传递HTML超文本,所以被称为超文本传输协议。
当时它的实现也非常简单,只有请求行,通过单一的请求行已经能够满足要获取的内容。同时,对于相应内容也只是需要返回数据就可以,这里的数据格式也只能是HTML数据格式,这也在后来的发展中成为了它的缺点。
在后续的使用场景中,用户涌现出大量新的需求,在浏览器传输文件中不单单只有HTML。例如还有JS和CSS脚本、图文、音视频等不同类型的文件。所以就需要HTTP能够满足更多类型文件的传输,在巨大的需求下HTTP/1.0诞生了。
HTTP/1.0
HTTP/1.0与HTTP/0.9相比做了很大的变革。我们这就一起来看一下,它都做了哪些全面的升级。
首先,HTTP 1.0引入了请求头和响应头,主要是为了提供更多的信息来帮助客户端和服务器更好地处理请求和响应,使得HTTP协议更加易于使用和维护。
其次,在请求方法上也开始支持GET、POST、Head请求方法。
最后,通过支持缓存机制,来减轻服务器的负担,也引入了状态码,把请求结果反馈做得更加完善。
虽然HTTP/1.0做了很大的优化和改变,但在后续应用时还是发现一些核心的问题。
首先,它只有在上一个请求返回之后,才能够再去执行下一个,这样会引起队头阻塞。
其次,它只能支持一个服务器,只有一个域名。
最后,在数据传送方面存在一些资源浪费,每次请求都需要提交完整的头部对象进行传递。
HTTP/1.1
所以,HTTP/1.0后来逐渐无法满足技术发展需求,这时HTTP/1.1应运而生。它在1.0的基础上又做了大量更新迭代。
第一,在效能优化方面,HTTP/1.1引入了持久连接,大大减少了TCP建立连接时消耗的次数,节省了服务器的资源消耗,实现了访问提效。
第二,通过在请求头中新增Host字段,解决服务器只能支持一个域名的问题。通过Host字段来表示当前的域名地址,服务器可以通过Host值来区分处理不同的域名。
第三,新增了e-tags和Cache-control,这也是一次重要的变革。这里说个题外话,我们面试当中经常会被问到这两个参数的用途,它们分别用来判断资源是否发生了变化以及如何处理缓存和过期策略。通过使用e-tags和Cache-control,HTTP 1.1能够更好地支持缓存和优化网络传输,提高了Web性能和可靠性。
第四,添加了Pipeline。这允许客户端在第一个请求的没完全传输之前,就发送第二个请求,这么做降低了通信的延迟。虽然Pipeline在HTTP/2才投入稳定的应用,但其实它在1.1的阶段就曾投入使用。Pipeline机制主要还是为了优化性能。具体的执行效果图如下所示。
还有其他的一些优化,例如HTTP/1.1通过引入Chunk transfer机制来实现对动态内容的支持。这个阶段还新增了5种新的请求方法,我给你整理在了后面的表格里,你可以看一下。
我们看到了在HTTP/1.1阶段发生的巨大的更新,在提效节能方面进行了多维度优化。但是宽带利用率和队头阻塞问题还是没有得到充分解决。
HTTP/2.0
HTTP/2.0的推出原因不言而喻,目的是为了对HTTP进行持续的版本迭代和升级。那么HTTP/2相比HTTP/1.1又做了哪些迭代呢?
第一,HTTP/2采用二进制格式而非文本格式,二进制协议解析起来更高效、“线上”更紧凑,更重要的是错误更少。
第二,为了解决HTTP/1.x中存在的队头阻塞问题,HTTP/2提出了多路复用的概念。多路复用主要解决线头阻塞问题,具体来说就是实现在同一条connection之上可以混合发送分属于不同stream的frame,这样就能达到发送多个request的功能的效果。
第三,HTTP/2使用Header压缩机制,持续降低开销。我们都知道,HTTP1相关版本的header带有大量信息,而且每次都要重复发送,这样会造成大量的资源消耗。而HTTP/2采用 HPACK算法进行压缩,节省了资源消耗。
第四,HTTP/2让服务器可以将响应主动“推送”到客户端缓存中。在HTTP/2中,服务器可以在发送响应之前,主动向客户端推送一些资源,这些资源可以是页面中的常见资源,比如图片、样式表、脚本等。通过这种方式,服务器可以在客户端请求资源之前就提前发送响应,减少客户端的等待时间,提高了网页的加载速度。
同时,HTTP/2还有增加了一些新特性。
- 引入了优先级(Priority)机制,允许客户端在请求中指定资源的优先级。
- 引入了流控制(Flow Control)机制,通过在发送方和接收方之间设置缓冲区来控制数据的流量。
- 采用二进制协议,将HTTP协议的文本格式改为二进制格式,减少了传输中的开销,提高传输效率。
不过,HTTP/2依然存在一些缺点,例如在 TCP 传输过程中,由于单个数据包的丢失而造成的阻塞。这是因为在 HTTP/2 中,多个请求是跑在一个 TCP 管道中的,如果其中任意一路数据流中出现了丢包的情况,那么就会阻塞该 TCP 连接中的所有请求,这就是我们常说的TCP 上的队头阻塞。
HTTP/3.0
综合前面的梳理,可以看出尽管HTTP/2在HTTP/1的基础上做了很多革新,但是依然有一些缺陷。接下来,我们就看看HTTP/3又做了哪些变革。
HTTP/3.0的核心目标是提升性能、加快响应速度、保障交互安全性。HTTP/3.0的核心是QUIC协议,它是基于UDP的协议,这代表着在传输效率上相比之前的版本有了大幅提升,这属于颠覆性的变革,不需要再像之前的版本那样,经历复杂的连接环节。
HTTP 3.0 还支持更强的安全性,支持使用TLS 1.3协议进行加密和保护数据传输,TLS 1.3是最新的安全传输协议。这与之前相比极大的保护了用户的隐私和数据安全,能让用户更加信赖去使用。
在解决多路复用丢包的线头阻塞问题方面,QUIC保留了HTTP2.0多路复用的特性。在之前的多路复用过程中,同一个TCP连接上有多个stream,只要有一个丢包,那在这个stream前后的stream都会有影响。而在QUIC上的stream之间并没有依赖关系,所以只关注当下丢包的stream就可以,这个方式有效避免了线头阻塞的问题。
另外,HTTP/3还实现了有序交付。我们都知道UDP 是不可靠传输协议,为了实现有序交付,QUIC 在每个数据包都设有一个 offset 字段,也就是偏移量,这样接收端就能根据 offset 字段为异步到达的数据包做排序。
总结
又到了课程的尾声,我们一起来回顾总结一下这节课的重点。
HTTP是超文本传输协议,是一种用于在客户端和服务器之间传输数据的协议。除了在线直播平台项目里需要应用到HTPP的相关技术知识,我们日常开发里也少不了和HTTP打交道。
针对HTTP的发展,我们从最初的HTTP/0.9到HTTP/3进行了全面解读,了解了在每个阶段HTTP主要解决的问题,在不同版本都做了哪些突破和优化,又存在哪些不足。你可以结合后面的表格回顾复习一下。
最后再分享一点HTTP相关知识的学习技巧:你需要明确在不同版本间主要做了哪些创新和解决哪些问题。至于网络部分的考核,更看重你是否能深入掌握HTTP的核心原理,希望你在课后参考这个思路再仔细复习一下,这样学习效果会更好。
思考题
你觉得HTTP和HTTPS存在哪些区别?欢迎你总结分享。
期待你在留言区和我交流互动,也推荐你把这节课分享给身边的更多朋友。
- peter 👍(0) 💬(1)
请教老师几个问题: Q1:Python开发的网站,服务器可以用tomcat吗? Q2:Python开发的网站,可以用docker等虚拟机部署吗? Q3:http传XML或JSON,是把XML或JSON放到消息体中吗?什么场景中会用http来传XML或JSON?(我头脑中固定印象就是传html的,认识有局限) Q4:二进制格式与文本格式的区别? 文中提到“HTTP/2 采用二进制格式而非文本格式”,不是很理解。文本格式最后不也是要变成二进制传输吗? Q5:host怎么理解? Host难道是可以指明多个服务器吗? Q6:HTTP3用UDP,丢包怎么解决?
2023-07-06 - ZENG 👍(0) 💬(1)
自己没有总结过,老师帮总结很完全,很硬核。 对于http和https区别,就是一般使用的4层模型就到了5层模型,原来的http和tcp直接握手的变为http和tcp之间加了一个ssl/tls层,专门作为加密认证等,就不会改变原来的层原有的作用,我感觉就是http加了一层装饰器
2023-07-05 - 长林啊 👍(0) 💬(1)
你觉得 HTTP 和 HTTPS 存在哪些区别? ------------------------------- 都是用于网络上传输数据的两种协议; 区别: 安全:HTTP 传输的数据是明文的;HTTPS 使用 SSL 或 TLS 协议对数据进行加密。HTTPS 使用证书对进行身份验证,确保建立的连接是安全的 端口:HTTP 使用 80 端口进行通信,HTTPS 使用 443 端口进行通信 数据完整:HTTPS 提供了数据完整性的保护,通过使用加密算法和证书的加持,可以有效的确保数据在传输过程中没有被篡改
2023-07-05