文档章节

抓妹子图平台的实现,你们就是喜欢这种东西,对吧?(之五)websocket分析

ueharaai
 ueharaai
发布于 2013/08/22 08:37
字数 1246
阅读 773
收藏 11

福利,三俗,喜闻乐见

接下来给程序做个前端,借此体验下html5+websocket制作应用。由于当下html5的标准貌似还在发展中,python也没给出实现,所以自己手动实现个websocket服务器,其实是个不错的学习(客户端因为用浏览器不用自己实现),所以先来了解下websocket协议。

HTML5 WebSockets Architecture

关于协议的说明可以在这里看到

http://datatracker.ietf.org/doc/rfc6455/?include_text=1

大片的英文其实只要挑前面几个说服务端处理的要点章节看就好。

看了之后了解到,要做个支持各个版本的websocket服务器绝逼不是个小工程,也不是这个项目的主要目的。所以我只focus在自己用的浏览器,能够用,就好了。在看的过程中发现协议中几点疑问和值得注意的地方,学习一下人家的设计思想,不仅了解怎么做,还了解下为什么这么做,能够给自己的工作带来一些启发。

1.payload length


websocket的frame结构



    frame-payload-length    = ( %x00-7D )
                            / ( %x7E frame-payload-length-16 )
                            / ( %x7F frame-payload-length-63 )
                            ; 7, 7+16, or 7+64 bits in length,
                            ; respectively


    frame-payload-length-16 = %x0000-FFFF ; 16 bits in length


    frame-payload-length-63 = %x0000000000000000-7FFFFFFFFFFFFFFF
                            ; 64 bits in length

根据描述palyload length的处理用python表示如下

length = (data[1])&0x7F
if length==126:
    length = struct.unpack('H',data[2:4]) #读取两个字节
elif length = 127:
    length = struct.unpack('L',data[2:6]) #读取四个字节

为什么不直接用四个字节表示长度呢?大概是为了节省,考虑到websocket应用场景,大部分传递的数据量都很小,比如传个心跳什么的,每次节省四个字节,作为将来html5标准并且广泛使用的协议,节省量是非常可观的。在自定义自己的应用协议时,可借鉴该设计。此外将关键数错开在不同的字节表示,也具备一定的迷惑性,最近本人也在开发一种加密包格式,正好可以用上:)

2.handshake-key

按照websocket的协议要求,客户端向服务器端发起连接时要在http协议头部添加一个Sec-WebSocket-Key,内容为一个base64字串,服务端收到这个字串,在后面加上一个GUID再用sha1加密再使用base64发回,由于客户端也知道这个GUID,做同样的加密然后匹配一下,就知道自己发出去的ws请求有没有正确的被处理。不过这一过程是很容易被欺骗,其目的,依我看倒不是为了安全。

考虑到websocket和http共用同一端口,一般不希望http发出的随便什么请求或扫描就建立起socket连接,如果用浏览器的话,从安全的角度考虑,一般不会允许像javascript用的xmlhttprequest随便修改header的一些域,这意味着浏览器不原生的支持websocket而仅通过页面上的应用用普通的http请求方式连接websocket是不可能的。

3.Why masking

协议中要求客户端向服务器端发送的frame中必须带有mask key,用这个key对数据进行xor加密,而且每次发送都要用一个和之前毫无关联的mask key,但我质疑这么做的必要性,因为每次都要和maskkey一起发送数据,实际上根本起不到加密作用,那是做什么用的呢?

有此疑问的不止我一个,为此还看了一些RFC的相关讨论,似乎mask主要是为了防止一种理论上潜在的被用来当成中介攻击手段,但是how?如果对代理来说,无法分辨哪一段是被mask过的中间frame,哪一段是没有被mask的起始frame,想要从里面进行插入和修改也就无从谈起了。不过这属于协议层的考虑,对应用来说似乎没太多作用。

阅读协议让我产生了一些想法,记录下来

通过在requestheader中加入特殊字段保护api
如果程序采用http通讯,而又不希望该程序使用的接口在应用之外使用的话,那么这种方法可以防止一些简单的通过提交一个表格就能得到程序结果的现象的发生。

利用http端口进行socket通讯
既然websocket已经展示了这种过程,这可能意味着在cs结构也可以突破一些企业内网封锁端口的限制进行socket通讯,而这也是websocket的目的之一。有机会试试。

自定义协议
由于websocket协议是构筑与tcp之上,并采用http握手的实现,对自定义协议有启发性。

接下来就是试做websocket服务器了。


© 著作权归作者所有

共有 人打赏支持
ueharaai
粉丝 42
博文 22
码字总数 18134
作品 0
徐汇
技术主管
私信 提问
使用 WebSockets 的 9 个应用场景

WebSockets支持及时数据交换,并被所有现代浏览器支持。请直接在你的web apps上使用它吧。 至所有我的读者:幸运的是我目前在巴西进行Scaling systems项目,享受32度的气温,吃着咸八宝饭还有...

oschina
2013/11/15
19.7K
27
使用 HTML5 WebSocket 构建实时 Web 应用

作为下一代的 Web 标准,HTML5 拥有许多引人注目的新特性,如 Canvas、本地存储、多媒体编程接口、WebSocket 等等。这其中有“Web 的 TCP ”之称的 WebSocket 格外吸引开发人员的注意。WebSo...

lyg945
2014/08/27
1K
3
【转载】使用 HTML5 WebSocket 构建实时 Web 应用

作为下一代的 Web 标准,HTML5 拥有许多引人注目的新特性,如 Canvas、本地存储、多媒体编程接口、WebSocket 等等。这其中有“Web 的 TCP ”之称的 WebSocket 格外吸引开发人员的注意。WebSo...

长平狐
2012/09/06
280
0
抓妹子图平台的实现,你们就是喜欢这种东西,对吧?(之四)无阻塞版本的实现

福利,三俗,喜闻乐见 第三天,无阻塞版本的实现,在使用线程池的基础上,添加了一些控制代码,为将来做控制台做准备,另外,禁掉了控制台的进度报告,速度飞快就上去了。 接下来要转到文章的...

ueharaai
2013/08/20
0
0
从HTML5 WebSocket到Socket.io

HTML5 WebSocket 作为新一代的web标准,HTML5为我们提供了很多有用的东西,比如canvas,本地存储(已经分离出去了),多媒体编程接口,当然还有我们的WebSocket。WebSocket是HTML5开始提供的...

Srtian
05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

性能优化(JVM概念及配置)

虚拟机组成 一次编写,到处运行 Java虚拟机是对操作系统的模拟,隔离差异 2018编程语言排行榜 一个复杂的构架 虚拟机的内部概念 运行原理 编译器,解释器执行流程 内存分配-线程模型 栈帧模型...

这很耳东先生
10分钟前
0
0
Scala之初步认识与环境准备

1. 了解 Scala 1.1. 什么是 Scala Scala 是 Scalable Language 的简写,是一门多范式的编程语言。 Scala设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚...

飞鱼说编程
31分钟前
4
0
Vue项目分环境打包的实现步骤

在项目开发中,我们的项目一般分为开发版、测试版、Pre版、Prod版。Vue-cli的默认环境一只有dev和prod两个,之前每次要发布测试版或Pre版都是修改了源码中API地址后打包,这样很麻烦。如果能...

peakedness丶
32分钟前
3
0
vue+lowdb+express

搭建流程: 1.安装Node.js; 2.安装npm; 3.安装Express; 搭建流程 npm install -g express 安装 express 生成器 npm install -g express-generator 查看是否安装成功,随便输的一个命令...

Js_Mei
37分钟前
2
0
Qt那些事0.0.15

以下与Q_DECLARE_METATYPE相关内容全部是翻译自Qt文档。参看QVariant Class | Qt Core 5.9以及QMetaType Class | Qt Core 5.9 QVariant QVariant::fromValue(const T& value) 返回一份包含v......

Ev4n
38分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部