1、前言
对于很多初次接触Web端即时通讯技术的人来说,WebSocket是个很新的概念,但无疑它是当前Web端即时通讯技术中最热门的关键词。随便点开一篇文章,只要说打算开发Web端即时通讯相关的的应用,老司机们推荐的无一例外都是WebSocket。
那么好了,我知道应该用WebSocket,但本着知其然知其所以然的码农习惯,我还是需要了解下面这些问题:
1)Socket 和 WebSocket 有哪些区别和联系?
2)WebSocket 和 HTML5 是什么关系?
3)必须在浏览器中才能使用 WebSocket 吗?
4)WebSocket 能和 Socket 一样传输 raw 数据么?
5)WebSocket 和 Socket 相比会多耗费流量么?
但是,目前网上全面介绍这两种协议的中文文章并不多,或者说不够全面。我无法找到一篇文章能解决上面的所有问题。因此,我写了本文,把找到的 Socket 和 WebSocket 的相关资料做一个梳理,以方便理解。
本文并不能直接完整回答上面提出的几个问题,但读完本文,要理解上面的那些问题,是很容易的事。由于能力有限,本文不可能很长。而且,技术细节并非所有人都愿意仔细了解。但本文包含了大量的外部链接,跟随这些链接,可以找到足够多的细节,满足你/我的求知欲。Are you ready?
学习交流:
- 即时通讯开发交流群:320837163[推荐]
- 移动端IM开发入门文章:《新手入门一篇就够:从零开发移动端IM》
(本文同步发布于:http://www.52im.net/thread-1273-1-1.html)
2、系列文章
本文是系列文章中的第5篇,本系列文章的大纲如下:
《WebSocket详解(一):初步认识WebSocket技术》
《WebSocket详解(二):技术原理、代码演示和应用案例》
《WebSocket详解(三):深入WebSocket通信协议细节》
《WebSocket详解(四):刨根问底HTTP与WebSocket的关系(上篇)》
《WebSocket详解(五):刨根问底HTTP与WebSocket的关系(下篇)》
《WebSocket详解(六):刨根问底WebSocket与Socket的关系》(本文)
《WebSocket详解(七):WebSocket协议与Socket.io开源工程》
3、更多资料
Web端即时通讯新手入门贴:
Web端即时通讯技术盘点请参见:
《Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE》
关于Ajax短轮询:
找这方面的资料没什么意义,除非忽悠客户,否则请考虑其它3种方案即可。
有关Comet技术�的详细介绍请参见:
《Comet技术详解:基于HTTP长连接的Web端实时通信技术》
《WEB端即时通讯:HTTP长连接、长轮询(long polling)详解》
《WEB端即时通讯:不用WebSocket也一样能搞定消息的即时性》
《开源Comet服务器iComet:支持百万并发的Web端即时通讯�方案》
有关WebSocket的详细介绍请参见:
《WebSocket详解(一):初步认识WebSocket技术》
《WebSocket详解(二):技术原理、代码演示和应用案例》
《WebSocket详解(三):深入WebSocket通信协议细节》
《Socket.IO介绍:支持WebSocket、用于WEB端的即时通讯的框架》
《socket.io和websocket 之间是什么关系?有什么区别?》
有关SSE的详细介绍文章请参见:
更多WEB端即时通讯文章请见:
http://www.52im.net/forum.php?mod=collection&action=view&ctid=15
4、技术对比
选择了 WebSocket 技术之后,不可避免的,我要将它和其他协议以及技术做一下比较。最常见的,就是需要比较 WebSocket 与 HTTP、Socket 技术的异同。本系列文章中《WebSocket详解(四):刨根问底HTTP与WebSocket的关系(上篇)》、《WebSocket详解(五):刨根问底HTTP与WebSocket的关系(下篇)》两篇详细讨论了WebSocket和HTTP的关系,那么本篇将只讨论WebSocket和Socket的话题。
WebSocket 是为了满足基于 Web 的日益增长的实时通信需求而产生的。在传统的 Web 中,要实现实时通信(比如网页的QQ,聊天系统等),通用的方式是采用 HTTP 协议不断发送请求(按照以往的技术能力通常是采用轮询、Comet技术解决)。
HTTP协议是非持久化的,单向的网络协议,在建立连接后只允许浏览器向服务器发出请求后,服务器才能返回相应的数据。当需要即时通讯时,通过轮询在特定的时间间隔(如1秒),由浏览器向服务器发送Request请求,然后将最新的数据返回给浏览器。这样的方法最明显的缺点就是需要不断的发送请求,而且通常HTTP request的Header是非常长的,为了传输一个很小的数据 需要付出巨大的代价,是很不合算的,占用了很多的宽带。这种方式即浪费带宽(HTTP HEAD 是比较大的),又消耗服务器 CPU 占用(没有信息也要接受请求)。
而是用 WebSocket 技术,则会大幅降低上面提到的消耗,如下图所示。
关于更详细的描述,尹立的这篇文章讲得非常好:《WebSocket(2)–为什么引入WebSocket协议》。
那么,WebSocket 到底和 Socket 又有什么联系?这就要讲到 OSI 模型和 TCP/IP 协议族。
5、OSI 模型与 TCP/IP
以下是维基百科中关于OSI 模型的说明:
开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,ISO/IEC 7498-1),简称为OSI模型(OSI model),一种概念模型,由国际标准化组织(ISO)提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。
而 TCP/IP 协议可以看做是对 OSI 模型的一种简化(以下内容来自维基百科):
它将软件通信过程抽象化为四个抽象层,采取协议堆叠的方式,分别实作出不同通信协议。协议套组下的各种协议,依其功能不同,被分别归属到这四个阶层之中7,常被视为是简化的七层OSI模型。
这里有一张图详细介绍了 TCP/IP 协议族中的各个协议在 OSI模型 中的分布,一图胜千言(此图高清版:点此下载):
TCP/IP 协议和 OSI 模型的内容,在互联网上有很多。我没有必要再次介绍它们。在这里,我们只需要知道,HTTP、WebSocket 等协议都是处于 OSI 模型的最高层: 应用层 。而 IP 协议工作在网络层(第3层),TCP 协议工作在传输层(第4层)。
至于 OSI 模型的各个层次都有什么系统和它们对应,这里有篇很好的文章可以满足大家的求知欲:OSI七层模型详解。
6、WebSocket 与 TCP
从上面的图中可以看出,HTTP、WebSocket 等应用层协议,都是基于 TCP 协议来传输数据的,我们可以把这些高级协议理解成对 TCP 的封装。
既然大家都使用 TCP 协议,那么大家的连接和断开,都要遵循TCP 协议中的三次握手和四次握手,只是在连接之后发送的内容不同,或者是断开的时间不同。
更详细内容可阅读:《wireshark抓包图解 TCP三次握手/四次挥手详解》。
对于 WebSocket 来说,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了(具体可见文章《WebSocket详解(五):刨根问底HTTP与WebSocket的关系(下篇)》)。
7、再来八卦一下WebSocket的由来
由于年代久远,计算机方面很多事情也搞不了那么清楚。但WebSocket是一个很新的东西,可以让我们看到它是如何成为现在我们看到的这个样子的。
7.1 WHATWG(Web Hypertext Application Technology Working Group)
关于HTML5的故事很多人都是知道的,w3c放弃了HTML,然后有一群人(也有说是这些人供职的公司,不过官方的文档上是说的个人)创立了WHATWG组织来推动HTML语言的继续发展,同时,他们还发展了很多关于Web的技术标准,这些标准不断地被官方所接受。WebSocket就属于WHATWG发布的Web Application的一部分(即HTML5)的产物。
7.2 为什么会有WebSocket
大约在08年的时候,WG的工程师在讨论网络环境中需要一种全双工的连接形式,刚开始一直叫做「TCPConnection」,并讨论了这种协议需要支持的功能,大致已经和我们今天看到的WebSocket差不多了。他们认为基于现有的HTTP之上的一些技术(如长轮询、Comet)并满足不了这种需求,有必要定义一个全新的协议。
7.3 名称的由来
在很多的关于HTML5或者WebSocket的文档中,都能看到一个名字,Hixie(Ian Hickson),他是WHATWG组织的发言人,曾供职于Netscape、Opera、Google,看工作的公司就知道这个人的背景了。
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。