💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
**WebSocket** 协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。 ## 产生背景 在没有WebSocket协议之前,在网页中,实现一个聊天室只能使用 ajax 不断轮询,请求服务器是否有数据产生,而这样的实现方法会出现一系列的问题: * 如果轮询时间间隔太短,会导致客户端和服务端在一个时间段内不断的进行http tcp的握手/挥手动作和http 请求头,响应头的传输,大量消耗服务器资源,如果用户量大的情况,会造成服务器的繁忙以至于宕机 * 客户端每次只能通过发送http 请求获得服务器是否有数据返回,且数据的及时性无法保证 WebSocket 只需要一次 http 握手,就可以保持一个长连接,使得服务器可以主动发送消息给客户端,大大减少了轮询机制的消耗。 ## 实现原理 在实现websocket连线过程中,需要通过浏览器发出websocket连线请求,然后服务器发出回应,这个过程通常称为“握手” 。在 WebSocket API,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。 在此WebSocket 协议中,为我们实现即时服务带来了两大好处: * Header: 互相沟通的Header是很小的-大概只有 2 Bytes * Server Push: 服务器的推送,服务器不再被动的接收到浏览器的请求之后才返回数据,而是在有新数据时就主动推送给浏览器。 ## 握手协议 客户端请求: ~~~ GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://example.com Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 ~~~ 服务器回应: ~~~ HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chat ~~~ ### 字段说明 * `Connection`必须设置**Upgrade**,表示客户端希望连接升级。 * `Upgrade`字段必须设置**Websocket**,表示希望升级到 Websocket协议。 * `Sec-WebSocket-Key`是随机的字符串,服务器端会用这些数据来构造出一个SHA-1的信息摘要。把“Sec-WebSocket-Key”加上一个特殊字符串“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,然后计算SHA-1摘要,之后进行Base64编码,将结果做为“Sec-WebSocket-Accept”头的值,返回给客户端。如此操作,可以尽量避免普通HTTP请求被误认为Websocket协议。 * `Sec-WebSocket-Version` 表示支持的Websocket版本。RFC6455要求使用的版本是13,之前草案的版本均应当弃用。 * `Origin`字段是必须的。如果缺少`origin`字段,WebSocket服务器需要回复HTTP 403 状态码(禁止访问) * 其他一些定义在HTTP协议中的字段,如Cookie等,也可以在Websocket中使用。 ## 优点 * 较小的控制开销 * 更强的实时性 * 保持连接状态 * 更好的二进制支持 * 支持扩展 * 更好的压缩效果