透视 HTTP 协议
罗剑锋(Chrono)
前奇虎 360 技术专家,Nginx/OpenResty 开源项目贡献者
63943 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
开篇词 (1讲)
透视 HTTP 协议
15
15
1.0x
00:00/00:00
登录|注册

38 | WebSocket:沙盒里的TCP

WebSocket适合用在哪些场景里
解释WebSocket中的"Web"和"Socket"的含义
比较WebSocket与HTTP/2
WebSocket利用HTTP协议实现连接握手
WebSocket使用二进制帧
WebSocket使用兼容HTTP的URI来发现服务
WebSocket是全双工通信协议
HTTP的请求-应答模式不适合实时通信应用
防止误连接的认证机制
握手过程
利用HTTP的协议升级特性
帧长度
控码标志位
操作码
消息结束标志位
帧结构
服务发现
与TCP类似
全双工通信协议
克服HTTP请求-应答模式的缺点
难以应用在实时通信领域
请求-应答通信模式的缺陷
HTTP/2解决的问题
课下作业
小结
WebSocket的握手
WebSocket的帧结构
WebSocket的特点
为什么要有WebSocket
WebSocket

该思维导图由 AI 生成,仅供参考

在之前讲 TCP/IP 协议栈的时候,我说过有“TCP Socket”,它实际上是一种功能接口,通过这些接口就可以使用 TCP/IP 协议栈在传输层收发数据。
那么,你知道还有一种东西叫“WebSocket”吗?
单从名字上看,“Web”指的是 HTTP,“Socket”是套接字调用,那么这两个连起来又是什么意思呢?
所谓“望文生义”,大概你也能猜出来,“WebSocket”就是运行在“Web”,也就是 HTTP 上的 Socket 通信规范,提供与“TCP Socket”类似的功能,使用它就可以像“TCP Socket”一样调用下层协议栈,任意地收发数据。
更准确地说,“WebSocket”是一种基于 TCP 的轻量级网络通信协议,在地位上是与 HTTP“平级”的。

为什么要有 WebSocket

不过,已经有了被广泛应用的 HTTP 协议,为什么要再出一个 WebSocket 呢?它有哪些好处呢?
其实 WebSocket 与 HTTP/2 一样,都是为了解决 HTTP 某方面的缺陷而诞生的。HTTP/2 针对的是“队头阻塞”,而 WebSocket 针对的是“请求 - 应答”通信模式。
那么,“请求 - 应答”有什么不好的地方呢?
“请求 - 应答”是一种“半双工”的通信模式,虽然可以双向收发数据,但同一时刻只能一个方向上有动作,传输效率低。更关键的一点,它是一种“被动”通信模式,服务器只能“被动”响应客户端的请求,无法主动向客户端发送数据。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

WebSocket是一种基于TCP的轻量级网络通信协议,旨在解决HTTP请求-应答通信模式的不足。与HTTP相比,WebSocket具有全双工通信、实时推送数据的特点,使得服务器可以主动向客户端发送数据,提高了实时通信的效率。WebSocket的握手过程利用了HTTP的“协议升级”特性,通过特殊的HTTP GET请求和响应报文来完成握手,从而绕过浏览器沙盒、网络防火墙等限制,实现与服务器的直接TCP连接。WebSocket的帧结构采用二进制帧,具有结束标志位、操作码、帧长度和掩码等部分,使得通信过程更加灵活。尽管WebSocket在应用层,但使用方式与TCP Socket类似,需要用户自行管理连接、缓存、状态,因此在项目中引入WebSocket需慎重考虑。总的来说,WebSocket填补了HTTP请求-应答模式的不足,提高了实时通信的效率,但开发上相对复杂,适用于需要实时通信的场景。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《透视 HTTP 协议》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(36)

  • 最新
  • 精选
  • 许童童
    思考题: 1.WebSocket 和 HTTP/2 都是用来弥补HTTP协议的一些缺陷和不足,WebSocket 主要解决双向通信、全双工问题,HTTP/2 主要解决传输效率的问题,两者在二进制帧的格式上也不太一样,HTTP/2 有多路复用、优先级和流的概念。 2.试着自己解释一下 WebSocket 里的”Web“和”Socket“的含义。 Web就是HTTP的意思,Socket就是网络编程里的套接字,也就是HTTP协议上的网络套接字,可以任意双向通信。 3.结合自己的实际工作,你觉得 WebSocket 适合用在哪些场景里? IM通信,实时互动,回调响应,数据实时同步。

    作者回复: great。

    2019-08-23
    2
    31
  • cugphoenix
    是不是可以这样理解:HTTP是基于TCP的,通过TCP收发的消息用HTTP的应用层协议解析。WebSocket是首先通过HTTP协议把TCP链接建好,然后通过Upgrade字段进行协议转换,在收到服务器的101 Switching Protocols应答之后,后续的TCP消息就通过WebSocket协议解析。

    作者回复: 理解的基本正确,把WebSocket和http、tcp的关系理顺了。

    2020-02-07
    21
  • geraltlaush
    工作场景遇到过用户订阅股票的股价,股价波动时实时推送给海量订阅的用户,面试场景被问到两次,一 千万粉丝的明星发布动态如何推送给粉丝 二 海量用户的主播直播如何推送弹幕 当时回答消息队列,其实web socket才是比较好的方案

    作者回复: WebSocket适合实时通信交互的场景,和消息队列其实是两个领域,不冲突,可以互相结合使用。

    2019-08-23
    3
    13
  • 大土豆
    WebSocket定义为tcp over web,我个人感觉是不妥的,应该是"可靠有序的传输层 + 实现组包协议的应用层的长连接方案 over web"。WebSocket和HTTP已经有包的结构了,业务直接可以用了,浏览器A发一个websocket包,比如说数据是1234,给服务器,服务器可以获取这个包,数据是1234,和http一样了。而tcp还是原始的没头没尾的字节流,想要通讯,还得再自定义一个应用层的协议。

    作者回复: 说的很对。 正文里的tcp over web只是一种比喻,强调了WebSocket与http的区别,与tcp的相似性,不是那么严谨。

    2020-02-28
    8
  • 夏目
    两年前我实习的时候公司项目用过,到现在我才搞清楚和http的区别,惭愧…

    作者回复: 这两个确实很像,第一次接触的人(包括我)也是容易弄糊涂。

    2019-12-10
    5
  • ccx
    在 FINTECH 领域工作了几年了,自研发的外汇/数字货币交易系统的行情模块基本都是 websocket 实现的;另外还遇到一个有意思的场景,就是 discord 的机器人 Slash Commands 的实现也是基于 websocket 的。

    作者回复: websocket在如今的互联网大环境下非常有用,基于http握手建连让它可以很容易运行在各种web服务上。

    2021-09-30
    4
  • chao
    1、第二个字节后 7 位是“Payload len”,表示帧内容的长度。它是另一种变长编码,最少 7 位,最多是 7+64 位,也就是额外增加 8 个字节,所以一个 WebSocket 帧最大是 2^64。 2、如果数据的长度小于等于125个字节,则用默认的7个bit来标示数据的长度; 如果数据的长度为126个字节,则用后面相邻的2个字节来保存一个16bit位的无符号整数作为数据的长度; 如果数据的长度大于等于127个字节,则用后面相邻的8个字节来保存一个64bit位的无符号整数作为数据的长度; 老师,2是其它地方看到的,Payload len 这样设计的原因是什么,以及没明白为啥126个字节的长度要用16bit来表示

    作者回复: 我个人也觉得WebSocket的变长编码设计的很奇怪。 第二个字节最高位被mask占用,所以低7位表示长度,最多127。 那么125一下在低7位就够了,126用作标志位,表示后续使用两个字节,127又是另外一个标志位,表示后面是四个字节。 所以超过125后低7位就不再是长度的含义了,而是标志位:126=>2 bytes, 127=> 4 bytes。

    2019-09-18
    4
  • Evan Xia
    我们的业务场景是在下黑白棋的过程双方都能实时收到对方的落子, 用的是一个封装好的Centrifugo库,期间遇到最多的就是网络不好重连的问题

    作者回复:  这个场景用websocket还是挺合适的,不过网络的问题就是协议之外的事情了。

    2022-05-20
    2
  • ╭(╯ε╰)╮
    有个问题 30课介绍http2的时候不能重复使用443端口,所以重新用了8443端口。这节课websocket为什么就能跟http一起复用443端口呢?

    作者回复: websocket基于http/1.1,所以它可以和443,也就是https在一起。 而http/2与http/1.1完全不同,就没有办法用同一个端口。

    2023-01-20归属地:上海
    3
    1
  • Jasmine
    第二个字节后 7 位是“Payload len”,表示帧内容的长度。它是另一种变长编码,最少 7 位,最多是 7+64 位,也就是额外增加 8 个字节,所以一个 WebSocket 帧最大是 2^64。——这里最大的帧为什么不说是2^71呢?

    作者回复: 前面的7位是标志位,已经被占用了,所以只能用64位。

    2021-11-22
    1
收起评论
显示
设置
留言
36
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部