WebSocket不是HTTP协议,是基于http协议,HTTP只负责建立WebSocket连接,WebSocket连接相对于http 来说是一个长连接,解决了只能被动响应的问题。

基本概念

WebSocket是html5提供的一种在单个tcp连接上进行全双工通信的协议

http协议有以下弊端:

  • 一条连接上只可以发送一条请求
  • 请求只能从客户端开始,客户端不可用接受除响应以外的指令
  • 首部信息没有压缩,延迟大
  • 每次请求都要发送冗长的首部信息
  • 可任意选择压缩格式,没有强制压缩

websocket协议为解决这些弊端而生。所以websocket的特点

  • 支持服务器向客户端推送数据的功能。服务器可直接发送数据,不用等待客户端请求
  • 减少通信量:只要建立连接,就一直保持连接状态。不仅连接开销小,且首部信息很少,减少通信量

websocket通信机制

  • 在http建立连接后,需要完成一次“握手”步骤
  • 附加头信息中添加”Upgrade: WebSocket”,表明这是一个申请协议升级的 HTTP 请求
  • Sec-WebSocket-Key:记录握手过程中的键值
  • Sec-WebSocket-Protocol:记录使用的子协议

我简单看一下websocket的报文

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

1、Upgrade: websocket,Connection: Upgrade

这个就是Websocket的核心了,告诉Apache、Nginx等服务器:注意啦,窝发起的是Websocket协议,快点帮我找到对应的助理处理~不是那个老土的HTTP。

2、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

http与websocket

1、HTTP的生命周期通过Request来界定,也就是一个Request 一个Response,那么在HTTP1.0中,这次HTTP请求就结束了。

2、在HTTP1.1中进行了改进,使得有一个keep-alive,也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response。但是请记住 Request = Response , 在HTTP中永远是这样,也就是说一个request只能有一个response。而且这个response也是被动的,不能主动发起。

3、Websocket只需要一次HTTP握手,所以说整个通讯过程是建立在一次连接/状态中,也就避免了HTTP的非状态性,服务端会一直知道你的信息,直到你关闭请求,这样就解决了接线员要反复解析HTTP协议,还要查看identity info的信息。同时由客户主动询问,转换为服务器(推送)有信息的时候就发送(当然客户端还是等主动发送信息过来的。。),没有信息的时候就交给接线员(Nginx),不需要占用本身速度就慢的客服(Handler)了