说说WebSocket

114 阅读2分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

今天我们来聊聊WebSocket

WebSocket是 HTML5 中的协议,支持持久连续,http 协议不支持持久性连接。Http1.0HTTP1.1都不支持持久性的链接,HTTP1.1中的 keep-alive,将多个 http 请求合并为1

HTTP的生命周期通过 Request来界定,也就是 Request 一个 Response,那么在Http1.0协议中,这次 Http请求就结束了。在 Http1.1中进行了改进,是的有一个connection:Keep-alive,也就是说,在一个 Http 连接中,可以发送多个 Request,接收多个 Response。但是必须记住,在Http 中一个 Request只能对应有一个 Response,而且这个Response是被动的,不能主动发起。

WebSocket是基于 Http协议的,或者说借用了Http 协议来完成一部分握手,在握手阶段与Http 是相同的。我们来看一个 websocket 握手协议的实现,基本是2个属性,upgradeconnection
基本请求如下:

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

多了下面2个属性:

Upgrade:webSocket
Connection:Upgrade

告诉服务器发送的是websocket

Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

总结,你可以把 WebSocket 看成是 HTTP 协议为了支持长连接所打的一个大补丁,它和 HTTP 有一些共性,是为了解决 HTTP 本身无法解决的某些问题而做出的一个改良设计。在以前 HTTP 协议中所谓的 keep-alive connection 是指在一次 TCP 连接中完成多个 HTTP 请求,但是对每个请求仍然要单独发 header;所谓的 polling 是指从客户端(一般就是浏览器)不断主动的向服务器发 HTTP 请求查询是否有新数据。这两种模式有一个共同的缺点,就是除了真正的数据部分外,服务器和客户端还要大量交换 HTTP header,信息交换效率很低。它们建立的“长连接”都是伪.长连接,只不过好处是不需要对现有的 HTTP server 和浏览器架构做修改就能实现