WebSocket协议详解

一、WebSocket协议

WebSocket可以实现客户端与服务器间双向、基于消息的文本或二进制数据传输。它是浏览器中最靠近套接字的API,但WebSocket连接远远不是一个网络套接字,因为浏览器在这个简单的API之后隐藏了所有的复杂性,而且还提供了更多服务:

  • 连接协商和同源策略
  • 与既有HTTP基础设施的互操作
  • 基于消息的通信和高效消息分帧
  • 子协议协商及可扩展能力

WebSocket是浏览器中最通用最灵活的一个传输机制,其极简的API可以让我们在客户端和服务器之间以数据流的形式实现各种应用数据交换(包括JSON及自定义的二进制消息格式),而且两端都可以向另一端发送数据。

WebSocket的优点:

  • 较少的控制开销,连接建立后,客户端和服务器之间交换数据时,用于协议控制的数据包头部相对较小,相对于HTTP每次请求都要携带完整的头部,此项开销显著减少了
  • 更强的实时性,由于协议是全双工的,服务器可以随时主动给客户端下发数据。相对于HTTP请求需要客户端发送请求服务端才能响应,延迟明显减少
  • 长连接保持连接状态,与HTTP不同的是,WebSocket需要先创建连接,这使得它成为一种有状态的协议,之后通信就可以忽略状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)
  • 双向通信、更好的二进制支持。与HTTP协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用HTTP协议,因此握手时不容易被屏蔽,能通过各种HTTP代理服务器

WebSocket通信协议(RFC 6455)包含两个高级组件:

  • 开放性HTTP握手用于协商连接参数

  • 二进制消息分帧用于支持低开销的基于消息的文本和二进制数据传输
    WebSocket协议尝试在既有HTTP基础设施中实现双向HTTP通信,因此也使用HTTP的80和443端口……不过,这个设计不局限于通过HTTP实现WebSocket通信,未来的实现可以在某个专用端口上使用更简单的握手,而不必重新定义这么一个协议

    目前用的最多的还是依赖HTTP进行握手,因为HTTP的基础设施已经相对完善。

二、WebSocket握手

标准的握手流程

看一个具体的WebSocket握手的例子,以www.zhihu.com为例,打开这个首页,网页一渲染就会开启一个wss的握手请求,握手请求如下

请求报文
//请求的方法必须是GET,HTTP版本必须至少是1.1
GET wss://mqtt-web.zhihu.com/mqtt?client_info=OS%3DWeb&user_group=zhihu_web HTTP/1.1

Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,und;q=0.8
Cache-Control: no-cache
Connection: Upgrade
Host: mqtt-web.zhihu.com
Origin: https://www.zhihu.com
Pragma: no-cache
    
//可选的客户端支持的协议扩展列表,指示了客户端希望使用的协议级别的扩展
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
    
//自动生成的key,已验证服务器对协议的支持,其值必须是
Sec-WebSocket-Key: RfbP3GpmZpMiUaAfex5JRQ==
    
//可选的应用指定的子协议列表(可以是多个,用“,”分割)
Sec-WebSocket-Protocol: mqtt
    
//客户端使用的websocket协议版本

你可能感兴趣的:(计算机网络,网络,前端,websocket)