美文网首页
WebSocket解析

WebSocket解析

作者: 刺客的幻影 | 来源:发表于2018-08-09 16:25 被阅读0次
    image.png

    1. WebSocket是什么?

    WebSocket是一种在单个TCP连接上进行全双工通讯的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。
    WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

    简单的说,WebSocket和HTTP一样也是基于TCP/IP的应用层协议,与HTTP最大的区别是其为双向的,可以由服务端向客户端主动推送消息

    2. 为什么会有WebSocket协议?

    因为HTTP虽然可以通过keep-alive和服务端保持长连接,但是只能通过客户端单向地向服务端发起请求,如果想实时获取服务端最新数据,一般都会轮询。可是轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开,而HTTP请求的头部数据是很多的)。而使用websocket就不会存在这样的问题。

    3. 与HTTP的区别

    传统HTTP与服务端的交互模式如下:

    image.png
    WebSocket与服务端的交互模式如下:
    image.png

    上图对比可以看出,相对于传统HTTP每次请求-应答都需要客户端与服务端建立连接的模式,WebSocket是类似Socket的TCP长连接通讯模式。一旦WebSocket连接建立后,后续数据都以帧序列的形式传输。在客户端断开WebSocket连接或Server端中断连接前,不需要客户端和服务端重新发起连接请求。在海量并发及客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实时性优势明显。

    相比HTTP,WebSocket有以下优点:

    • 是真正的全双工方式,建立连接后客户端与服务器端是完全平等的,可以互相主动请求。而HTTP长连接基于HTTP,是传统的客户端对服务器发起请求的模式。

    • HTTP长连接中,每次数据交换除了真正的数据部分外,服务器和客户端还要大量交换HTTP header,信息交换效率很低。Websocket协议通过第一个request建立了TCP连接之后,之后交换的数据都不需要发送 HTTP header就能交换数据,这显然和原有的HTTP协议有区别所以它需要对服务器和客户端都进行升级才能实现(主流浏览器都已支持HTML5)。此外还有 multiplexing、不同的URL可以复用同一个WebSocket连接等功能。这些都是HTTP长连接不能做到的。

    4. WebSocket握手报文分析

    • 握手 请求
      为了实现WebSocket通信,需要用到HTTP的Upgrade的首部字段,告知服务器通信协议发生改变,以达到握手的目的。
    GET /chat  HTTP/1.1
    Host: localhost
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
    Origin: http://localhost:8080
    Sec-WebSocket-Version: 13
    

    Sec-WebSocket-Key字段内记录这握手过程中必不可少的键值。Sec-WebSocket-Protocol字段内记录使用的子协议。子协议按WebSocket协议标准在连接分开使用时,定义那些连接的名称 。

    • 握手 响应
      对于之前的请求,返回状态码101 Switching Protocols的响应。
    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=
    

    Sec-WebSocket-Accept的字段值是由握手请求中的Sec-WebSocket-Key的字段值生成的。成功握手确立WebSocket连接之后,通信时不再使用HTTP的数据帧,而采用WebSocket独立的数据帧。

    参考文档:
    https://cloud.tencent.com/document/product/214/4150
    http://www.ruanyifeng.com/blog/2017/05/websocket.html

    相关文章

      网友评论

          本文标题:WebSocket解析

          本文链接:https://www.haomeiwen.com/subject/lphcbftx.html