为什么不直接使用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二次开发-UFUN打开信息窗口UF_UI_open_listing_window()
NX9+VS2012 #include <uf.h> #include <uf_ui.h> UF_initialize(); //方法1(uc1601) uc1601();// ...
- 关于C++里set_intersection(取集合交集)、set_union(取集合并集)、set_difference(取集合差集)等函数的使用总结
文章转载自https://blog.csdn.net/zangker/article/details/22984803 set里面有set_intersection(取集合交集).set_union( ...
- 检测API函数的InlineHook
BOOL GetProcHookStatus(LPCSTR lpModuleName, LPCSTR lpProcName) { HMODULE hModule = GetModuleHandleA( ...
- Linux环境下Jmeter 报错:Unable to get local host IP address
主要是没有在host中配置本机ip hostname查看本机名 [root@test task]# hostname test [root@test task]# 打开 [root@test task ...
- 如何把本地文件上传github
1.$ git config --global user.name "xxx" 2.$ git config --global user.email xxx@qq.com 3.进入 ...
- 使用R语言 SDK调取tushare数据
安装Tushare 打开RStudio,在控制台输入命令: > install.packages('Tushare') Tushare的R包需要依赖httr.tidyverse.forecast ...
- callable接口的多线程实现方式
package com.cxy.juc; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionExce ...
- iphone11系统输入框的光标位置不正常
本人的系统是11.3的是正常的,却发现测试机的11.1和11.2的光标位置在输入框的下边.百度一下,很多人有同样的问题,在此记录一下 解决办法一: //弹框弹出后执行如下代码 $('body').cs ...
- iOS开发系列-NSFileManager
NSFileManager NSFileManager类主要对文件和目录的操作(删除.修改.移动.复制等等).
- mysql中重复数据只取条
select * from table_a where id in (select min(id) from table_a group by a) )) SUBSTRING_INDEX(cids,' ...