WebSocket和HTTP都是被用作Client-Server通信的通信协议。
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字节到2kb不等,一般HTTP报头的大小为700-800字节。当web应用程序在客户端使用更多的cookie和其他工具来扩展代理的存储特性时,它减少了HTTP头负载。
WebSocket
WebSocket是双向的,是一种全双工协议,在客户端-服务器通信的相同场景中使用,与HTTP不同,它从ws://或wss://开始。它是一个有状态的协议,这意味着客户端和服务器之间的连接将保持活跃,直到它被任何一方(客户端或服务器)终止。在客户端和服务器关闭连接后,连接从两端都终止。
举个例子,有一个web浏览器的客户端和服务器,每当我们启动客户端和服务器之间的连接,客户机-服务器握手,创建一个新的连接,这个连接将保持连接状态,直到被任何一方终止。当连接建立并激活时,通信使用相同的连接通道进行通信,直到连接被终止。
这就是客户端-服务器握手后,客户端-服务器如何决定一个新连接以保持它的活动,这个新连接将被称为WebSocket。一旦建立通信链路并打开连接,消息交换将以双向模式进行,只要客户机-服务器之间的连接持续。如果其中任何一方(客户机-服务器)死亡或决定关闭连接,则双方都将关闭连接。socket的工作方式与HTTP的工作方式略有不同,状态码101表示WebSocket中的切换协议。
WebSocket用处
实时web应用: 实时web应用使用web socket在客户端显示数据,这些数据是由后端服务器不断发送的。在WebSocket中,数据被不断地推送/传输到同一个已经打开的连接中,这就是为什么web socket更快并提高了应用程序的性能。
例如,在交易网站或比特币交易中,为了实时显示价格波动和移动数据,后端服务器通过使用web socket通道不断推到客户端。
游戏应用: 在游戏中,服务器不断接收数据,而不刷新UI。它将在屏幕上生效,UI会自动刷新,甚至不需要建立新的连接,所以这在游戏应用程序中非常有用。
聊天应用程序: 聊天应用程序使用WebSocket只建立一次连接,用于在用户之间交换、发布和广播消息。它使用同一个WebSocket连接,用于发送和接收消息以及一对一的消息传输。
WebSocket不适合的场景
如果我们想要通过网络传输实时更新或连续的数据流,可以使用WebSocket。如果我们想取回旧数据,或只想要程序处理一次数据,我们应该用HTTP协议。旧数据不需要经常被查询,或通过一次简单的HTTP请求就获取到,这种情况下最好不要用WebSocket。
总结
WebDocket Connection | HTTP Connection |
---|---|
WebSocket是一个双向通信协议,它可以通过重用建立的连接通道将数据从客户机发送到服务器,或者从服务器发送到客户机。连接将一直保持活动状态,直到客户端或服务器终止连接。 | HTTP协议是工作在TCP协议之上的单向协议,TCP协议是一种面向连接的传输层协议,我们可以在得到响应HTTP连接被关闭后,再次通过HTTP请求方法来创建连接。 |
几乎所有的实时应用程序(如交易、监控、通知)服务都使用WebSocket在单个通信通道上接收数据。 | 简单的RESTful应用程序使用HTTP协议,它是无状态的。 |
所有频繁更新的应用程序都使用WebSocket,因为它比HTTP连接更快。 | 当我们不想在特定的时间内保留一个连接或重用单个连接来传输数据时,HTTP连接比WebSocket要慢。 |