WebSocket三问—腾讯三问
WebSocket作为应用层的全双工通信协议,也是物联网情境下经常用到的协议,今天就来了解下WebSocket。
- 谈谈对WebSocket的理解,含义通信流程等。
- WebSocket和socket有关系吗?有什么区别呢?和HTTP有什么区别呢?
- WebSocket的数据帧格式可以简单说说吗?
谈谈对WebSocket的理解,含义通信流程等。
为了解决和服务器长时间通信的痛点,HTML5规范引出了WebSocket
协议,是一种建立在TCP
协议基础上的全双工通信的协议。他跟Http同属于应用层协议,下层还是需要通过TCP建立连接。但是,WebSocket
在TCP连接建立后,还要通过Http进行一次握手,也就是通过Http发送一条GET请求消息给服务器,告诉服务器我要建立WebSocket
连接了,你准备好哦,具体做法就是在头部信息中添加相关参数。然后服务器响应我知道了,并且将连接协议改成WebSocket,开始建立长连接。也就是单次握手建立了一条TCP
的通信通道进行数据传送。
通信流程总结:
- 浏览器、服务器建立
TCP连接
,三次握手。这是通信的基础,传输控制层,若失败后续都不执行。 -
TCP连接
成功后,浏览器通过HTTP协议向服务器传送WebSocket
支持的版本号等信息。(开始前的HTTP握手) - 服务器收到客户端的握手请求后,同样采用
HTTP协议
回馈数据。 - 当收到了连接成功的消息后,通过TCP通道进行传输通信。
WebSocket和socket有关系吗?有什么区别呢?和HTTP有什么区别呢?
1)首先,Socket
其实并不是一个协议,而是为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口。但是Websocket
是一个应用层协议,也就是在Websocket通信的过程中会用到socket接口,也就这个关系了。
2)WebSocket和HTTP
相同点:
- 都是基于TCP的可靠性传输协议
- 都是应用层协议
不同点:
-
WebSocket
是全双工协议,也就是可以双向发送接收信息,而HTTP
是单向的 -
WebSocket
是需要另外的单词握手进行连接,主要用于告诉服务器要建立WebSocket连接,修改成WebSocket连接协议。
WebSocket的数据帧格式可以简单说说吗?
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+-+-+-+-+-------+ +-+-------------+ +-----------------------------+
|F|R|R|R| OP | |M| LENGTH | Extended payload length
|I|S|S|S| CODE | |A| | (if LENGTH=126)
|N|V|V|V| | |S| |
| |1|2|3| | |K| |
+-+-+-+-+-------+ +-+-------------+
| Extended payload length(if LENGTH=127)
+ +-------------------------------
| Extended payload length | Masking-key,if Mask set to 1
+----------------------------------+-------------------------------
| Masking-key | Data
+----------------------------------+-------------------------------
| Data
+----------------------------------+-------------------------------
首先每一行代表4个字节,一共也就是32位数。要注意的就是前两个字节:
第1个字节:
- 第一位是
FIN码
,其实就是一个标示位,因为数据可能多帧操作嘛,所以多帧情况下,只有最后一帧的FIN设置成1,标示结束帧,前面所有帧设置为0。 - 第二位到第四位是
RSV码
,一般通信两端没有设置自定义协议,就默认为0。 - 后四位是
opcode
,我们叫它操作码。这个就是判断这个数据帧的类型了,一般有以下几个被定义好的类型:
1) 0x0 表示附加数据帧 2) 0x1 表示文本数据帧 3) 0x2 表示二进制数据帧 4) 0x3-7 保留用于未来的非控制帧 5) 0x8 表示连接关闭 6) 0x9 表示ping 7) 0xA 表示pong 8) 0xB-F 保留用于未来的非控制帧
是不是发现了些什么,这不就对应了我们应用中的几种格式吗?2和3对应的是普通消息帧,包括了文本和二进制数据。567对应的就是控制帧格式,包括了close,ping,pong
。
第2个字节:
- 第一位是Mask掩码,其实就是标识数据是否加密混淆,1代表数据经过掩码的,0是没有经过掩码的,如果是1的话,后续就会有4个字节代表掩码key,也就是数据帧中Masking-key所处的位置。
- 后7位是LENGTH,用来标示数据长度。因为只有7位,所以最大只能储存1111111对应的十进制数127长度的数据,如果需要更大的数据,这个储存长度肯定就不够了。所以规定来了,1) 小于126长度则数据用这七位表示实际长度。2) 如果长度设置为126,也就是二进制1111110,就代表取额外2个字节表示数据长度,共是16位表示数据长度。3) 如果长度设置为127,也就是二进制1111111,就代表取额外8个字节,共是64位表示数据长度。
这里用一张图总结了数据帧各个字节的含义
这个问题一般不用答这么细,就简单说说每个字节代表什么意思就行,比如opcode代表操作码,当然前提是你简历中提到WebSocket才会问到这些。
- 用Python实现PCA和MDA降维和聚类
- 通过shell解析dump生成parfile(r2笔记76天)
- Web Spider实战1——简单的爬虫实战(爬取"豆瓣读书评分9分以上榜单")
- 如何用R语言从网上读取多样格式数据
- C/C++——生成随机数
- PHP基础——PHP数组
- 使用shell抽取html数据之二(r2笔记75天)
- Python爬取链家网数据:新房楼盘价格分析
- 【编程基础】Java里面如何对字符串排序?
- 计算广告——广告定向实践
- 通过shell抓取html数据(r2笔记74天)
- 通过shell脚本分析足彩(r2笔记74天)
- 通过shell脚本得到数据字典的信息 (r2笔记72天)
- 机器学习算法实践——K-Means算法与图像分割
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 字符编码与字符串表达式
- 关于批次效应矫正后出现负值
- 在SAP WebIDE里使用Fiori Elements快速开发SAP UI5应用
- SAP Fiori Elements里的Smart Table工作原理解析
- SAP Fiori Elements里Smart Link工作原理介绍
- SAP CDS view自学教程之六:如何在CDS view里消费table function
- 如何构建一个100 Gbit(无丢包)连续数据包记录器[Part3]
- 使用SAP CDS view快速创建一个Fiori应用,管理Service Order
- SAP Fiori Elements里Drop down list的实现原理
- SAP CRM销售订单UI上的字段对应的数据库表存储字段:requested start date和end date
- SAP CDS view自学教程之八:SAP Fiori Elements里不同类型的annotation
- SAP CDS view自学教程之五:如何开发支持Odata navigation的CDS view
- SAP Fiori Elements如何基于domain fixed value创建下拉菜单
- SAP WebClient UI配置决定(configuration)的逻辑介绍
- 潘石屹用Python解决100个问题 | 阶乘之和