http协议和WebSocket协议之间的区别与特点
什么是WebSocket
WebSocket是HTML5中新协议、新API。 WebSocket从满足基于Web的日益增长的实时通信需求应运而生,解决了客户端发起多个Http请求到服务器资源浏览器必须要在经过长时间的轮询问题,实现里多路复用,是全双工、双向、单套接字连接,在WebSocket协议下服务器和客户端可以同时发送信息。
WebSocket 同 HTTP 一样也是应用层的协议,但是它是一种双向通信协议,是建立在 TCP 之上的。
它的特点是:一旦handshake建立连接后,客户端可以向服务器发消息,服务器也可以主动向客户端发消息
WebSocket搭建了双向的消息通道,服务端掌握了推送信息的主动权,而不必像http那样等待客户端请求后才被动响应。这是它最大的特点
注:什么是单工、半双工、全工通信?
数据只能单向传送为单工;
数据能双向传送但不能同时双向传送称为半双工;
数据能够同时双向传送则称为全双工。
HTTP 协议
HTTP 是单向的,客户端发送请求,服务器发送响应。举个例子,当用户向服务器发送请求时,该请求以HTTP或HTTPS的形式,服务器收到请求后将响应发送给客户端,每个请求都关联一个相应的响应,发送响应后连接关闭,每个 HTTP 或 HTTPS 请求每次都会建立到服务器的新连接,在收到响应后,连接会自行终止。
HTTP 是一种无状态协议,运行在 TCP 之上,TCP 是一种面向连接的协议,它使用三向握手方法保证数据包传输的传送,并重新传输丢失的数据包。
HTTP 可以运行在任何可靠的面向连接的协议之上,例如 TCP、SCTP。当客户端向服务器发送 HTTP 请求时,客户端和服务器之间会打开一个 TCP 连接,在收到响应后 TCP 连接将终止,每个 HTTP 请求都会打开一个到服务器的单独 TCP 连接,例如,如果客户端发送向服务器发出 10 个请求时,将打开 10 个单独的 TCP 连接。并在收到响应/后备后关闭。
HTTP报文信息以ASCII编码,每个HTTP请求报文由HTTP协议版本(HTTP/1.1、HTTP/2)、HTTP方法(GET/POST等)、HTTP头(内容类型、内容长度)、主机信息等组成. 以及包含正在传输到服务器的实际消息的正文。HTTP 标头的大小从 200 字节到 2 KB 不等,常见的 HTTP 标头大小为 700-800 字节。当 Web 应用程序在客户端使用更多 cookie 和其他工具来扩展代理的存储功能时,它会减少 HTTP 标头有效负载。
WebSocket
WebSocket 是双向的,是一种全双工协议,用于客户端-服务器通信的相同场景,与HTTP
不同,它以ws://
或wss://
开头。它是一个有状态的协议,这意味着客户端和服务器之间的连接将保持活动状态,直到被任何一方(客户端或服务器)终止。客户端和服务器任一方关闭连接后,两端的连接都会终止。
让我们以客户端-服务器通信为例,客户端是网络浏览器和服务器,每当我们启动客户端和服务器之间的连接时,客户端-服务器都会进行握手并决定创建一个新连接,并且此连接将保持活动状态,直到被其中任何一个终止。当连接建立并处于活动状态时,将使用相同的连接通道进行通信,直到连接终止为止。
这就是客户端-服务器握手后,客户端-服务器决定一个新连接以保持其活动状态的方式,这个新连接将被称为 WebSocket。一旦通信链路建立并打开连接,消息交换将以双向模式进行,直到客户端与服务器之间的连接持续存在。如果其中任何一个(客户端-服务器)死亡或决定关闭连接,双方都会关闭连接。socket的工作方式与HTTP的工作方式略有不同,状态码101表示WebSocket中的协议切换。
WebSocket和Http的关系和异同点
每个WebSocket连接都始于一个HTTP请求。 具体来说,WebSocket协议在第一次握手连接时,通过HTTP协议在传送WebSocket支持的版本号,协议的字版本号,原始地址,主机地址等等一些列字段给服务器端。
Upgrade首部,用来把当前的HTTP请求升级到WebSocket协议,这是HTTP协议本身的内容,是为了扩展支持其他的通讯协议。 如果服务器支持新的协议,则必须返回101.
一个WebSocket连接是在客户端与服务器之间HTTP协议的初始握手阶段将其升级到Web Socket协议来建立的,其底层仍是TCP/IP连接
HTTP 和 WebSocket 连接之间的相同点
(1)都是建立在TCP之上,通过TCP协议来传输数据。
(2)都是可靠性传输协议。
(3)都是应用层协议。
HTTP 和 WebSocket 连接之间的不同点
WebSocket 连接 | HTTP 连接 |
---|---|
WebSocket是一种双向通信协议,可以通过复用已建立的连接通道将数据从客户端发送到服务器或从服务器发送到客户端。连接将保持活动状态,直到被客户端或服务器终止。 | HTTP 协议是一个单向协议,工作在 TCP 协议之上,TCP 协议是面向连接的传输层协议,我们可以在收到 HTTP 连接关闭的响应后使用 HTTP 请求方法创建连接。 |
几乎所有实时应用程序(例如(交易、监控、通知)服务)都使用 WebSocket 在单个通信通道上接收数据。 | 简单的 RESTful 应用程序使用无状态的 HTTP 协议。 |
所有频繁更新的应用程序都使用 WebSocket,因为它比 HTTP 连接更快。 | 当我们不想在特定时间内保留连接或重用该连接来传输数据时;HTTP 连接比 WebSocket 慢。 |
什么时候可以使用WebSocket
-
实时Web应用程序: 实时Web应用程序使用WebSocket在客户端显示数据,这些数据由后端服务器不断发送。在 WebSocket 中,数据被连续推送/传输到已打开的同一连接中,这就是 WebSocket 速度更快并提高应用程序性能的原因。
例如在交易网站或比特币交易中,为了显示价格波动和变动,后端服务器通过使用WebSocket通道将数据不断推送到客户端。 -
游戏应用: 在游戏应用中,您可能会关注的是,服务器不断接收数据,并且无需刷新UI,它就会在屏幕上生效,UI会自动刷新,甚至不需要建立新的连接,所以它是在游戏应用程序中非常有帮助。
-
聊天应用程序: 聊天应用程序仅使用 WebSocket 建立一次连接,以便在订阅者之间交换、发布和广播消息。它重用相同的 WebSocket 连接来发送和接收消息以及一对一消息传输。
何时不使用 WebSocket
如果我们想要通过网络传输任何实时更新或连续的数据流,则可以使用 WebSocket。如果我们想获取旧数据,或者只想获取一次数据以使用应用程序处理它,我们应该使用HTTP 协议,不经常需要或只获取一次的旧数据可以通过简单的 HTTP 请求查询,所以在这种情况下,最好不要使用WebSocket。
注意: 如果我们只加载一次数据,RESTful Web 服务足以从服务器获取数据。
参考
What is web socket and how it is different from the HTTP? - GeeksforGeeks
全面理解WebSocket与Socket、TCP、HTTP的关系及区别_tcp和websocket区别_aiwokache的博客-CSDN博客