webSocket简单介绍

关于HTML5 WebSocket(官网翻译)

  HTML5 WebSockets规范定义了一个API,使Web页面能够使用WebSockets协议与远程主机进行双向通信。它介绍了WebSocket接口,并定义了通过Web上的单个插槽

进行操作的全双工通信通道。与用于通过维护两个连接来模拟全双工连接的不可扩展轮询和长轮询解决方案相比,HTML5 WebSockets大大减少了不必要的网络流量和延迟。

HTML5 WebSockets解决了诸如代理和防火墙等网络危害,可以通过任何连接进行流式传输,并且通过单一连接支持上游和下游通信的能力,基于HTML5 WebSockets的

应用程序对服务器的负担降低,从而允许现有的机器支持更多的并发连接。下图显示了基本的基于WebSocket的架构,其中浏览器使用WebSocket连接进行全双工,与远程主机的直接通信。

  WebSockets提供的更独特的功能之一就是能够遍历防火墙和代理,这是许多应用程序的问题。彗星式应用程序通常采用长时间轮询作为防火墙和代理的基本防御。该技术是

有效的,但不太适用于具有低于500毫秒延迟或高吞吐量要求的应用。基于插件的技术,如Adobe Flash,还提供了一定程度的套接字支持,但长期以来,WebSockets现在解决

的代理和防火墙遍历问题长期以来都受到重视。

  WebSocket检测代理服务器的存在,并自动设置通过代理的隧道。通过向代理服务器发出HTTP CONNECT语句建立隧道,代理服务器要求代理服务器打开到特定主机和端口

的TCP / IP连接。一旦隧道建立起来,通信可以通过代理不受阻碍地流通。由于HTTP / S以类似的方式工作,SSL上的安全WebSockets可以利用相同的HTTP CONNECT技术。

请注意,WebSockets刚刚开始得到现代浏览器的支持(Chrome现在本地支持WebSockets)。然而,向后兼容的实现使得当今的浏览器能够利用这种新兴技术。像“本地存储”

和“地理位置”这样的HTML5工作的WebSockets就像其他的HTML5工具一样,原本是HTML5规范的一部分,但被转移到单独的标准文档中,以保持规范的重点。WebSockets由

其创作者Web超文本应用技术工作组(WHATWG)提交给互联网工程任务组(IETF)。参与标准化的作者,传道者和公司仍然将原始的功能集(包括WebSockets)称为“HTML5”。

WebSocket协议

  WebSocket协议旨在与现有的Web基础设施配合使用。作为此设计原则的一部分,协议规范定义了WebSocket连接开始其HTTP连接的生命,保证与WebSocket之前的前端完全兼容。

从HTTP到WebSocket的协议切换被称为WebSocket握手。

浏览器向服务器发送请求,指示它要将协议从HTTP切换到WebSocket。客户端通过升级标头来表达欲望。

 

前辈解释

  一、WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)

首先HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为一个,但是Websocket其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,

也就是说它是HTTP协议上的一种补充可以通过这样一张图理解

 

有交集,但是并不是全部。
另外Html5是指的一系列新的API,或者说新规范,新技术。Http协议本身只有1.0和1.1,而且跟Html本身没有直接关系。。通俗来说,你可以用HTTP协议传输非Html数据,再简单来说,层级不一样

  二、Websocket是什么样的协议,具体有什么优点
首先,Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说。
简单的举个例子吧,用目前应用比较广泛的PHP生命周期来解释。
HTTP的生命周期通过Request来界定,也就是一个Request 一个Response,那么HTTP1.0,这次HTTP请求就结束了。
在HTTP1.1中进行了改进,使得有一个keep-alive,也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response。
但是请记住 Request = Response , 在HTTP中永远是这样,也就是说一个request只能有一个response。而且这个response也是被动的,不能主动发起。


首先Websocket是基于HTTP协议的,或者说借用了HTTP的协议来完成一部分握手。
在握手阶段是一样的:
首先我们来看个典型的Websocket握手(借用Wikipedia的。。)
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
熟悉HTTP的人可能发现了,这段类似HTTP协议的握手请求中,多了几个东西
Upgrade: websocket
Connection: Upgrade

 

这个就是Websocket的核心了,告诉Apache、Nginx等服务器:发起的是WebSocket协议,选择对应处理方式处理, 而不是用HTTP .
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

 

首先,Sec-WebSocket-Key 是一个Base64 encode的值,这个是浏览器随机生成的,用来验证服务器是不是支持webSocket
然后,Sec_WebSocket-Protocol 是一个用户定义的字符串,用来区分同URL下,不同的服务所需要的协议。
最后,Sec-WebSocket-Version 是告诉服务器所使用的Websocket Draft(协议版本),在最初的时候,Websocket协议还在 Draft 阶段,各种奇奇怪怪的协议都有,而且还有很多期奇奇怪怪不同的东西,
什么Firefox和Chrome用的不是一个版本之类的 然后服务器会返回下列东西,表示已经接受到请求成功建立Websocket.
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
这里开始就是HTTP最后负责的区域了,告诉客户,我已经成功切换协议了。
Upgrade: websocket
Connection: Upgrade

 

依然是固定的,告诉客户端即将升级的是Websocket协议,而不是mozillasocket,lurnarsocket或者shitsocket。
然后,Sec-WebSocket-Accept 这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key。服务器:好啦好啦,知道啦,给你看我的ID CARD来证明行了吧。。
后面的,Sec-WebSocket-Protocol 则是表示最终使用的协议。

至此,HTTP已经完成它所有工作了,接下来就是完全按照Websocket协议进行了。

 

 

webSocket官网:http://www.websocket.org

摘自:https://www.zhihu.com/question/20215561

其他资料:http://www.cnblogs.com/wei2yi/archive/2011/03/23/1992830.html

webSocket握手原理:http://blog.csdn.net/edwingu/article/details/44040961

           http://blog.csdn.net/yinqingwang/article/details/52565133

 

posted @ 2017-04-01 16:47  戏子诺  阅读(275)  评论(0)    收藏  举报