(1)使用TCP协议建立连接
(2)每次请求都是独立的,即使是同一用户的连续请求,也会重复建立和断开连接(除非使用了HTTP/2或持久连接)
(3)无状态协议。不保存状态信息,每次请求都需要全部信息(包括cookie等)来确定用户状态
(1)初次连接时通过HTTP进行握手(HTTP 101状态码),之后升级为WebSocket协议
(2)一旦建立连接,除非主动关闭,否则将保持连接状态
(3)有状态连接,保持持久连接,支持状态信息的持久化传输,不需每次都传递全部信息
(1)请求-响应模型。客户端发起请求,服务器响应请求
(2)信息传输包含较多的头部数据(HTTP headers),每次请求都可能包含重复的头信息
(3)适用于短连接,传输完毕即断开
(1)双向通信。一旦连接建立,客户端和服务器可以相互发送消息,不需要等待对方发起请求
(2)由于连接的长期保持,数据传输只需少量的头部信息(WebSocket帧头部),传输更加高效
(3)适用于长连接,特别是需要频繁交互的应用,如实时聊天、游戏等
(1)由于每次请求都需要建立和关闭连接,性能开销较大
(2)适合低频率、一次性的数据请求,不适合频繁交互
(1)保持连接状态,可以高效地进行频繁的数据传输
(2)性能高,延迟小,非常适用于实时性要求高的应用
GET /api/v1/resource HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/58.0.3029.110 Safari/537.3
Accept: application/json
Cookie: sessionId=abc123
<服务器响应>
HTTP/1.1 200 OK
Content-Type: application/json
Set-Cookie: sessionId=abc123; Path=/
{
"data": "example"
}
// 握手请求
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Version: 13
<服务器响应>
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
<数据传输>
客户端发送帧:
0x81 0x05 0x48 0x65 0x6C 0x6C 0x6F (代表 "Hello")
服务器回应帧:
0x81 0x06 0x57 0x6F 0x72 0x6C 0x64 0x21 (代表 "World!")
(1)通常使用短连接,每次请求都会建立一次连接,处理完后立即关闭
(2)可以通过HTTP/1.1的持久连接(Keep-Alive)机制实现长连接,但仍不适合频繁通信
(1)本质上是长连接,一旦连接建立,将持续到一方关闭连接
(2)非常适合需要持续通信的应用场景,如实时消息推送、在线协作等
(1)静态资源加载,如HTML、CSS、JavaScript文件
(2)API请求和响应,如RESTful API调用
(3)适用于对实时性要求不高,且频次不高的通信
(1)实时通讯,如在线聊天、在线游戏
(2)实时数据推送,如股票行情、体育比赛直播
(3)在线协作工具,如Google Docs实时编辑、多人白板等