HTTP协议
HTTP是单向的,客户端发送请求,服务器发送响应。举个例子,当用户向服务器发送请求时,该请求采用HTTP或HTTPS的形式,在接收到请求后,服务器将响应发送给客户端,每个请求都与相应的响应相关联,在发送响应后,连接关闭,每次HTTP或HTTPS请求都会建立到服务器的新连接,并且在获得响应后,连接会自行终止。
HTTP是一种在TCP之上运行的无状态协议,TCP是一种面向连接的协议,它保证使用三方握手方法传递数据包,并重新传输丢失的数据包。
HTTP可以在任何可靠的面向连接的协议(如TCP、SCTP)之上运行。当客户端向服务器发送HTTP请求时,客户端和服务器之间的TCP连接是打开的,在得到响应后,TCP连接被终止,每个HTTP请求都会打开到服务器的单独TCP连接。例如,如果客户端向服务器发送10个请求,则10个单独的TCP连接将被打开,并在获得响应/回退后关闭。
以ASCII编码的HTTP消息信息,每个HTTP请求消息包括HTTP协议版本(HTTP/1.1、HTTP/2)、HTTP方法(GET/POST等)、HTTP标头(内容类型、内容长度)、主机信息等,以及包含正在传输到服务器的实际消息的主体。HTTP标头的大小从200字节到2KB不等,HTTP标头的常见大小为700-800字节。当Web应用程序在客户端使用更多的cookie和其他工具来扩展代理的存储功能时,它会减少HTTP标头负载。
图1 HTTP连接示意图
WebSocket
WebSocket是双向的,是一种全双工协议,用于相同的客户端-服务器通信场景,与HTTP不同,它从ws://或wss://开始。它是一个有状态的协议,这意味着客户端和服务器之间的连接将保持有效,直到任何一方(客户端或服务器)终止。客户端和服务器关闭连接后,连接将从两端终止。
让我们举一个客户端-服务器通信的例子,有一个客户端,它是一个Web浏览器和一个服务器,每当我们启动客户端和服务器之间的连接时,客户端-服务器都会进行握手,并决定创建一个新的连接,这个连接将保持有效,直到它们中的任何一个终止。当连接建立并处于活动状态时,使用相同的连接信道进行通信,直到通信终止。
这就是在客户端-服务器握手之后,客户端-服务器如何决定一个新的连接以保持其活动,这个新的连接将被称为WebSocket。一旦通信链路建立和连接打开,消息交换将以双向模式进行,直到客户端-服务器之间的连接持续存在。如果他们中的任何人(客户端服务器)宕机或决定关闭连接,双方都将关闭连接。套接字的工作方式与HTTP的工作方式略有不同,状态代码101表示WebSocket中的交换协议。
图2 WebSocket连接示意图
PART.01何时使用WebSocket
1、实时Web应用:实时Web应用程序使用Web套接字在客户端显示数据,这些数据由后端服务器不断发送。在WebSocket中,数据被不断地推送/传输到已经打开的同一连接中,这就是为什么WebSocket更快并提高了应用程序性能。例如,在交易网站或比特币交易中,为了显示价格波动和移动数据,后端服务器使用WebSocket通道不断向客户端推送。
2、游戏应用程序:在游戏应用程序中,可能会关注这一点,服务器不断接收数据,在不刷新UI的情况下,它将在屏幕上生效,UI甚至在不建立新连接的情况下自动刷新,因此它在游戏应用程序中非常有用。
3、聊天应用程序:聊天应用程序使用WebSocket只建立一次连接,以便在订阅者之间交换、发布和广播消息。它重用相同的WebSocket连接,用于发送和接收消息以及进行一对一的消息传输。
PART.02何时不使用WebSocket
如果我们想要通过网络传输任何实时更新或连续的数据流,可以使用WebSocket。
如果我们只想获取一次数据来用应用程序处理它,我们应该使用HTTP协议,只获取一次的数据可以通过简单的HTTP请求查询,所以在这种情况下,最好不要使用WebSocket。