转载自我的博客,转载请声明,走啊走的记录:WebSocket 原理html
之前的网站为了实现推送功能,使用的方法都是轮询。所谓的轮询就是在特定的时间间隔(例如1秒),由浏览器向服务器发出一个 Http request
,而后服务器返回最新的数据给客户端浏览器,从而给出一种服务端实时推送的假象。因为Http Request
的Header
(请求头)很长,而传输的数据可能很短就只占一点点,每次请求消耗的带宽大部分都消耗在 Header
上。从网上资料得知后来还有改进的轮询方法叫作 Comet
,使用 Ajax
。但这种技术虽然可达到双向通讯,但依然须要发出请求,并且在Comet中,广泛采用了长连接,这也会大量消耗服务器带宽和资源。git
因此HTML5定义了 WebSocket
协议,以及相关的编程API,能更好的实现双向通讯且节省服务器资源和带宽。github
注意:
WebSocket
实际上指的是一种协议,与咱们熟知的Http
协议是同等的一个网络协议。用网络模型结构来解释的话,WebSocket
和Http
协议都属于应用层协议
,二者都基于传输层协议TCP
。web
Html5是指的一系列新的API,或者说新规范,新技术。在这个新规范中定义了一个为了实现双向实时通讯的新协议 WebSocket
,而且提供了一套 JavaScript API 供开发者来调用实现通讯。服务器端的实现由诸如:Tomcat、Jetty等等。编程
简单归纳来看: WebSocket
不是 Http
协议, Http
协议只是被 WebSocket
使用来创建 WebSocket
链接,链接创建了之后客户端与服务器的双向通讯就与 Http
无关了。浏览器
WebSocket
协议和 HTTP
协议是两种不一样的东西,它们的联系以下:服务器
客户端开始创建 WebSocket 链接时要发送一个 header 标记了 Upgrade 的 HTTP 请求,表示请求协议升级。因此服务器端作出响应的简便方法是,直接在现有的 HTTP 服务器软件和现有的端口上实现 WebSocket 协议,重用现有代码(好比解析和认证这个 HTTP 请求。若是在 TCP 协议上实现,这两个功能就要从新实现),而后再回一个状态码为 101 的 HTTP 响应完成握手,再日后发送数据时就没 HTTP 的事了。websocket
做者:长天之云
连接:https://www.zhihu.com/question/20215561/answer/14365823
来源:知乎
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处.网络
下面给出发出创建链接请求时的 request
和 response
。socket
注意:下面的请求报文与响应报文中的内容不是完整的报文,而是 WebSocket
基于 Http
请求(响应)报文添加的内容。
浏览器请求
GET / HTTP/1.1 Upgrade: websocket Connection: Upgrade Host: example.com Origin: null Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ== Sec-WebSocket-Version: 13
服务器回应
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s= Sec-WebSocket-Origin: null Sec-WebSocket-Location: ws://example.com/