1、什么是WebSocket
1.1 定义
Websocket是一个持久化的网络通信协议,可以在单个 TCP 连接上进行全双工通讯
,没有了Request
和Response
的概念,两者地位完全平等,连接一旦建立,客户端和服务端之间实时可以进行双向数据传输
1.2 关联和区别
-
HTTP
-
HTTP是非持久的协议,客户端想知道服务端的处理进度只能通过不停地使用
Ajax
进行轮询或者采用long poll
的方式来,但是前者对服务器压力大,后者则会因为一直等待Response造成阻塞 -
虽然http1.1默认开启了
keep-alive
长连接保持了这个TCP通道
使得在一个HTTP连接中,可以发送多个Request,接收多个Response,但是一个request只能有一个response。而且这个response也是被动的,不能主动发起。 -
websocket虽然是独立于HTTP的一种协议,但是websocket必须依赖 HTTP 协议进行一次
握手
(在握手阶段是一样的),握手成功后,数据就直接从 TCP通道传输,与 HTTP 无关了,可以用一张图理解两者有交集,但是并不是全部。
-
socket
-
socket也被称为
套接字
,与HTTP和WebSocket不一样,socket不是协议,它是在程序层面上对传输层协议(可以主要理解为TCP/IP)的接口封装。可以理解为一个能够提供端对端的通信的调用接口(API) -
对于程序员而言,其需要在 A 端创建一个 socket 实例,并为这个实例提供其所要连接的 B 端的 IP 地址和端口号,而在 B 端创建另一个 socket 实例,并且绑定本地端口号来进行监听。当 A 和 B 建立连接后,双方就建立了一个端对端的 TCP 连接,从而可以进行双向通信。WebSocekt借鉴了 socket 的思想,为 client 和 server 之间提供了类似的双向通信机制
1.3 应用场景
WebSocket可以做弹幕、消息订阅、多玩家游戏、协同编辑、股票基金实时报价、视频会议、在线教育、聊天室等应用实时监听服务端变化
2、Websocket握手
-
Websocket握手请求报文:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
下面是与传统 HTTP 报文不同的地方:
Upgrade: websocket
Connection: Upgrade
表示发起的是 WebSocket 协议
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
S