WebSocket和socket的区别
去年光棍节的时候,我写过⼀篇。这篇⽂章介绍了我为何决定在项⽬中使⽤ LuaSocket 。
现在想起来,当时对 WebSocket 是很感兴趣的,但由于服务端的限制,最终依然选择了 LuaSocket。我后来对,使其更好⽤。
现在,⾯对⼀个全新的项⽬,我⾃然⽽然地选择了 WebSocket。
因此,我需要了解下⾯这些问题:
1. Socket 和 WebSocket 有哪些区别和联系?
2. WebSocket 和 HTML5 是什么关系?
3. 必须在浏览器中才能使⽤ WebSocket 吗?
4. WebSocket 能和 Socket ⼀样传输 raw 数据么?
5. WebSocket 和 Socket 相⽐会多耗费流量么?
但是,⽬前⽹上全⾯介绍这两种协议的中⽂⽂章并不多,或者说不够全⾯。我⽆法到⼀篇⽂章能解决上⾯的所有问题。因此,我写了本⽂,把到的 Socket 和 WebSocket 的相关资料做⼀个梳理,以⽅便理解。
本⽂并不能直接完整回答上⾯提出的⼏个问题,但读完本⽂,要理解上⾯的那些问题,是很容易的事。
由于能⼒有限,本⽂不可能很长。⽽且,技术细节并⾮所有⼈都愿意仔细了解。本⽂包含了⼤量的外部链接,跟随这些链接,可以到⾜够多的细节,满⾜你/我的求知欲。
1. 概述
选择了 WebSocket 技术之后,不可避免的,我要将它和其他协议以及技术做⼀下⽐较。最常见的,就是需要⽐较 WebSocket 与 HTTP、Socket 技术的异同。
WebSocket 是为了满⾜基于 Web 的⽇益增长的实时通信需求⽽产⽣的。在传统的 Web 中,要实现实时通信,通⽤的⽅式是采⽤ HTTP 协议不断发送请求。但这种⽅式即浪费带宽(HTTP HEAD 是⽐较⼤的),⼜消耗服务器 CPU 占⽤(没有信息也要接受请求)。(下图来⾃)
⽽是⽤ WebSocket 技术,则会⼤幅降低上⾯提到的消耗:(下图来⾃)
关于更详细的描述,尹⽴的这篇⽂章讲得⾮常好:。
那么,WebSocket 到底与 HTTP 协议到底是⼀个什么样的关系呢?它和 Socket ⼜有什么联系?这就要讲到 OSI 模型和 TCP/IP 协议族。
2. OSI 模型与 TCP/IP
以下是中关于OSI 模型的说明:
开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,ISO/IEC 7498-1),简称为OSI模型
(OSI model),⼀种概念模型,由国际标准化组织(ISO)提出,⼀个试图使各种计算机在世界范围内互连为⽹络的标准框
架。
⽽ TCP/IP 协议可以看做是对 OSI 模型的⼀种简化(以下内容来⾃):
它将软件通信过程抽象化为四个抽象层,采取协议堆叠的⽅式,分别实作出不同通信协议。协议套组下的各种协议,依其功能不同,被分别归属到这四个阶层之中,常被视为是简化的七层OSI模型。
这⾥有⼀张图详细介绍了 TCP/IP 协议族中的各个协议在 OSI模型中的分布,⼀图胜千⾔(下图来⾃):
TCP/IP 协议和 OSI 模型的内容,在互联⽹上有很多。我没有必要再次介绍它们。在这⾥,我们只需要知道,HTTP、WebSocket 等协议都是处于 OSI 模型的最⾼层:应⽤层。⽽ IP 协议⼯作在⽹络层(第3层),TCP 协议⼯作在传输层(第4层)。
⾄于 OSI 模型的各个层次都有什么系统和它们对应,这⾥有篇很好的⽂章可以满⾜⼤家的求知欲:。
3. WebSocket、HTTP 与 TCP
从上⾯的图中可以看出,HTTP、WebSocket 等应⽤层协议,都是基于 TCP 协议来传输数据的。我们可以把这些⾼级协议理解成对 TCP 的封装。
既然⼤家都使⽤ TCP 协议,那么⼤家的连接和断开,都要遵循,只是在连接之后发送的内容不同,或者是断开的时间不同。
更详细内容可阅读:
对于 WebSocket 来说,它必须依赖,握⼿成功后,数据就直接从 TCP 通道传输,与 HTTP ⽆关了。nginx和apache区别
4. Socket 与 WebScoket
其实并不是⼀个协议。它⼯作在 OSI 模型会话层(第5层),是为了⽅便⼤家直接使⽤更底层协议(⼀般是或)⽽存在的⼀个抽象层。最早的⼀套 Socket API 是,采⽤ C 语⾔实现。它是 Socket 的事实标准,POSIX sockets 是基于它构建的,多种编程语⾔都遵循这套API,在 JAVA、Python 中都能看到这套 API 的影⼦。
下⾯摘录⼀段更容易理解的⽂字(来⾃):
Socket是应⽤层与TCP/IP协议族通信的中间软件抽象层,它是⼀组接⼝。在设计模式中,Socket其实就是⼀个门⾯模式,它把复杂的TCP/IP协议族隐藏在Socket接⼝后⾯,对⽤户来说,⼀组简单的接⼝就是全部,让Socket去组织数据,以符合指定的协议。
主机 A 的应⽤程序要能和主机 B 的应⽤程序通信,必须通过 Socket 建⽴连接,⽽建⽴ Socket 连接必须需要底层 TCP/IP 协议来建⽴ TCP 连接。建⽴ TCP 连接需要底层 IP 协议来寻址⽹络中的主机。我们知道⽹络层使⽤的 IP 协议可以帮助我们根据 IP 地址来到⽬标主机,但是⼀台主机上可能运⾏着多个应⽤程序,如何才能与指定的应⽤程序通信就要通过 TCP 或 UPD 的地址也就是端⼝号来指定。这样就可以通过⼀个 Socket 实例唯⼀代表⼀个主机上的⼀个应⽤程序的通信链路了。
⽽则不同,它是⼀个完整的,包含⼀套标准的。
所以,从使⽤上来说,WebSocket 更易⽤,⽽ Socket 更灵活。
5. HTML5 与 WebSocket
是标准的⼀部分,但这并不代表 WebSocket ⼀定要⽤在 HTML 中,或者只能在基于浏览器的应⽤程序中使⽤。
实际上,许多语⾔、框架和服务器都提供了 WebSocket ⽀持,例如:
基于 C 的
基于 Node.js 的
基于 Python 的
基于 C++ 的
Apache 对 WebSocket 的⽀持:
Nginx 对 WebSockets 的⽀持:、、
lighttpd 对 WebSocket 的⽀持:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论