透视HTTP协议
罗剑锋(Chrono)
奇虎360技术专家,Nginx/OpenResty开源项目贡献者
立即订阅
6077 人已学习
课程目录
已完结 44 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词|To Be a HTTP Hero
免费
破冰篇 (7讲)
01 | 时势与英雄:HTTP的前世今生
02 | HTTP是什么?HTTP又不是什么?
03 | HTTP世界全览(上):与HTTP相关的各种概念
04 | HTTP世界全览(下):与HTTP相关的各种协议
05 | 常说的“四层”和“七层”到底是什么?“五层”“六层”哪去了?
06 | 域名里有哪些门道?
07 | 自己动手,搭建HTTP实验环境
基础篇 (7讲)
08 | 键入网址再按下回车,后面究竟发生了什么?
09 | HTTP报文是什么样子的?
10 | 应该如何理解请求方法?
11 | 你能写出正确的网址吗?
12 | 响应状态码该怎么用?
13 | HTTP有哪些特点?
14 | HTTP有哪些优点?又有哪些缺点?
进阶篇 (8讲)
15 | 海纳百川:HTTP的实体数据
16 | 把大象装进冰箱:HTTP传输大文件的方法
17 | 排队也要讲效率:HTTP的连接管理
18 | 四通八达:HTTP的重定向和跳转
19 | 让我知道你是谁:HTTP的Cookie机制
20 | 生鲜速递:HTTP的缓存控制
21 | 良心中间商:HTTP的代理服务
22 | 冷链周转:HTTP的缓存代理
安全篇 (7讲)
23 | HTTPS是什么?SSL/TLS又是什么?
24 | 固若金汤的根本(上):对称加密与非对称加密
25 | 固若金汤的根本(下):数字签名与证书
26 | 信任始于握手:TLS1.2连接过程解析
27 | 更好更快的握手:TLS1.3特性解析
28 | 连接太慢该怎么办:HTTPS的优化
29 | 我应该迁移到HTTPS吗?
飞翔篇 (4讲)
30 | 时代之风(上):HTTP/2特性概览
31 | 时代之风(下):HTTP/2内核剖析
32 | 未来之路:HTTP/3展望
33 | 我应该迁移到HTTP/2吗?
探索篇 (5讲)
34 | Nginx:高性能的Web服务器
35 | OpenResty:更灵活的Web服务器
36 | WAF:保护我们的网络服务
37 | CDN:加速我们的网络服务
38 | WebSocket:沙盒里的TCP
总结篇 (2讲)
39 | HTTP性能优化面面观(上)
40 | HTTP性能优化面面观(下)
答疑篇 (2讲)
41 | Linux/Mac实验环境搭建与URI查询参数
42 | DHE/ECDHE算法的原理
结束语 (1讲)
结束语 | 做兴趣使然的Hero
透视HTTP协议
登录|注册

38 | WebSocket:沙盒里的TCP

Chrono 2019-08-23
在之前讲 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《透视HTTP协议》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(13)

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

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

    2019-08-23
    1
    3
  • 许童童
    思考题:
    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
  • Cris
    老师,我想问下,uri里的端口号,有什么用?为什么它是和协议对应的(http默认80,https默认443),却又写在域名的后面?

    作者回复: 可以参考一下第6讲,端口号是跟tcp协议相关的概念。

    因为域名实际上是ip地址的等价替换,所以端口号就可以跟在域名后面。

    2019-08-23
    1
  • 徐海浪
    1. WebSocket 与 HTTP/2 有很多相似点,比如都可以从 HTTP/1 升级,都采用二进制帧结构,你能比较一下这两个协议吗?
    差别:HTTP/2是请求与响应的模式,而WebSocket是双向的,服务器也可以主动向客户端发起请求。
    2. 试着自己解释一下 WebSocket 里的”Web“和”Socket“的含义。
    是基于web服务器,类似于tcp的socket方式来使用的协议。
    3. 结合自己的实际工作,你觉得 WebSocket 适合用在哪些场景里?
    我在实际工作中还没有用到WebSocket,觉得适合服务器主动推送的客户端的场景,比如站内信或者站内聊天,或者在线页游?

    作者回复:
    1.在WebSocket里没有请求响应的概念,收发的都是数据帧,通信的双方可以自己解释帧的含义。

    2.应该是基于web,也就是http协议。

    3.对。

    2019-08-23
    1
    1
  • -W.LI-
    老师好!websocket单机服务器能支持多少链接啊?之前没用过websocket。看帖子好像是通过key-value形式存储所有链接。需要用得时候通过key拿到链接往外写数据。希望老师科普下web socket的简单应用和实现,性能分析。
    需要服务器主动推的感觉都可以用websocket做。
    聊天工具:用户A,用户B,
    A->服务器(保存聊天记录)->B;B->服务器(保存聊天记录)->A;是这样么?

    作者回复:
    WebSocket其实就是给tcp加了一层简单的包装,所以它的并发能力取决于服务器,并不是kv的形式,你应该把它理解成运行在http上的tcp,用tcp的思路去考虑它。

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

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

    2019-12-10
  • Demon.Lee
    之前用MQTT进行数据推送,与websocket还是不太一样。

    作者回复: 抱歉没用过mqtt,不能给出两者的对比。

    2019-11-05
  • 酸奶啊火龙果
    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
  • 我叫徐小晋
    做网页的在线聊天用这个嘛?

    作者回复: 是的。

    2019-09-09
  • 丶景
    老师好,那是不是可以理解成其实 http2 也能解决 WebSocket 所解决的问题?因为 hhtp2 也能服务器推送?谢谢老师

    作者回复: 不行,WebSocket是实时全双工,而http/2的推送只是为了减少客户端请求的成本,出发点不同,用起来也就差距很大,毕竟http/2的主要应用场景还是标准的http请求应答,实时性不强。

    WebSocket和http/2各有自己的优势,不存在相互替代。

    2019-08-29
  • 崔伟协
    强制客户端掩码是什么意思

    作者回复: 协议里要求客户端发送WebSocket帧,必须使用掩码,否则就是格式错误,服务器应该拒绝接收。

    2019-08-26
  • 安排
    是js的实时web应用会调用websocket api吗?没接触过js,不太懂这套运行流程。

    作者回复: WebSocket API是HTML5的一部分,所以JS就可以使用WebSocket实现实时通信。

    2019-08-24
  • 安排
    虽然大多数情况下我们会在浏览器里调用 API 来使用 WebSocket。这句话不太理解,websocket不是只有浏览器自己会调用吗?用户还能在浏览器之上调用websocket api,可以举个例子吗?

    作者回复: WebSocket是一个通用的协议,只是大多数情况下是在http、浏览器里使用。

    完全可以自己写一个应用程序,使用WebSocket来通信。

    2019-08-24
收起评论
13
返回
顶部