一, websocket 与 http
WebSocket 是 html5 出的东西 (协议), 也就是说 HTTP 协议没有变化, 或者说没关系, 但 HTTP 是不支持持久连接的 (长连接, 循环连接的不算)
首先 HTTP 有 1.1 和 1.0 之说, 也就是所谓的 keep-alive , 把多个 HTTP 请求合并为一个, 但是 Websocket 其实是一个新协议, 跟 HTTP 协议基本没有关系, 只是为了兼容现有浏览器的握手规范而已, 也就是说它是 HTTP 协议上的一种补充可以通过这样一张图理解
image
有交集, 但是并不是全部.
另外 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 也是被动的, 不能主动发起.
教练, 你 BB 了这么多, 跟 Websocket 有什么关系呢?(:з」∠) 好吧, 我正准备说 Websocket 呢..
首先 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 下, 不同的服务所需要的协议. 简单理解: 今晚我要服务 A, 别搞错啦~
最后, Sec-WebSocket-Version 是告诉服务器所使用的 Websocket Draft(协议版本), 在最初的时候, Websocket 协议还在 Draft 阶段, 各种奇奇怪怪的协议都有, 而且还有很多期奇奇怪怪不同的东西, 什么 Firefox 和 Chrome 用的不是一个版本之类的, 当初 Websocket 协议太多可是一个大难题.. 不过现在还好, 已经定下来啦大家都使用的一个东西 脱水: 服务员, 我要的是 13 岁的噢→_→
然后服务器会返回下列东西, 表示已经接受到请求, 成功建立 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 协议进行了. 具体的协议就不在这阐述了.
来源: http://www.jianshu.com/p/464c62458cae