文档章节

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

ueharaai
 ueharaai
发布于 2013/08/22 08:37
字数 1246
阅读 762
收藏 11
点赞 0
评论 0

福利,三俗,喜闻乐见

接下来给程序做个前端,借此体验下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
博文 19
码字总数 18134
作品 0
徐汇
技术主管
从HTML5 WebSocket到Socket.io

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

Srtian ⋅ 05/11 ⋅ 0

WebSocket的C++服务器端实现

由于需要在项目中增加Websocket协议,与客户端进行通信,不想使用开源的库,比如WebSocketPP,就自己根据WebSocket协议实现一套函数,完全使用C++实现。 代码已经实现,放在个人github上面,...

xumaojun ⋅ 04/25 ⋅ 0

JavaScript 工作原理之五-深入理解 WebSockets 和带有 SSE 机制的HTTP/2 以及正确的使用姿势(译)

原文请查阅这里,略有改动,本文采用知识共享署名 3.0 中国大陆许可协议共享,BY Troland。 本系列持续更新中,Github 地址请查阅这里。 这是 JavaScript 工作原理的第五章。 现在,我们将会...

tristan ⋅ 05/11 ⋅ 0

微信小程序WebSocket开发

微信小程序WebSocket开发 让我们来实现一个简单的微信小程序WebSocket。WebSocket是一种没有被规范化的网络协议,不过网络上又有文章说是2011年被国际化。不过不管怎么样它摆脱了Http的无状态...

王And木 ⋅ 05/31 ⋅ 0

websocket实现用户双方通信

本文介绍一下websocket的用法,可能介绍的不够专业,所有请见谅了。websocket可以是纯Java实现,也可以整合Maven工程SSM框架实现,前端都是html或jsp的网页进行websocket使用与实现。 我把两...

qq_38047600 ⋅ 04/20 ⋅ 0

各类“服务器推”技术原理与实例(Polling/COMET/SSE/WebSocket)

前言 服务器推(Server Push)是一类特定技术的总称。一般情况,客户端与服务器的交互方式是:客户端发起请求,服务器收到请求返回响应结果,客户端接收响应结果进行处理。从上述的交互过程中...

AlienZHOU ⋅ 06/08 ⋅ 0

HTML5 WebSocket JavaWeb 实现简单的聊天室功能

本实例使用websocket实现了即时聊天系统,websocket技术可以在网页中使用js技术完成与后台的通讯, 而后台tomcat集成了websocket功能, 只需要很少的代码就可以完成很强大的功能, 基于此聊天系...

智慧点点 ⋅ 04/23 ⋅ 0

Socket/WebSocket应用及IM粘包 分包等

> Socket/WebSocket应用 WebSocket的frame?google的protobuf在IM中的使用? IM、金融、股价、视频会议等这样一些应用来说,所需要的不过是高实时、低延时。比较好的可选方案呢?比较流行的是...

shareus ⋅ 04/28 ⋅ 0

springboot在jetty+websocket的环境下的junit测试失败

这个问题描述起来可能还比较长。 首先我在springboot中选择了jetty作为服务器,然后现在我希望使用jetty的websocket功能,因此边加了jetty的websocket包。按照网上的教程,只要注意把tomcat的...

kuma_ller ⋅ 05/27 ⋅ 0

Spring实践--Websocket集成和XML配置

WebSocket 简介 WebSocket 是 HTML5 一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯,它建立在 TCP 之上,同 HTTP 一样通过 TCP 来传输数据,...

spinachgit ⋅ 05/03 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 11分钟前 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 13分钟前 ⋅ 0

容器之查看minikue的environment——minikube的环境信息

执行如下命令 mjduan@mjduandeMacBook-Pro:~/Docker % minikube docker-envexport DOCKER_TLS_VERIFY="1"export DOCKER_HOST="tcp://192.168.99.100:2376"export DOCKER_CERT_PATH="/U......

汉斯-冯-拉特 ⋅ 14分钟前 ⋅ 0

mysql远程连接不上

设置了root所有hosts远程登录,可是远程登录还是失败,原因可能如下: 登录本地数据库 mysql -uroot -p123456 查询用户表 mysql> select user,host,password from mysql.user; 删除密码为空的...

冰公子 ⋅ 14分钟前 ⋅ 0

动态规划小题

凑硬币问题 问题: 有1元、3元、5元面值的硬币若干,要凑到11元需要最少几个硬币? 这是最简单的DP问题,记凑a元需要b个硬币为: n[a] = b。 1)首先,如果凑0元 需要0个硬币表示为 n[0] = 0...

阿豪boy ⋅ 16分钟前 ⋅ 0

shell之切换目录命令cd

让我们来看看linux下简单的 cd 命令,就是切换目录用的,在你当前的目录位置,进入下一个目录 让我们看看这个阿里云 ubuntu 目录,Linux虚拟目录中比较复杂的部分是它如何协调管理各个存储设...

woshixin ⋅ 19分钟前 ⋅ 0

使用 jsoup 模拟登录 urp 教务系统

需要的 jsoup 相关 jar包:https://www.lanzous.com/i1abckj 1、首先打开教务系统的登录页面,F12 开启浏览器调试,注意一下 Request Headers 一栏的 Cookie 选项,我们一会需要拿这个 Cook...

大灰狼时间 ⋅ 54分钟前 ⋅ 0

关于线程的创建

转自自己的笔记: http://note.youdao.com/noteshare?id=87584d4874acdeaf4aa027bdc9cb7324&sub=B49E8956E145476191C3FD1E4AB40DFA 1.创建线程的方法 Java使用Thread类代表线程,所有的线程对......

MarinJ_Shao ⋅ 今天 ⋅ 0

工厂模式学习

1. 参考资料 工厂模式-伯乐在线 三种工厂-思否 深入理解工厂模式 2. 知识点理解 2.1 java三种工厂 简单工厂 工厂模式 抽象工厂 2.2 异同点 逐级复杂 简单工厂通过构造时传入的标识来生产产品...

liuyan_lc ⋅ 今天 ⋅ 0

Java NIO

1.目录 Java IO的历史 Java NIO之Channel Java NIO之Buffer Java NIO之Selector Java NIO之文件处理 Java NIO之Charset Java 可扩展IO 2.简介 “IO的历史”讲述了Java IO API从开始到现在的发...

士别三日 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部