为什么不直接使用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 ...
随机推荐
- mysql复制以及一主多从等常见集群概述
1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的 数据复制到其它主机(slaves)上,并 ...
- mysql DOS中中文乱码 ERROR 1366 (HY000): Incorrect string value: '\xC4\xEA\xBC\xB6' for column 'xxx' at row 1
问题:ERROR (HY000): Incorrect string value: 在DOS中插入或查询中文出现乱码 登入mysql,输入命令:show variables like '%char%' ...
- js正则表达式常见面试题
1 . 给一个连字符串例如:get-element-by-id转化成驼峰形式. var str = "get-element-by-id"; var reg = /-\w/g; / ...
- XMLHTTPRequest状态status完整列表
当用户试图通过 HTTP 访问一台正在运行 Internet 信息服务 (IIS) 的服务器上的内容时,IIS 返回一个表示该请求的状态的数字代码.状态代码可以指明具体请求是否已成功,还可以揭示请求失 ...
- python的异常捕捉
你可能会说既然有万能异常Exception,那么我直接用上面的这种形式就好了,其他异常可以忽略 你说的没错,但是应该分两种情况去看 1.如果你想要的效果是,无论出现什么异常,我们统一丢弃,或者使用同一 ...
- Excel宏开发之合并单元格
合并单元格 Sub 宏1() ' ' 宏1 宏 ' ' 快捷键: Ctrl+q ' Application.Goto Reference:="宏1" Application.VBE ...
- 配置文件一web.xml
前言 web.xml中标签的加载顺序:<context-param> > <listener> (spring的相关工作) > filter >servlet ...
- 阿里云发布新版SaaS上云工具包,全面助力SaaS上云
9月26日,在云栖大会SaaS加速器专场上,阿里云发布了新版的SaaS上云工具包(SaaS Launch Kit),发布了API网关的新功能,以及推出了全新升级的能力中心. SaaS上云工具包,顾名思 ...
- thinkphp cbd模式
ThinkPHP从3.0版本开始引入了全新的CBD(核心Core+行为Behavior+驱动Driver)架构模式,因为从底层开始,框架就采用核心+行为+驱动的架构体系,核心保留了最关键的部分,并在重 ...
- 牛客多校第六场 B Shorten IPv6 Address 模拟
题意: 给你一个二进制表示的IPv6地址,让你把它转换成8组4位的16进制,用冒号分组的表示法.单组的前导0可以省略,连续多组为0的可以用两个冒号替换,但是只允许替换一次.把这个地址通过这几种省略方式 ...