前言
今天我们来研究一下HTTP协议各个版本之间的不同,笔者作为小白,还望大家多多指正文章中的不足之处
1.HTTP协议
1.1概述
超文本传输协议,简称HTTP协议,它是Web中的核心,它由客户端程序和服务器程序共同实现。两个程序运行在不同端系统中,通过HTTP报文进行会话
HTTP定义了Web客户端请求页面的方式,以及服务器向客户端传递Web页面的方式。当用户请求一个 Web 页面(如点击一个超链接) 时,浏览器向服务器发出对该页面中所包含对象的HTTP请求报文,服务器接收到请求并用包含这些对象的HTTP响应报文进行响应
HTTP使用TCP作为它的支撑运输协议,建立连接之后(三次握手),对浏览器和服务器进程通过套接字接口访问TCP,从而分别实现发送HTTP请求报文和HTTP响应报文
补充:什么是TCP协议三次握手
1、第一次握手:客户端给服务器发送一个 SYN 报文。服务端获取的信息:客户端可以正常发送数据包,服务端可以正常接收数据包
2、第二次握手:服务器收到 SYN 报文之后,会应答一个 SYN+ACK 报文。客户端获取的信息:服务端可以正常发送与接收数据包,客户端可以正常接收数据包
3、第三次握手:客户端收到 SYN+ACK 报文之后,会回应一个 ACK 报文。服务端获取的信息:客户端可以正常接收数据包。
4、服务器收到 ACK 报文之后,三次握手建立完成。此时,服务端与客户端都确定双方的发送与接收能力没有问题,才可以开始数据传输。
三次握手的作用是为了确认双方的接收与发送能力是否正常。
关于TCP的三次握手、四次挥手,这看这两篇文章,讲的非常生动形象:
关于三次握手与四次挥手面试官想考我们什么?--- 不看后悔系列 - 掘金 (juejin.cn)
跟着动画来学习TCP三次握手和四次挥手 - 掘金 (juejin.cn)
补充:常见HTTP响应报文:
请看这篇文章:HTTP请求报文和响应报文详解 - 掘金 (juejin.cn)
在HTTP协议中,服务器向客户发送被请求的文件,而不存储任何关于该客户的状态信息。假设某个客户端在短时间内,向同一个对象发起多次请求,服务器并不会因为第一次请求中为该客户端提供了这个对象就不再做出反应,而是在后后续的请求中重新发送这个对象。这是因为HTTP服务器并不保存用户的任何信息,因此我们说HTTP是一个无状态协议
1.2五层网络分层体系
由于五层网络分层体系的存在,HTTP既不用担心数据丢失,也不用关注TCP从网络的数据丢失和乱序故障中恢复的细节,这是传输层的工作,既然聊到了五层网络分层体系,我们不妨简单展开一下
- 应用层
应用层接收到传输层传来的数据,然而由于数据格式五花八门,因此我们在网络层要定义各种各样的协议,规范不同格式数据间的交流方式,HTTP协议(万维网服务)、FTP协议(文件传输)、SMTP协议(电子邮件)等
- 传输层
在传输层中,客户端与服务器之间的IP已经由网络层获知,此时客户端与服务器之间通过某个特定端口建立二者之间的连接,在传输层中,常见的传输协议是TCP(可靠传输)和UDP(不可靠传输),HTTP使用TCP作为它的支撑运输协议
- 网络层
网络层用于确定通信双方是否处于同一网段,通信双方设备IP地址为多少, IP地址分为网络部分和主机部分,我们通过子网掩码与IP地址做and运算,以此来确定,两台主机是否同一网段。
若通信双方设备处于同一网段,则设备A向设备B发送数据时,设备A通过网关进行ARP广播,发送ARP请求,若目的设备B接收到ARP请求后,会返回一个ARP请求,里面包含自己的MAC地址,设备A接到设备BMAC地址后,便可以开始建立连接,为上一层的数据传输做好准备。
- 数据链路层
通过以太网协议定义二进制数据传递规则,通过MAC地址进行寻址
- 物理层
通过物理设备(光纤、双绞线、电缆等)将两台计算机连接起来
更多细节可以参考这篇大神文章:juejin.cn/post/684490…
2.HTTP各个版本协议
HTTP1.0:
HTTP/1.0规定浏览器和服务器保持短暂的连接。浏览器的每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(无连接)
简单来讲,每次与服务器交互,都需要新开一个连接。比如在传输一个封装的有10张png格式的图片的HTML网页时,他会分别建立10个TCP连接,用于传输图片,这无疑会占用大量网络资源。
并且1.0版本还存在队头堵塞的问题,HTTP/1.0规定下一个请求必须在前一个请求响应到达之前才能发送。假设一个请求响应一直不到达,那么下一个请求就不会开始,阻塞了后面请求的正常发送
HTTP1.1:
为了解决1.0版本的问题,1.1版本与持久连接横空出世。
持久连接(也叫长连接、长轮询)。一定时间内,同一域名下的HTTP请求,只要两端都没有提出断开连接,则持久保持TCP连接状态,其他请求可以复用这个连接通道。
HTTP/1.1 实现并默认了所有连接都是持久连接,这样客户端发起多个HTTP请求时就减少了TCP握手造成的网络资源和通信时间的浪费,比如在传递一个HTML文件时,他们的html、css、js以及图片都可以通过一个TCP连接进行传送。
然而,HTTP/1.1仍然无法解决队头堵塞的问题,即使HTTP/1.1支持管道化连接,客户端可以发起多个请求,服务器也只能一个一个去回应请求,请求无法并行响应。假设在一次数据交互中,客户端向服务器同时请求html、css、js,就算服务器的css与js文件已经准备就绪,也只能等待html资源传输完毕,其它资源才可以传输。
虽然现阶段的许多浏览器厂商通过允许用户开启多个TCP会话的方式,来实现并行请求,这毕竟会消耗额外的网络资源,浏览器也会对同域下并行请求做出个数限制,并且很多浏览器也不支持管道化技术
有没有更完美的方案呢?当然有
此外,HTTP/1.1支持断点传输,以及增加了Host字段(使得一个服务器能够用来创建多个Web站点)。
HTTP2.0:
得益于二进制分帧技术,二进制数据传输使得HTTP2.0拥有更高的传输效率。
HTTP2.0首次采用多路复用的策略,每个HTTP请求都有一个序列标识符,这样浏览器可以并发多个请求,服务器接收到数据后,再根据序列标识符重新排序成不同的请求报文,而不会导致数据错乱。同样,服务端也可以并发返回多个响应给浏览器,浏览器收到后根据序列标识重新排序并归入各自的请求的响应报文。
它们之间的区别:
- HTTP2.0可以在服务器不接到对某个资源请求的情况下,就能向客户端发送该资源
- 与HTTP1.x为了解决队头阻塞,将同一个页面的资源,分散到其它域名下,分别开启多个TCP连接不同,HTTP2.0的所有数据传输都是在同一域名下的同一连接中完成的
- HTTP1.x中keep-alive开启的单个TCP连接在同一时刻,仍然只能处理单个的请求,而HTTP2.0单个TCP连接在同一时刻,可以并行多个请求
此段的启发来自于以下大神文章:
HTTP1.0、1.1、2.0协议的特性及区别 - 掘金 (juejin.cn)
3.HTTP协议2.0版本对前端的影响
HTTP协议2.0之前,我们在实际前端开发中,我们需要把全js全部放在body最后,集中加载。有了HTTP2.0多路复用之后,即使JS都是零散加载,也不会影响我们的加载速度