欢迎user
WebSocket入门
在通常的智能家居场景中,我们可以很方便地从口袋中掏出手机,打开APP应用,点击几下,启动家里的热水器,这样下班回家后,马上就可以洗个热水澡。
在这点击的零点几秒的时间内,Internet网上的控制报文是如下传输的。
①客户手机连接到云服务器发出热水器的控制指令
②云服务器把控制指令转发给家中智能家居网关,控制热水器开关
③热水器响应控制指令,将结果反馈给云服务器
④云服务器再将结果反馈给客户APP,APP显示设置成功
大家可能会问一个问题,为什么客户APP不直接控制智能家居网关,而使用云服务器做中转?
答案:智能家居设备是躲在家用路由器的后面,它的ip地址并不是公网地址,因此用户手机是无法访问到智能家居设备。同理,云服务器也无法访问到智能家居设备。
因此智能家居设备需要主动向云服务器发起连接,并建立好连接。这样客户APP就可以就随时登录到云端,通过云端对智能家居进行控制。
我们拿在internet世界最常用的HTTP协议来实现智能家居网关和云服务器的交互控制。HTTP协议非常简单,客户端发起一个request,服务器回一个response。
大家注意,服务器是不能主动发起请求的,这是因为HTTP协议必须是客户端发起的。因此如果要控制智能家居设备,智能家居设备需要不停的向服务器发起询问,查看云服务器是否对它下控制命令。
设备不停地对服务器请求会造成以下问题:
1、无论设备还是云服务器,CPU很忙,设备性能下降
2、占用带宽,特别是云服务器的带宽资源是比较昂贵的
好,我们现在请出WebSocket协议来替换HTTP协议的实现,设备和服务器的请求变成下面的对话:
这样就明显合理多了,因此WebSocket协议有如下几个优点:
1、更小的控制开销。建立连接后,用于协议控制的数据包头部相对较小,在不扩展的情况下,只有2-10个字节。相对于HTTP请求每次都要带完整的头部,开销要小很多
2、更强的实时性,协议是双工的。客户端和服务器端都可以随时发起请求。
正因为WebSocket有这些优点,它当前被大量使用在如下领域:
1、社交聊天,如果WebSocket早一些出来,QQ和微信聊天的协议估计就是它了
2、弹幕
3、多玩家游戏
4、协同编辑,比如Google Docs,允许多人在线同时编辑相同一篇文档
5、股票基金报价
6、基于位置的应用
7、智能家居
可以看出来,需要实时性的场景都会使用WebSocket。
WebSocket vs HTTP
下图是WebSocket和HTTP协议层次模型:
从图上可以看出,HTTP和WebSocket有一些交集,我们通过下面一个典型的WebSocket握手请求来展示:
客户端请求
GET/webfin/websocket/ HTTP/1.1Host: localhostUpgrade: websocket
Connection:UpgradeSec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==Origin: http://服务器地址Sec-WebSocket-Version: 13
服务器回应
HTTP/1.1101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=
可以看出来,WebSocket建立连接是使用HTTP协议进行握手的,握手完成之后,WebSocket就和HTTP没有关系了,真正的数据传输阶段是不需要http协议参与的。
WebSocket和HTTP是独立的协议,那么为什么WebSocket协议借用了HTTP的协议来建立连接而不是自建一套独立的协议呢?
在前几年的时候,在大多数公司里,IT为了让大家安心工作,在公司的防火墙上把QQ的端口号封了,这样既解决了大家可以正常上网,但不能上网QQ聊天。如果QQ改用WebSocket来实现,WebSocket使用和HTTP相同的80端口,IT就没法限制了,除非把Web浏览也禁掉。因此WebSocket协议借用了HTTP的协议来建立连接,使用HTTP的端口号,可以绕过大多数防火墙的限制。有Web的地方,WebSocket就可以通行无阻。
浏览器的兼容性
由于WebSocket协议是在2011年最终定稿,因此一些旧款的浏览器还无法支持WebSocket,比如IE10以前的版本。下面是实现了WebSocket的浏览器(最终版本RFC6455):
Web世界日新月异,但IE的对新技术的支持总要慢一拍,所以现在IE的份额也在逐年下降。来自Net Market Share 2016年7月份的统计,Google的Chrome浏览器(48.65%)已经超越 IE(31.65%)的市场份额。这里提醒,还在用IE老版本的朋友们,赶快升级吧。
WebSocket之前
大家可能会有疑问,2011年WebSocket才最终定稿,那么之前如何实现像聊天室之类的实时应用呢?答案是:使用tcp编程。所以像QQ这样的聊天程序,腾讯需要自己开发私有的SDK来实现。如果今天开发QQ聊天程序,直接拿WebSocket来用就好了,浏览器、客户端程序、服务器程序、各种编程语言都已经开发了现成的WebSocket库函数,可以直接调用。底层的通信协议和实现细节不用再考虑了。
HTTP和WebSocket的编程对应于OSI七层协议中的第七层,而tcp编程在第三层。从编程角度来说,层次越高,编码越简单。原理类似于,程序员用c语言编程还是python编程一样,python写几句话,c可能需要写几页的程序。
总结
在web开发之前是没有保持长链接的协议,WebSocket的诞生使其从无到有,全双工、实时、高效,WebSocket迎合了实时通讯的需求。
参考