登峰造极境

  • WIN
    • CSharp
    • JAVA
    • OAM
    • DirectX
    • Emgucv
  • UNIX
    • FFmpeg
    • QT
    • Python
    • Opencv
    • Openwrt
    • Twisted
    • Design Patterns
    • Mysql
    • Mycat
    • MariaDB
    • Make
    • OAM
    • Supervisor
    • Nginx
    • KVM
    • Docker
    • OpenStack
  • WEB
    • ASP
    • Node.js
    • PHP
    • Directadmin
    • Openssl
    • Regex
  • APP
    • Android
  • AI
    • Algorithm
    • Deep Learning
    • Machine Learning
  • IOT
    • Device
    • MSP430
  • DIY
    • Algorithm
    • Design Patterns
    • MATH
    • X98 AIR 3G
    • Tucao
    • fun
  • LIFE
    • 美食
    • 关于我
  • LINKS
  • ME
Claves
长风破浪会有时,直挂云帆济沧海
  1. 首页
  2. Platforms
  3. WEB
  4. OAM
  5. 正文

Websocket协议的浅入解析-迷惑笔记

2016-04-30

一、简析

WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成握手。

二、WebSocket和HTTP的关系

6651f2f811ec133b0e6d7e6d0e194b4c_b

 

HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为一个,但是Websocket其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是HTTP协议上的一种补充可以通过上图理解。

Http协议本身只有1.0和1.1,而且跟Html本身没有直接关系。。

 

三、WebSocket特点

1、HTTP简析

HTTP是一种非持久化连接,生命周期通过request和response来界定,且request=response。

2、WebSocket

WebSocket是持久化协议。

四、WebSocket握手过程:

Web客户端,请求HTTP Header信息:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket            # WebSocket 协议添加
Connection: Upgrade            # WebSocket 协议添加
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==             # Base64 encode的值,这个是浏览器随机生成的,验证服务器是否支持WebSocket
Sec-WebSocket-Protocol: chat, superchat               # 用户定义的字符串,用来区分同URL下,不同的服务所需要的协议
Sec-WebSocket-Version: 13                              #告诉服务器所使用的协议版本
Origin: http://example.com

Web服务端响应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket             #通知客户端,服务端已经切换协议
Connection: Upgrade            #通知客户端,服务端已经切换协议
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=   #经服务器确认,且加密的Sec-WebSocket-Key
Sec-WebSocket-Protocol: chat

五、WebSocket数据包分析

WebScoket协议中,数据以帧序列的形式传输。考虑到数据安全性,客户端向服务器传输的数据帧必须进行掩码处理。服务器若接收到未经过掩码处理的数据帧,则必须主动关闭连接。
服务器向客户端传输的数据帧一定不能进行掩码处理。客户端若接收到经过掩码处理的数据帧,则必须主动关闭连接。
针对上情况,发现错误的一方可向对方发送close帧(状态码是1002,表示协议错误),以关闭连接。

帧协议:

20150506112726561

六、WebSocket消息分片

分片目的是发送长度未知的消息。如果不分片发送,即一帧,就需要缓存整个消息,计算其长度,构建frame并发送;使用分片的话,可使用一个大小合适的buffer,用消息内容填充buffer,填满即发送出去。

 

 

附加:

1、Websocket和Node.js内Socket.io的关系

 

Socket.IO封装了Websocket,同时包含了其它的连接方式,比如Ajax。

原因:在于不是所有的浏览器都支持websocket,通过socket.io的封装,你不用关心里面用了什么连接方式。你在任何浏览器里都可以使用socket.io来建立异步的连接。socket.io包含了服务端和客户端的库,如果在浏览器中使用了socket.io的js,服务端也必须同样适用。如果你很清楚你需要的就是websocket,那可以直接使用websocket。

2、目前支持WebSocket的浏览器

Hixie 75/76:
Chrome 4.0
Safari 5.0.2
iOS 4.2
Firefox 4.0
Opera 11
HyBi-07+:
Chrome 14.0
Firefox 6.0
IE9, IE10
Hybi-10:
Chrome 14
Firefox 7
IE 10

3、目前支持WebSocket的服务器开发语言

基本上都可以

 

参考链接:

https://www.zhihu.com/question/20215561/answer/40316953

http://www.cnblogs.com/caosiyang/archive/2012/08/14/2637721.html

标签: 暂无
最后更新:2017-06-21

代号山岳

知之为知之 不知为不知

点赞
下一篇 >

COPYRIGHT © 2099 登峰造极境. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

蜀ICP备14031139号-5

川公网安备51012202000587号