外观
为什么 WebSocket 可以进行全双工模式的消息传输,而 Http 不可以
设计目的与模型不同
WebSocket
:设计目的就是为了在客户端和服务器之间建立一个不受限的双向通信通道,专门用于实现全双工通信,允许服务器和客户端在任意时刻互相发送消息。HTTP
:是基于请求 - 响应模型设计的协议,客户端必须先发送请求,服务器才能响应,服务器无法主动向客户端推送消息,这种单向通信模式不支持全双工通信。
连接特性不同
WebSocket
:在完成握手后,会建立一个持久性的连接,在这个连接上客户端和服务器可以随时进行数据的发送和接收,双方都能主动发起通信。HTTP
:虽然HTTP/1.1
引入了持久连接(Keep-Alive
),但本质上每个请求和响应仍是独立的,连接主要用于减少连接建立和关闭的开销,并非为了实现全双工通信,服务器在响应完客户端请求后,一般不会再利用该连接主动发送数据。
数据帧结构和传输机制不同
WebSocket
:有专门定义的数据帧结构,用于在同一个连接上区分不同方向的消息,客户端和服务器可以按照协议规定的格式,在连接上交替发送和接收数据帧,实现全双工通信。HTTP
:没有这样专门的全双工数据帧结构和传输机制,请求和响应有各自固定的格式,且严格遵循先请求后响应的模式,难以实现双向同时通信。
握手和协议升级过程不同
WebSocket
:通过HTTP
请求进行握手,在握手请求中通过特定的头信息(如Upgrade
头)告知服务器要升级到WebSocket
协议,服务器如果支持,就会返回101
状态码表示协议切换成功,之后就可以在全双工模式下进行通信。HTTP
:不存在这样的协议升级到全双工通信的过程,其握手主要是为了建立连接和进行一些基本的身份验证、协商等操作,之后的通信仍遵循请求 - 响应模式。