为什么不直接使用socket ,还要定义一个新的websocket 的呢
大致概念:
TCP/IP 协议,是网络七层协议的第四层,本身没有长连接或短连接的区别;
HTTP 是基于 TCP 协议之上的「短连接」应用层协议,它的出现极大简化了网络应用的实现门槛,丰富了应用;
Socket 是操作系统内置的一套操作 TCP/IP 协议的网络(套接字)的方法;
Websocket 是跟 HTTP 对应的,基于 TCP 协议之上的「长连接」协议。
问 & 答
问:为什么在 HTTP 存在的很长一段时间都没有出现标准的「长连接」协议呢?
答:因为直接基于 TCP 的握手协议根本不分长短连接,所以你可以理解成天生就是长连接。所以很早就有基于长连接的「聊天协议」专门用于聊天等碎片化信息交换场景(例如 IRC、XMPP)。随着 WWW(万维网)被发明出来,需要一个交换丰富表达形式的方式,来表达一些中等长度的内容展现。与 IRC 那种 为少数人之间传递碎片信息的协议不一样,WWW 被设计成 1对上万人甚至数十万人传递信息,所以需要一个能节省「连接维系成本」的协议,它需要在用户看完这篇内容后,断开连接,以给其他人再查看这篇内容,于是就出现了 HTTP 短连接协议。所以,并不是在 HTTP 之前没有 长连接协议,只是他们在当时应用场景范围不大。
问:QQ、微信基于的都是 IRC 协议吗?
答:不是,QQ、微信基于自己的私有通信协议,为什么呢?因为聊天是碎片化的实时行为,场景是高频地进行网络交换。所以这种情况下,节省 TCP 的握手次数、节省协议本身的网络消耗就显得非常重要。所以大型 IM 软件都基于私有协议(有自己的服务端、客户端),这样能最大化精简交换信息时消耗的网络资,而 HTTP 的特点是「每进行一次网络交换,都能传送一篇长文,供读者读好一段时间」,并非高频交换,所以从协议设计的角度来讲,「统一性、功能性」比「简洁性」更重要)。
问:为什么再需要 Websocket,而不能直接使用以前的 IRC或 XMPP 呢?
答:因为 浏览器是基于 HTTP 的标准客户端,而且 HTTP 协议发展到今天在各个方面已经非常成熟,所以最大程度复用是合理的。
问:QQ、微信 会改成 Websocket 协议吗?
答:Web 版本可能会,但客户端版本很大概率不会。原因很简单,就是前面说的,公用协议臃肿,既然有自己的客户端,为什么不自己设计协议。但很多创业产品,应该会直接使用 Websocket 来 startup,因为普及,所以开发门槛低。
问:既然 Websocket 臃肿,为什么各个产品不在 Web 里使用私有协议?
答:因为整个浏览器都不支持直接调用系统底层的 Socket,基于浏览器的 Web 自然无法调用,只能使用封装的高级协议方案 —— Websocket。
本文摘抄自:https://github.com/onlyliuxin/coding2017/issues/497#
为什么不直接使用socket ,还要定义一个新的websocket 的呢的更多相关文章
- CREATE FUNCTION - 定义一个新函数
SYNOPSIS CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] ) RETURNS rettype { LANGUAGE lang ...
- Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 语法EDIT Object.defineProperty(obj, ...
- Python tricks(1) -- 动态定义一个新变量
python是动态语言, 无需声明变量即可使用. 传递一个tuple, list或者dict等等方式, 有时候这种方式的使用不是很好. 对于tuple和list来说都是用下标的访问方式(即使用[]), ...
- CREATE OPERATOR CLASS - 定义一个新的操作符类
SYNOPSIS CREATE OPERATOR CLASS name [ DEFAULT ] FOR TYPE data_type USING index_method AS { OPERATOR ...
- CREATE OPERATOR - 定义一个新的操作符
SYNOPSIS CREATE OPERATOR name ( PROCEDURE = funcname [, LEFTARG = lefttype ] [, RIGHTARG = righttype ...
- CREATE AGGREGATE - 定义一个新的聚集函数
SYNOPSIS CREATE AGGREGATE name ( BASETYPE = input_data_type, SFUNC = sfunc, STYPE = state_data_type ...
- CREATE TYPE - 定义一个新的数据类型
SYNOPSIS CREATE TYPE name AS ( attribute_name data_type [, ... ] ) CREATE TYPE name ( INPUT = input_ ...
- CREATE TRIGGER - 定义一个新的触发器
SYNOPSIS CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] } ON table [ FOR [ EACH ] { ROW | ...
- CREATE TABLE - 定义一个新表
SYNOPSIS CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name ( { column_name data_ty ...
随机推荐
- NX二次开发-创建圆弧(圆心-半径)UF_CURVE_create_arc_center_radius
NX9+VS2012 #include <uf.h> #include <uf_curve.h> #include <uf_modl.h> UF_initializ ...
- "Access denied for user 'root@localhost' 试一下你的mysql是不是用任何密码都可以登录,如果是的话这里
https://blog.csdn.net/light_breeze/article/details/82070222 花了三小时...竟然是因为这个
- 2019 牛客多校第一场 D Parity of Tuples
题目链接:https://ac.nowcoder.com/acm/contest/881/D 看此博客之前请先参阅吕凯飞的论文<集合幂级数的性质与应用及其快速算法>,论文中很多符号会被本文 ...
- SonarQube代码质量扫描持续集成
1.安装JDK和配置JAVA_HOME和CLASSPATH 2.安装mysql数据库 3.创建数据库和用户 mysql -u root -p mysql> CREATE DATABASE son ...
- SVG动画制作工具 , 从此抛弃臃肿的gif
VG简介 只要是程序员的你,你不得不知道svg图片,它可以无限任意放大拉伸都不会损失画质,就像系统字体一样可以无限矢量放大,svg更高级是可以用来制作矢量动画,现在各大浏览器和系统基本对svg已经支持 ...
- MySQL基本命令脚本
一.基本命令 1.启动服务 说明:以管理员身份运行cmd 格式:net start 服务名称 示例:net start mysql57 2.停止服务 说明:以管理员身份运行cmd 格式:net sto ...
- 表单 用jquery做输入脱离焦点 进行正则验证
<!-- 账号登录块 --> <form class="form1" action="" method="get&quo ...
- for in循环介绍以及陷阱
大家都知道在JavaScript中提供了两种方式迭代对象: (1)for 循环: (2)for..in循环: 使用for循环进行迭代数组对象,想必大家都已经司空见惯了.但是,使用for.. in循环时 ...
- oracle将查询结果横转纵
SELECT '残疾人|民政|综合治理|计划生育|物业监管|安全生产|环境类|司法信访|党建|社会组织|文化体育|社保' D , '53|52|51|50|49|48|47|5|4|3|2|1' g ...
- luoguP2580 于是他错误的点名开始了 [Trie]
题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900). ...