WebSocket三问—腾讯三问

简介: WebSocket作为应用层的全双工通信协议,也是物联网情境下经常用到的协议,今天就来了解下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位表示数据长度。


这里用一张图总结了数据帧各个字节的含义


10.jpg


这个问题一般不用答这么细,就简单说说每个字节代表什么意思就行,比如opcode代表操作码,当然前提是你简历中提到WebSocket才会问到这些。

目录
相关文章
|
9月前
|
缓存 网络协议 NoSQL
腾讯春招后端一面(八股篇)
腾讯春招后端一面(八股篇)
142 0
|
人工智能 运维 中间件
推荐一位阿里朋友的巨作,助你成为顶尖服务端开发者——《服务端开发:技术、方法与实用解决方案》
推荐一位阿里朋友的巨作,助你成为顶尖服务端开发者——《服务端开发:技术、方法与实用解决方案》
640 0
|
设计模式 算法 安全
弯道超车!阿里P5~P8学习路线终发布,程序员进阶的关键所在
我们都知道优秀程序员的成长之路就是一条不断打怪升级之路。相信很多人都思考过以下问题:初级程序员如何快速成长?怎样从—个初学者成长为一名合格的程序员?又如何从一名合格的程序员登上职业高峰,成为一名CTO(首席技术官)呢?
|
网络协议 算法 前端开发
前端备战21秋招之计算机网络,我觉得这一篇应该就够了(一)
前端备战21秋招之计算机网络,我觉得这一篇应该就够了(一)
|
缓存 JSON 网络协议
前端备战21秋招之计算机网络,我觉得这一篇应该就够了(二)
前端备战21秋招之计算机网络,我觉得这一篇应该就够了(二)
|
Web App开发 缓存 网络协议
前端备战21秋招之计算机网络,我觉得这一篇应该就够了(三)
前端备战21秋招之计算机网络,我觉得这一篇应该就够了(三)
|
开发框架 JavaScript 前端开发
前端周刊第十六期
前端周刊发表每周前端技术相关的大事件、文章教程、一些框架的版本更新、以及代码和工具。每周定期发表,欢迎大家关注、转载。
前端周刊第十六期
|
XML 前端开发 调度
项目架构三问—腾讯真题
俗话说,无规矩不成方圆,对于项目也是这样,必须有统一的架构体系才能让项目更加稳健,开放,和快速。今天就来谈谈吧:
190 0
|
人工智能 移动开发 边缘计算
前端热爱,技术无界,第十五届 D2 前端技术论坛,我们云端相聚!
D2 前端技术论坛 (Designer & Developer Frontend Technology Forum, 简称 D2),是由阿里经济体前端委员会主办的面向全球前端领域的技术论坛,立志于建设一个促进业内交流、引领前端领域发展的平台。目前 D2 已经成功地举办了 14 届,为国内外前端领域的开发者和设计者提供了共同探讨行业发展的机会,以技术会友、一起分享技术的乐趣。
501 0
前端热爱,技术无界,第十五届 D2 前端技术论坛,我们云端相聚!
|
人工智能 移动开发 边缘计算