• 【计算机网络】什么是WebSocket?


    WebSocket

    WebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信,位于OSI模型应用层

    WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务器主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,并进行双向数据传输。

    在这里插入图片描述

    简介

    WebSocket是一种与HTTP不同的协议。两者都位于OSI模型的应用层,并且都依赖于传输层的TCP协议。虽然它们不同,但是RFC 6544中规定:WebSocket通过HTTP端口80和443进行工作,并支持HTTP代理和中介,从而使其与HTTP协议兼容。为了实现兼容性,WebSocket握手使用Upgrade头从HTTP协议更改为WebSocket协议

    WebSocket协议支持Web浏览器(或其他客户端服务器应用程序)与Web服务器之间的交互,具有较低的开销,便于实现客户端与服务器的实时数据传输。服务器可以通过标准化的方式来实现,而无需客户端首先请求内容,并允许消息在保持连接打开的同时来回传递。通过这种方式,可以在客户端与服务器之间进行双向持续对话。通信通过TCP端口80或443完成,这在防火墙阻止非Web网络连接的环境下是有益的。

    与HTTP不同,WebSocket提供全双工通信。此外,WebSocket还可以在TCP之上实现消息流。TCP单独处理字节流,没有固有的消息概念。 在WebSocket之前,使用Comet可以实现全双工通信。但是Comet存在TCP握手和HTTP头的开销,因此对于小消息来说效率很低。WebSocket协议旨在解决这些问题。

    协议

    WebSocket是独立的、建立在TCP上的协议。

    WebSocket通过HTTP/1.1协议的101状态码进行握手。

    为了建立Websocket连接,需要通过浏览器发出请求,之后服务器进行回应,这个过程通常称为“握手”(Handshaking)。

    eg:

    一个典型的WebSocket握手请求如下:

    客户端请求:

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    服务器回应:

    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
    Sec-WebSocket-Protocol: chat
    
    • 1
    • 2
    • 3
    • 4
    • 5

    字段说明

    • Connection必须设置Upgrade,表示客户端希望连接升级。
    • Upgrade字段必须设置WebSocket,表示希望升级到WebSocket协议。
    • Sec-WebSocket-Key是随机的字符串,服务器端会用这些数据来构造出一个SHA-1的信息摘要,之后进行Base64编码,将结果做为"Sec-WebSocket-Accept" 头的值,返回给客户端。如此操作,可以尽量避免普通HTTP请求被误认为Websocket协议。
    • Sec-WebSocket-Version 表示支持的Websocket版本。RFC6455要求使用的版本是13。
    • Origin字段是必须的。如果缺少origin字段,WebSocket服务器需要回复HTTP 403状态码。
    • 在WebSocket协议中,Sec-WebSocket-Protocol是一个HTTP请求头部字段,用于在握手期间指定客户端和服务器之间所使用的子协议(subprotocol)。子协议是WebSocket协议的扩展功能,允许客户端和服务器之间约定一种特定的通信协议或数据格式。通过使用子协议,WebSocket连接可以支持多个应用层协议,而不仅限于默认的WebSocket协议。
    • 其他一些定义在HTTP协议中的字段,如Cookie等,也可以在Websocket中使用。

    优点

    • 较少的控制开销。在连接建立后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。在不包含扩展的情况下,对于服务器到客户端的内容,此头部大小只有2至10字节(和数据包长度有关);对于客户端到服务器的内容,此头部还需要加上额外的4字节的掩码。相对于HTTP请求每次都要携带完整的头部,此项开销显著减少了。
    • 更强的实时性。由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少;即使是和Comet等类似的长轮询比较,其也能在短时间内更多次地传递数据。
    • 保持连接状态。与HTTP不同的是,Websocket需要先建立连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)。
    • 更好的二进制支持。Websocket定义了二进制帧,相对于HTTP,可以轻松地处理二进制内容。
    • 可以支持扩展。Websocket定义了扩展,用户可以扩展协议、实现部分自定义的子协议。如部分浏览器支持压缩等。
    • 更好的压缩效果。相对于HTTP压缩,Websocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率。

    使用场景

    1. 即时聊天(IM):WebSocket可以实现实时的消息传递,使得即时聊天应用能够实时地将消息推送给在线用户,实现实时的聊天体验。
    2. 实时数据监控和推送:WebSocket可以用于实时监控和推送数据,例如股票行情,实时交通信息、天气更行等。服务器可以将最新的数据实时推送给客户端,使用户能够实时获取并展示最新的数据。
    3. 多人协作应用:WebSocket可以用于多人协作应用程序,例如实时协作编辑器、白板应用等。多个用户可以在同一文档或画布上实时协作、彼此之间的更改和操作可以实时同步。
    4. 游戏应用:WebSocket提供了实时的双向通信,非常适合在线游戏应用。游戏服务器可以实时推送游戏状态、玩家动作等数据给客户端,实现多人实时游戏体验。

    后面会用Go语言实现一个完整的Websocket聊天系统,感兴趣的小伙伴可以关注一下博主哈

  • 相关阅读:
    Reids集群
    [C++]带动画鼠标指针的多屏采集和窗口采集,基于BitBlt和DXGI
    基于C#通过PLCSIM ADV仿真软件实现与西门子1500PLC的S7通信方法演示
    (二)Ubuntu系统Pytorch环境配置
    勒索软件频繁升级,了解常见勒索软件很有必要
    ArcGIS笔记5_生成栅格文件时保存报错怎么办
    深入探究boost之timer库(1)
    MFC Windows 程序设计[258]之枚举控件集合(附源码)
    【题解】NowCoder BC64 牛牛的快递
    设计一个Student类和它的一个派生类Undergraduate,要求如下:
  • 原文地址:https://blog.csdn.net/m0_53328239/article/details/132409129