WebSocket详解

2023-11-17

WebSocket

 

WebSocket是一种协议,它允许在客户端和服务器之间建立持久连接,实现双向实时通信(传统的http请求是客户端向服务器发起请求,服务器响应请求,而WebSocket解决服务器无法给客户端发送信息的问题)。与HTTP协议不同,WebSocket协议不需要在每次通信时重新建立连接,从而避免了HTTP协议的繁琐和性能问题。

WebSocket协议是HTML5规范的一部分,它建立在TCP协议之上,使用HTTP协议进行握手。WebSocket协议通过在HTTP/HTTPS的端口上监听客户端请求,当客户端发起WebSocket请求时,服务器返回响应,随后客户端和服务器之间就可以建立持久连接,双向通信,传输的数据格式可以是文本或二进制格式

WebSocket协议使用的是TCP协议作为底层传输协议,因此可以保证数据的可靠性和有序性。同时,WebSocket协议还支持心跳机制(heartbeat),用于保持连接的稳定性。当连接空闲一段时间时,双方可以互相发送心跳消息来维持连接,避免连接中断

WebSocket协议具有低延迟、高并发、双向实时通信等特点

常用于实时通信、在线游戏、数据可视化等场景,它已经被广泛应用于互联网的各个领域。

WebSocket协议在浏览器中使用比较简单,通常可以通过JavaScript的WebSocket API来创建WebSocket连接,并进行消息的发送和接收。在服务器端,也需要使用特定的WebSocket服务器来支持WebSocket协议。常用的WebSocket服务器有Node.js的ws模块、Java的Tomcat、Jetty等。

WebSocket协议的工作流程:

在WebSocket协议中,通信双方首先要建立握手(handshake)连接,以确认彼此是否支持WebSocket协议和版本,然后在握手成功后,双方可以互相发送消息,每个消息都由一些元数据(如数据类型、数据长度等)和实际的数据组成。具体步骤如下:

  1. 客户端向服务器发起WebSocket连接请求,请求报文采用HTTP协议,通过Upgrade头部字段表明请求协议为WebSocket。
  2. 服务器收到客户端的连接请求后,响应一个101状态码的响应报文,表示同意建立WebSocket连接。
  3. 建立WebSocket连接后,客户端和服务器就可以互相发送消息,消息采用帧的形式进行封装,每个帧包含一个帧头和帧载荷两个部分,帧头包含了控制帧和数据帧的一些信息,帧载荷就是具体的消息内容。
  4. 客户端和服务器发送的消息可以是文本、二进制数据等格式,发送的消息由于采用了帧的方式进行封装,所以可以保证数据的可靠性和完整性,而且可以实现高效的数据传输。
  5. 当客户端或服务器想要关闭WebSocket连接时,可以发送一个特殊的关闭帧来关闭连接。

        

#相关知识点

一.Ajax轮询是什么?

Ajax轮询是一种实现实时数据更新的技术,它通过定时向服务器发送Ajax请求,以获取最新数据。在轮询中,客户端会以一定的时间间隔重复向服务器发送请求,服务器在接收到请求后,如果没有新数据需要返回,就会返回一个空响应,客户端在收到空响应后会在指定的时间间隔后再次发送请求。

由于轮询是通过定时发送请求的方式来获取最新数据的,因此它的实时性比较低,且频繁的请求会给服务器带来一定的负担,同时也会占用客户端的带宽和资源。因此,现在更常用的实时数据更新技术是WebSocket。

二.TCP协议

TCP(Transmission Control Protocol)协议是一种面向连接、可靠的、基于字节流的传输层协议。它通过三次握手建立连接,提供可靠的数据传输、流量控制、拥塞控制等机制,能够保证数据的可靠性和顺序性。TCP协议被广泛用于互联网上的数据通信,如网页浏览、文件传输、电子邮件等应用中。

TCP协议中的三次握手

TCP协议的三次握手是指在建立TCP连接时,客户端和服务器之间需要发送三个TCP数据包来确认连接的建立。这个过程如下:

  1. 第一次握手:客户端发送一个SYN(同步)数据包到服务器,请求建立连接。
  2. 第二次握手:服务器接收到客户端的SYN数据包之后,发送一个SYN-ACK(同步-确认)数据包,告诉客户端可以建立连接。
  3. 第三次握手:客户端接收到服务器的SYN-ACK数据包之后,发送一个ACK(确认)数据包,告诉服务器连接已经建立成功。

至此,TCP连接建立完成,客户端和服务器之间可以开始传输数据。

:

在 TCP 三次握手中,SYN(同步)数据包是由客户端发起的,用于初始化连接的请求。SYN 数据包中包含以下数据:

  1. 序列号(Sequence Number):表示本次 TCP 报文段的第一个数据字节在数据流中的序列号。
  2. TCP 标识位(TCP Flags):在 TCP 数据包中,用于标识 TCP 报文的类型,SYN 数据包中 SYN 标识位为 1,其余标识位为 0。
  3. 通信窗口大小(Window Size):指明了发送端能够接收的字节数量。
  4. MSS(Maximum Segment Size):指明 TCP 连接端所能接收的最大数据段长度。

SYN-ACK(同步-确认)数据包里有以下数据:

  1. 序列号(Sequence Number):是随机数,用于标识发送方发送的数据的顺序。
  2. 确认号(Acknowledgment Number):是上一次接收到的数据包的序列号+1,表示接收方期望接收的下一个数据的序列号。
  3. 控制位(Control Bits):表示数据包的类型和控制信息。SYN-ACK 数据包的控制位为 SYN 和 ACK。SYN 表示同步请求,ACK 表示确认应答。
  4. 窗口大小(Window Size):是发送方告诉接收方本地接收缓存区大小的值。接收方根据这个值来确定可以接收多少数据。
  5. 校验和(Checksum):用于检查数据是否损坏或被篡改。
  6. 紧急指针(Urgent Pointer):如果控制位中有 URG 标志,就使用紧急指针。它表示紧急数据的位置,也就是告诉接收方哪些数据是需要优先处理的。
  7. 选项(Options):用于在数据包中添加一些额外的信息。常用的选项包括时间戳、最大段大小等。

ACK(确认)数据包,主要包含以下数据:

  1. 序列号(Sequence Number):表示数据包中包含数据的第一个字节的序号,用于通知接收方下一个期望接收的字节是哪一个。
  2. 确认号(Acknowledgment Number):表示发送方期望接收的下一个字节的序号。ACK数据包的确认号字段是SYN-ACK数据包中的序列号加1,表示接收到SYN-ACK后发送方期望接收的下一个字节序号。
  3. TCP标识位(TCP Flags):ACK数据包中的标识位为1,表示确认数据包。
  4. 标头长度(Header Length):TCP标头长度,用于表示TCP标头中包含多少个32位字。
  5. 窗口大小(Window Size):表示接收方可以接收的数据量大小,用于流量控制和拥塞控制。
  6. 校验和(Checksum):用于校验数据包的完整性和正确性。
  7. 紧急指针(Urgent Pointer):表示紧急数据的末尾字节在数据包中的位置,仅当URG标识位被设置时才有意义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebSocket详解 的相关文章

随机推荐

  • rename()函数

    rename 函数 可以直接通过columns 去传入对应列的名字 去改变列名 这种效率比rename的效率要高的多 score columns python java ps js rename 函数的参数 mapper None axis
  • 对上拉下拉电阻的作用的总结

    一 定义 上拉就是将不确定的信号通过一个电阻嵌位在高电平 电阻同时起限流作用 下拉同理 上拉是对器件注入电流 下拉是输出电流 弱强只是上拉电阻的阻值不同 没有什么严格区分 对于非集电极 或漏极 开路输出型电路 如普通门电路 提升电流和电压的
  • 掌握shell编程中的细节:轻松应对可能出现的考点(括号篇)

    前言 只要是shell脚本基本都会用这几个符号 重点是你会不会口语描述其功能 下面是对shell里各种括号的实际的演示和功能的描述 小括号or单小括号 功能 命令的集合 括号内的命令会在一个子shell中按顺序执行 括号内的写的变量不会被括
  • docker镜像详解

    目录 什么是docker镜像 镜像相关命令 docker pull docker images docker search docker rmi 导出 导入镜像 镜像分层 镜像摘要 镜像摘要的作用 分发散列值 什么是docker镜像 Doc
  • 帆软填报界面首页黑色

    解决方法 左上角 gt 模板 gt 模板web属性 gt 填报的话 选填报界面 gt 为该模板单独设置 gt 左上角 填报当前行背景颜色 gt 改成 白色 或其他
  • 统计字符串中每个单词出现的个数和频率----四种方法

    统计每个单词出现的个数 三种方法 第一种如下 最简单的方式 sentance I can because i think i can 切片分隔成列表序列 用列表推导式表达 rresult word sentance split count
  • 认识数据中心两个关键指标RTO和RPO

    RTO和RPO是Business Continuity BC and Disaster Recovery DR 里面两个重要的概念 也是类似产品的Service Level Agreement SLA 的两个重要的衡量指标 Recovery
  • 观察者模式和事件通知备忘

    观察者模式和事件通知备忘 MessageBus instance post Notify PARKIN in bytes 这种是仿照Android的EventBus 用new的一个实例对象根据path反射调用其中的方法处理逻辑 要修改为 r
  • 【JVM】如何通俗地讲解JVM各个组成部分和其基本功能?

    类加载器 ClassLoader 运行时数据区 Runtime Data Area 执行引擎 Execution Engine 本地库接口 Native Interface 组件的作用 首先通过类加载器 ClassLoader 会把 Jav
  • (服务计算)在centos上编写golang的库,并进行测试

    首先是在centos上按照老师给的教程安装golang的相关内容 安装成功后进行后面的操作 首先是创建了一个hello go的文件 然后执行结果如下 可知安装基本正确 然后编写第一个库 首先创建包路径 然后创建名为reverse go的文件
  • 图形学基础1

    坐标系相关 uv可能会影响局部坐标系 如果light图和brdf图做卷积的时候 局部坐标系保持一致很重要 如下图 tangent是从外部模型文件进行加载的 切线空间采样并转世界坐标系 spherical to cartesian in ta
  • unity配置.asset文件

    unity配置数据可以XML 可以JSON unity自带的 asset文件也可以哦 而且能配置的数据类型也比较多 这里说明一下怎么在unity中生成 asset文件 首先来个脚本 using System using System Col
  • 【华为OD机试真题 python】报文解压缩

    题目描述 为了提升数据传输的效率 会对传输的报文进行压缩处理 输入一个压缩后的报文 请返回它解压后的原始报文 压缩规则 n str 表示方括号内部的 str 正好重复 n 次 注意 n 为正整数 0 lt n lt 100 str只包含小写
  • Dockerfile 中 CMD 为什么要避免使用 sh -c

    CSDN 中文章不一定能及时更新 欢迎点击前往我的博客查看最新版本 许盛的博客 Dockerfile 中的 CMD 命令 有 exec form 和 shell form 两种形式 具体区别可以参考 Dockerfile 中 CMD 写法的
  • CDN加速与DDOS防御

    一 目的 实现国外节点的访问加速 分区域分线路加速 防御来自竞争对手的DDos恶意攻击 常见的延缓性CC攻击和致命的大流量攻击 针对以上的加速策略和两种攻击方式进行一些防御方案的简单介绍 二 CDN加速 利用第三方的DNS智能解析分区域分线
  • Git学习之LFS

    什么是Git LFS git是程序员开发程序不可或缺的工具 有效的使用git能够极大的加快程序人员的开发效率 在开发比较轻量化的代码时 开发的速度不会受到git上传下载速度的影响 但是随着系统的复杂度增加 代码中关联到的文件越来越多 其中二
  • BGP实验(路由反射器,联邦,路由优化)

    目录 1 IP地址的规划 2 拓扑结构的搭建 3 IP地址的配置 4 静态路由的配置 5 动态路由的配置 6 EBGP的配置 7 IBGP的配置 8 路由反射器的配置 宣告 9 重发布和路由优化 10 测试 实验要求 实验步骤 1 IP地址
  • Ubuntu中调整终端terminal显示的缓冲区大小

    step1 step2 step3
  • hadoop单机版部署

    1 下载hadoop wget no check certificate https mirrors bfsu edu cn apache hadoop common hadoop 3 3 1 hadoop 3 3 1 tar gz 2 解
  • WebSocket详解

    WebSocket WebSocket是一种协议 它允许在客户端和服务器之间建立持久连接 实现双向实时通信 传统的http请求是客户端向服务器发起请求 服务器响应请求 而WebSocket解决服务器无法给客户端发送信息的问题 与HTTP协议