文章目录
HTTP1.0 HTTP1.1 HTTP2.0 主要特性对比
HTTP1.0
无状态无连接:HTTP1.0默认浏览器和服务器保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态)。
这种无状态性可以借助cookie/session机制来做身份认证和状态记录。而无连接就比较麻烦了。
无连接的特性导致最大的性能缺陷就是无法复用连接。每次发送请求的时候,都需要进行一次TCP的连接,而TCP的连接释放过程又是比较费事的。这种无连接的特性会使得网络的利用率非常低。
HTTP1.1
1、默认长连接:也就是多个请求和响应可以利用同一个 TCP 连接,而不是每一次请求响应都要新建一个TCP连接,减少了建立和关闭连接的消耗和延迟。
2、管道机制:HTTP/1.1 采用了长连接的方式,这使得管道(pipeline)网络传输成为了可能。即可在同一个 TCP 连接里面,客户端可以发起多个请求,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。虽然引进了管道机制,但是当前存在诸多问题,且默认处于关闭状态。
服务器还是按照顺序,先回应 A 请求,完成后再回应 B 请求。要是前面的回应特别慢,后面就会有许多请求排队等着。这称为「队头堵塞」。
3、带宽优化:HTTP 1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接受到100,才开始把请求body发送到服务器。
这样当服务器返回401的时候,客户端就可以不用发送请求body了,节约了带宽。
4、断点传输:在 HTTP/1.1 版本中,可以不必等待数据完全处理完毕再返回,服务器产生部分数据,那么就发送部分数据。这是支持文件断点续传的基础。
5、host:在HTTP 1.1中增加Host请求头字段后,WEB浏览器可以使用主机头名来明确表示要访问服务器上的哪个WEB站点,这才实现了在一台WEB服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点。
HTTP2.0
1、二进制传输:http2.0将请求和响应数据用帧的形式发送,并且它们采用二进制编码(http1.0基于文本格式)。多个帧之间可以乱序发送,根据帧首部的流标志可以重新组装。(从应用层解决队头阻塞但是传输层依然有该问题)
2、多路复用:基于二进制基础,可以只通过一个TCP链接就可以传输所有的请求数据。
3、Header压缩:http2.0开发了专门的“HPACK”算法,大大压缩了Header信息。
4、服务端推送:服务器不再完全被动地响应请求,也可以新建“流”主动向客户端发送消息。(例如,浏览器在刚请求html的时候就提前把可能会用到的JS,CSS文件发送给客户端,减少等待延迟,这被称为“服务端推送Server Push”)
缺点:
1、TCP以及TCP+TLS/SSL建立连接的延迟
2、TCP的队头阻塞没有彻底解决(http2.0中,多个请求是跑在一个TCP管道中的,一旦丢包,TCP就要等待重传(丢失的包等待重新传输确认),从而阻塞该TCP连接中的所有请求)
HTTP3.0
1、集成了TLS加密功能
2、实现了快速握手功能,相当于TLS和TCP同时握手了
2、基于UDP,但是在上层的QUIC中实现了类似TCP的协议,同时也彻底解决TCP中队头阻塞的问题(单个“流”是有序的,可能会因为丢包而阻塞,但是其他流不会受到影响)
HTTP1.1的缺点:安全性不足和性能不高;
HTTP2.0是更安全更快的HTTPS,头部压缩,多路复用等技术充分利用了带宽,降低了延迟。
HTTP3.0的底层支撑协议QUIC基于UDP实现,又含TCP的特点,实现了又快又可靠的协议。
websocket
HTML5 开始提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。它基于 TCP 传输协议,并复用 HTTP 的握手通道。
WebSocket 使用 HTTP 协议进行连接,然后升级为 WebSocket 协议。在需要双向通信的应用场景下非常有用,实时性非常高且不受跨域限制。
特点:
双向通信:WebSocket 允许在同一个连接上同时发送和接收数据,从而实现实时双向通信。
持久连接:一旦建立了 WebSocket 连接,它会保持打开状态,直到显式关闭连接。
低延迟:WebSocket 的双向通信性质使得数据传输更加即时,相比传统的 HTTP 请求,减少了通信延迟。
轻量级:与 HTTP 相比,WebSocket 协议头较小,减少了数据传输时的开销。
支持跨域:WebSocket 允许在不同域名之间进行通信,通过协议和安全措施确保通信安全性。
HTTP2和websocket的服务端推送区别
1、http2.0需要客户端发起请求以后,进行相应,再附带推送,需要客户端发起请求。websocket不需要客户端发请求,就能实现推送。
2、http2.0的推送内容只是浏览器能够感知即存放在浏览器的缓存中,代码是无法获取到数据的,所以还得配合SSE获取数据。http2.0的推送内容典型场景:向后端请求一个html,服务器把html页面中的css,js等资源也推送到了浏览器,这是客户端发起请求时,直接在缓存中读取。websocket可以拿到数据,在代码中使用。
WebSocket 更适合实时、双向通信的场景,而 HTTP/2 的服务器推送更适合通过提前推送相关资源来提高性能的场景。
单工、半双工、全双工
单工:只支持数据在一个方向上传输
半双工:允许数据在两个方向上传输,但是在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信。
全双工:允许数据同时在两个方向上传输,它要求发送设备和接收设备都有独立的接收和发送能力。
tcp是全双工的,但它的上层可能支持半双工,比如http1.1,也有可能支持全双工,比如http2.0。
参考:
https://www.cnblogs.com/lzcnblogs/p/16667190.html
https://blog.csdn.net/weixin_53186633/article/details/123624445
https://www.bilibili.com/video/BV1vv4y1U77y
https://blog.csdn.net/weixin_43801836/article/details/127695498
https://blog.csdn.net/qq_44036439/article/details/129107830