文档章节

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

ueharaai
 ueharaai
发布于 2013/08/22 08:37
字数 1246
阅读 766
收藏 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
徐汇
技术主管
从HTML5 WebSocket到Socket.io

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

Srtian
05/11
0
0
抓妹子图平台的实现,你们就是喜欢这种东西,对吧?(之四)无阻塞版本的实现

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

ueharaai
2013/08/20
0
0
基于WebSocet简单聊天室(NodeJS + node-websocket-server)

最近在学习HTML5相关的东西,看到WebSocket是个很强大的技术,于是乎就小试了一下,做了个简单的聊天室。 WebSocket的原理就不多介绍了,如果想自己实现WebSocket服务器的话具体协议看这里:...

lion_yang
2011/08/28
0
36
WebSocket 是什么原理?为什么可以实现持久连接?

作者:腾讯云技术社区 众所周知,Web应用的通信过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给客户端,客户端浏览器将信息呈现。这种机制对于信息变化不是...

xiaogong1688
06/29
0
0
【WebSocket No.3】使用WebSocket协议来做服务器

写在开始 上面一篇写了一篇使用WebSocket做客户端,然后服务端是socke代码实现的。传送门:webSocket和Socket实现聊天群发 本来我是打算写到一章上的,毕竟实现的都是一样的功能,后来想了想...

YanBigFeg
07/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 鱼生不值得

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @瘟神灬念:分享新裤子的单曲《没有理想的人不伤心 (Remix版)》: 《没有理想的人不伤心 (Remix版)》- 新裤子 手机党少年们想听歌,请使劲儿戳...

小小编辑
25分钟前
9
4
arts-week10

Algorithm 905. Sort Array By Parity - LeetCode Review Who’s Afraid of the Big Bad Preloader? 一文读懂前端缓存 一个网络请求3个步骤:请求,处理,响应,而前端缓存主要在请求处响应这两步...

yysue
今天
4
0
00.编译OpenJDK-8u40的整个过程

前言 历经2天的折腾总算把OpenJDK给编译成功了,要说为啥搞这个,还得从面试说起,最近出去面试经常被问到JVM的相关东西,总感觉自己以前学的太浅薄,所以回来就打算深入学习,目标把《深入理...

凌晨一点
今天
5
1
python: 一些关于元组的碎碎念

初始化元组的时候,尤其是元组里面只有一个元素的时候,会出现一些很蛋疼的情况: def checkContentAndType(obj): print(obj) print(type(obj))if __name__=="__main__": tu...

Oh_really
昨天
6
2
jvm crash分析工具

介绍一款非常好用的jvm crash分析工具,当jvm挂掉时,会产生hs_err_pid.log。里面记录了jvm当时的运行状态以及错误信息,但是内容量比较庞大,不好分析。所以我们要借助工具来帮我们。 Cras...

xpbob
昨天
183
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部