竹磬网-邵珠庆の日记 生命只有一次,你可以用它来做些更多伟大的事情–Make the world a little better and easier


89月/190

【喜欢就拿走系列-09】中台架构方案

发布在 邵珠庆

28月/170

介绍一下GFW的工作原理和封锁技术

发布在 邵珠庆

GFW是Great Fire Wall的缩写,即“长城防火墙”。这个工程由若干个部分组成,实现不同功能。长城防火墙主要指TG监控和过滤互联网内容的软硬件系统,由服务器和路由器等设备,加上相关的应用程序所构成。

首先,需要强调的是,由于中国网络审查广泛,中国国内含有“不合适”内容的的网站,会受到政府直接的行政干预,被要求自我审查、自我监管,乃至关闭,所以GFW的主要作用在于分析和过滤中国境内外网络的资讯互相访问。

GFW对网络内容的过滤和分析是双向的,GFW不仅针对国内读者访问中国境外的网站进行干扰,也干扰国外读者访问主机在中国大陆的网站。

一 关键字过滤阻断

关键字过滤系统。此系统能够从出口网关收集分析信息,过滤、嗅探指定的关键字。主要针对HTTP的默认端口:80端口,因为HTTP传播的内容是明文的内容,没有经过加密,而GFW是一个IDS(Intrusion detection system)。普通的关键词如果出现在HTTP请求报文的头部(如“Host: www.youtube.com”)时,则会马上伪装成对方向连接两端的计算机发送RST包(reset)干扰两者正常的TCP连接,进而使请求的内容无法继续查看。如果GFW在数据流中发现了特殊的内文关键词(如轮子,达赖等)时,其也会试图打断当前的连接,从而有时会出现网页开启一部分后突然停止的情况。在任何阻断发生后,一般在随后的90秒内同一IP地址均无法浏览对应IP地址相同端口上的内容。

二 IP地址封锁

IP地址封锁是GFW通过路由器来控制的,在通往国外的最后一个网关上加上一条伪造的路由规则,导致通往某些被屏蔽的网站的所有IP数据包无法到达。路由器的正常工作方式是学习别的路由器广播的路由规则,遇到符合已知的IP转发规则的数据包,则按已经规则发送,遇到未知规则IP的数据,则转发到上一级网关。

而GFW对于境外(中国大陆以外)的XX网站会采取独立IP封锁技术。然而部分XX网站使用的是由虚拟主机服务提供商提供的多域名、单(同)IP的主机托管服务,这就会造成了封禁某个IP地址,就会造成所有使用该服务提供商服务的其它使用相同IP地址服务器的网站用户一同遭殃,就算是正常的网站,也不能幸免。其中的内容可能并无不当之处,但也不能在中国大陆正常访问。现在GFW通常会将包含XX信息的网站或网页的URL加入关键字过滤系统,并可以防止民众透过普通海外HTTP代理服务器进行访问。

三 特定端口封锁

GFW会丢弃特定IP地址上特定端口的所有数据包,使该IP地址上服务器的部分功能(如SSH的22、VPN的1723或SSL的443端口等)无法在中国大陆境内正常使用。

在中国移动、中国联通等部分ISP(手机IP段),所有的PPTP类型的VPN都被封锁。

2011年3月起,GFW开始对Google部分服务器的IP地址实施自动封锁(按时间段)某些端口,按时段对www.google.com(用户登录所有Google服务时需此域名加密验证)和mail.google.com的几十个IP地址的443端口实施自动封锁,具体是每10或15分钟可以连通,接着断开,10或15分钟后再连通,再断开,如此循环,令中国大陆用户和Google主机之间的连接出现间歇性中断,使其各项服务出现问题。GFW这样的封锁手法很高明,因为Gmail并非被完全阻断,这令问题看上去好像出自Google本身。这就是你们认为Google抽风的原因。

四 SSL连接阻断

GFW会阻断特定网站的SSL加密连接,方法是通过伪装成对方向连接两端的计算机发送RST包(RESET)干扰两者间正常的TCP连接,进而打断与特定IP地址之间的SSL(HTTPS,443端口)握手(如Gmail、Google文件、Google网上论坛等的SSL加密连接),从而导致SSL连接失败。

当然由于SSL本身的特点,这并不意味着与网站传输的内容可被破译。

五 DNS劫持和污染

GFW主要采用DNS劫持和污染技术,使用Cisco提供的IDS系统来进行域名劫持,防止访问被过滤的网站,2002年Google被封锁期间其域名就被劫持到百度。中国部分ISP也会通过此技术插入广告。

对于含有多个IP地址或经常变更IP地址逃避封锁的域名,GFW通常会使用此方法进行封锁。具体方法是当用户向DNS服务器提交域名请求时,DNS返回虚假(或不解析)的IP地址。

全球一共有13组根域名服务器(Root Server),目前中国大陆有F、I这2个根域DNS镜像,但现在均已因为多次DNS污染外国网络,而被断开与国际互联网的连接。

DNS劫持和污染是针对某些网站的最严重的干扰。

干扰的方式有两种:

一种是通过网络服务提供商(Internet Service Provider)提供的DNS服务器进行DNS欺骗,当人们访问某个网站时,需要要把域名转换为一个IP地址,DNS服务器负责将域名转换为IP地址,中国大陆的ISP接受通信管理局的屏蔽网站的指令后在DNS服务器里加入某些特定域名的虚假记录,当使用此DNS服务器的网络用户访问此特定网站时,DNS服务便给出虚假的IP地址,导致访问网站失败,甚至返回ISP运营商提供的出错页面和广告页面。

另一种是GFW在DNS查询使用的UDP的53端口上根据blacklist进行过滤,遇到通往国外的使用UDP53端口进行查询的DNS请求,就返回一个虚假的IP地址。

107月/170

Web领域的实时推送技术

发布在 邵珠庆

作者:潘良虎
链接:https://www.zhihu.com/question/20215561/answer/26419995
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Web领域的实时推送技术,也被称作Realtime技术。这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新。它有着广泛的应用场景,比如在线聊天室、在线客服系统、评论系统、WebIM等。

WebSocket简介

谈到Web实时推送,就不得不说WebSocket。在WebSocket出现之前,很多网站为了实现实时推送技术,通常采用的方案是轮询(Polling)和Comet技术,Comet又可细分为两种实现方式,一种是长轮询机制,一种称为流技术,这两种方式实际上是对轮询技术的改进,这些方案带来很明显的缺点,需要由浏览器对服务器发出HTTP request,大量消耗服务器带宽和资源。面对这种状况,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并实现真正意义上的实时推送。
WebSocket协议本质上是一个基于TCP的协议,它由通信协议和编程API组成,WebSocket能够在浏览器和服务器之间建立双向连接,以基于事件的方式,赋予浏览器实时通信能力。既然是双向通信,就意味着服务器端和客户端可以同时发送并响应请求,而不再像HTTP的请求和响应。
为了建立一个WebSocket连接,客户端浏览器首先要向服务器发起一个HTTP请求,这个请求和通常的HTTP请求不同,包含了一些附加头信息,其中附加头信息”Upgrade: WebSocket”表明这是一个申请协议升级的HTTP请求,服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的WebSocket连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接。
一个典型WebSocket客户端请求头:


前面讲到WebSocket是HTML5中新增的一种通信协议,这意味着一部分老版本浏览器(主要是IE10以下版本)并不具备这个功能, 通过百度统计的公开数据显示,IE8目前仍以33%的市场份额占据榜首,好在chrome浏览器市场份额逐年上升,现在以超过26%的市场份额位居第二,同时微软前不久宣布停止对IE6的技术支持并提示用户更新到新版本浏览器,这个曾经让无数前端工程师为之头疼的浏览器有望退出历史舞台,再加上几乎所有的智能手机浏览器都支持HTML5,所以使得WebSocket的实战意义大增,但是无论如何,我们实际的项目中,仍然要考虑低版本浏览器的兼容方案:在支持WebSocket的浏览器中采用新技术,而在不支持WebSocket的浏览器里启用Comet来接收发送消息。
WebSocket实战本文将以多人在线聊天应用作为实例场景,我们先来确定这个聊天应用的基本需求。
需求分析1、兼容不支持WebSocket的低版本浏览器。
2、允许客户端有相同的用户名。
3、进入聊天室后可以看到当前在线的用户和在线人数。
4、用户上线或退出,所有在线的客户端应该实时更新。
5、用户发送消息,所有客户端实时收取。

在实际的开发过程中,为了使用WebSocket接口构建Web应用,我们首先需要构建一个实现了 WebSocket规范的服务端,服务端的实现不受平台和开发语言的限制,只需要遵从WebSocket规范即可,目前已经出现了一些比较成熟的WebSocket服务端实现,比如本文使用的Node.js+Socket.IO。为什么选用这个方案呢?先来简单介绍下他们两。
Node.jsNode.js采用C++语言编写而成,它不是Javascript应用,而是一个Javascript的运行环境,据Node.js创始人Ryan Dahl回忆,他最初希望采用Ruby来写Node.js,但是后来发现Ruby虚拟机的性能不能满足他的要求,后来他尝试采用V8引擎,所以选择了C++语言。
Node.js支持的系统包括*nux、Windows,这意味着程序员可以编写系统级或者服务器端的Javascript代码,交给Node.js来解释执行。Node.js的Web开发框架Express,可以帮助程序员快速建立web站点,从2009年诞生至今,Node.js的成长的速度有目共睹,其发展前景获得了技术社区的充分肯定。
Socket.IOSocket.IO是一个开源的WebSocket库,它通过Node.js实现WebSocket服务端,同时也提供客户端JS库。Socket.IO支持以事件为基础的实时双向通讯,它可以工作在任何平台、浏览器或移动设备。
Socket.IO支持4种协议:WebSocket、htmlfile、xhr-polling、jsonp-polling,它会自动根据浏览器选择适合的通讯方式,从而让开发者可以聚焦到功能的实现而不是平台的兼容性,同时Socket.IO具有不错的稳定性和性能。
编码实现

本文一开始的的插图就是效果演示图:可以点击这里查看在线演示,整个开发过程非常简单,下面简单记录了开发步骤:
安装Node.js根据自己的操作系统,去Node.js官网下载安装即可。如果成功安装。在命令行输入node -v和npm -v应该能看到相应的版本号。


搭建WebSocket服务端

这个环节我们尽可能的考虑真实生产环境,把WebSocket后端服务搭建成一个线上可以用域名访问的服务,如果你是在本地开发环境,可以换成本地ip地址,或者使用一个虚拟域名指向本地ip。
先进入到你的工作目录,比如 /workspace/wwwroot/plhwin/realtime.plhwin.com,新建一个名为package.json的文件,内容如下:


接下来使用npm命令安装express和socket.io


安装成功后,应该可以看到工作目录下生成了一个名为node_modules的文件夹,里面分别是express和socket.io,接下来可以开始编写服务端的代码了,新建一个文件:index.js


命令行运行node index.js,如果一切顺利,你应该会看到返回的listening on *:3000字样,这说明服务已经成功搭建了。此时浏览器中打开 localhost:3000 应该可以看到正常的欢迎页面。
如果你想要让服务运行在线上服务器,并且可以通过域名访问的话,可以使用Nginx做代理,在nginx.conf中添加如下配置,然后将域名(比如:realtime.plhwin.com)解析到服务器IP即可。


完成以上步骤,realtime.plhwin.com:3000的后端服务就正常搭建了。


服务端代码实现前面讲到的index.js运行在服务端,之前的代码只是一个简单的WebServer欢迎内容,让我们把WebSocket服务端完整的实现代码加入进去,整个服务端就可以处理客户端的请求了。完整的index.js代码如下:


客户端代码实现进入客户端工作目录/workspace/wwwroot/plhwin/demo.plhwin.com/chat,新建一个index.html:

上面的html内容本身没有什么好说的,我们主要看看里面的4个文件请求:
1、realtime.plhwin.com:3000
2、style.css
3、json3.min.js
4、client.js
第1个JS是Socket.IO提供的客户端JS文件,在前面安装服务端的步骤中,当npm安装完socket.io并搭建起WebServer后,这个JS文件就可以正常访问了。

第2个style.css文件没什么好说的,就是样式文件而已。

第3个JS只在IE8以下版本的IE浏览器中加载,目的是让这些低版本的IE浏览器也能处理json,这是一个开源的JS,详见:JSON 3

第4个client.js是完整的客户端的业务逻辑实现代码,它的内容如下:


至此所有的编码开发工作全部完成了,在浏览器中打开 demo.plhwin.com/chat/ 就可以看到效果了。

上面所有的客户端和服务端的代码可以从Github上获得,地址:github.com/plhwin/nodej

下载本地后有两个文件夹 client 和 server,client文件夹是客户端源码,可以放在Nginx/Apache的WebServer中,也可以放在Node.js的WebServer中。后面的server文件夹里的代码是websocket服务端代码,放在Node.js环境中,使用npm安装完 express 和 socket.io 后,node index.js 启动后端服务就可以了。
留给我们的思考

1、假设是一个在线客服系统,里面有许多的公司使用你的服务,每个公司自己的用户可以通过一个专属URL地址进入该公司的聊天室,聊天是一对一的,每个公司可以新建多个客服人员,每个客服人员可以同时和客户端的多个用户聊天。
2、又假设是一个在线WebIM系统,实现类似微信,qq的功能,客户端可以看到好友在线状态,在线列表,添加好友,删除好友,新建群组等,消息的发送除了支持基本的文字外,还能支持表情、图片和文件。
有兴趣的同学可以继续深入研究。
--------------------------
上面是我前段时间写的一篇与WebSocket这个主题相关的文档,就直接贴过来了,原文请见:使用Node.js+Socket.IO搭建WebSocket实时应用

246月/150

缔元信:用户画像技术助推大数据落地

发布在 邵珠庆

dratio-dmp-data[原文:IT专家网] 企业要如何快速地从大数据的发展中获益?日前,北京缔元信互联网数据技术有限公司(以下简称“缔元信”)产品副总裁、曾长期担任新浪网数据分析部总监的牛程先生做客IT专家网《专家会客室》,分享了他心目中的企业释放大数据潜能的最佳实践。

牛程表示,对于大多数企业而言,自建大数据平台并非明智的选择,通过第三方专业的数据服务来实现大数据的价值,可以低成本、快速、准确地获得专属的商业洞见,能够有效地跨越数据分析人才匮乏的现状。目前的阶段,要借助大数据来影响市场营销资源的投放,基于传统的贴标签功能依托IT技术进行聚类分析而成的网络用户画像是一项出色的应用,能够帮助企业实现高效运营和精准营销。

dratio-bigdata-1

网络用户画像数据成网站运营、精准营销的基础

  企业上马大数据有两道坎

根据市场调研机构IDC的统计数据,2013年全球产生的数据大约为2.72ZB,但分析过的数据仅占其中的12%。如果我们再套用“二八定律”来分析,则能够从数据分析中受益的更是少之又少了。

要想获得新的应用,中国企业往往选择新建自己的平台,但在牛程看来,企业想要自主搭建大数据平台,从交易和互联产生的几何级增长的数据中获益,还存在两个难题:数据和人才。

从大数据的4V来说,我们需要大量、多样和快速的数据,才能真正地体现价值。牛程表示,企业除了内部CRM平台的数据,还需要用户离开这些平台以后的数据,需要各种终端产生的数据,但企业自建平台,往往只有CRM数据,即便有一些企业采集了SNS数据,也还是不够全面,不利于产生需要的结果。

IDC大数据与分析、数据管理及企业应用高级项目经理Daniel-Zoe Jimenez亦有类似观点:真正的机遇在于将客户数据等内部数据源与社交网络和站点等外部数据源加以整合。这有助于企业全面了解他们的客户业务和环境,让他们能够掌握客户的喜好、习惯和未来需求。

另一方面,数据-知识-决策的转换,需要有数据处理、数据挖掘和决策的人才的支撑。目前,尽管开源软件目前非常发达,硬件变得廉价,但若没有BAT那样的研发实力,搭建企业级大数据平台所需要的兼容性、稳定性和安全性都很困难,更不用说实时分析和决策了。一项调查显示,83% 的人认为数据分析对业务至关重要,但65% 的人表示他们无力自建数据分析系统、无力聘请数据分析师。

 

  用户画像数据成网站运营的基础

如前所述,缺乏相关技能集和最佳工具以及流程方面的差距对中国企业构成了挑战。我国在数据的开放性、流动性和交互性以及原有大量积累数据缺乏真实性是我们的挑战。但从缔元信看来,利用互联网服务平台和用户行为数据,可以很容易规避数据的问题,则剩下的就是技能和工具。

我们知道,互联网服务平台能够汇聚海量的生产信息、交易信息与消费者信息 ,使信息这一核心生产要素广泛应用于经济生产活动。因此,平台型互联网企业更能为大数据应用做出有效探索,有的企业已经在这个领域有所建树,如阿里、百度都有相关案例。

当然,阿里、百度、京东等更多的是为自身业务的发展来利用数据,尽管百度也开放了其大数据引擎,但对于一般企业来说,它们未必是普适的平台。针对企业大数据通用的解决方案,牛程提出了一个用户分群画像的概念,通过用户画像与分群的研究,为网站运营、营销策略、广告运营、推广提供数据支持。

网站用户分群画像核心价值在于精细化的定位人群特征,挖掘潜在的用户群体,为媒体网站、广告主、企业及广告公司充分认知群体用户的差异化特征,根据族群的差异化特征,帮助客户找到营销机会、运营方向,全面提高客户的核心影响力。

dratio-bigdata-2

基于用户画像技术的数据服务原理

  传统的对用户贴标签的功能,往往局限于静态的结果,用户画像则是动态、立体的解决方案,通过精细化人群定位,多维度交叉筛选查询,客户根据数据分析、挖掘潜在用户群。

  缔元信的实践分享

目前,缔元信已经将牛程分享的这套理论进行产品化,发布了“网站用户分群画像”和“缔元信DMP”两款产品,前者为媒体网站、广告主、企业及广告公司提供网站营销、网站运营的数据支持服务;后者针对DSP(精准投放)平台提供数据服务,通过可视化的操作界面方便客户对目标用户人群数据的选取并将该数据输出给DSP平台,为精准投放的实施提供数据,提高转化率。

两款产品依托缔元信先前开发的缔元信数据管理平台(DDMP),将第一方标签与第三方标签相结合,对每一个用户标签化,然后按不同的评估维度和模型算法,通过聚类方式将具有相同特征的用户划分成不同属性的族群,用特定的名称作为实际用户群的虚拟代表,并进行画像描绘,洞察其商业价值及用户价值。

用户画像技术的出现,能够帮助客户了解群体的差异化特征,根据族群的差异化特征设计并提供有针对性的产品及服务。缔元信用户分群画像系统以TGI指数(目标群体指数)和用户构成两大核心指标,分析消费者的购买行为、态度、生活形态和媒体接触习惯,以及目标用户群体在指定范围内占有的比例,多维度判别目标用户群在媒体的优、劣势及用户价值。

dratio-bigdata-3

  缔元信网络用户分群画像的用户构成界面

  通过TGI指数,可以为销售团队的客户定位、营销策略和方案的制定提供支撑;评估网站资源优劣态势,为内容运营、产品规划提供支撑;评估网站资源之间(频道、栏目、内容、产品等)的优势关联关系。

谈及缔元信产品的优势,牛程表示,主要来自于拥有全样本第三方标签,精细化的人群定位,具有7年的数据积累,并拥有为数据管理而生的专业的技术团队,能够为企业提供大数据时代数据化、高效精良的服务。

视频链接:《牛程:专业数据服务助推大数据落地

161月/140

2014年互联网IT公司产品、技术类人员工资待遇大全

发布在 邵珠庆

以下均为应届毕业生的起薪待遇

一、民企

1. 百度 13k*14.6,special 14~17k*14.6

开发类 13K*14.6 (2014)

测试类、前端类 12K*14.6 (2014)

2. 腾讯 11.5k*16,special 12~14k*16

技术类研究生 11.5K*16 (2014)

终端开发本科生 10K*16 (2014)

3. 阿里 13k*15~15k*15,有17k*15,18k*15,有传说中的60w。

技术类 13K or 15K*15 (2014)

阿里星 25K*15+若干股票 总和接近60W

4. 360 13k*14~16k*14

5. 美团 13k*15~16k*15,也有更高的。

6. 去哪儿 11k*16~15k*16

7. 人人 技术类 (12K-14K)*14 (2014)

8. 58同城 20w+

9. 网易游戏 非清北17k~18k*16 测试 13k~14k*16 策划 16k*16

10. 网易互联网 11k~13k*16

11. 搜狐 13k~14k*14,更低的不知道

12. 新浪 微博 11k*16 (2014)

技术类 12.5K*14 (2014)

测试类开发 11.5K*14 (2014)

产品类 8.5K*14 (2014)

13. 创新工场 【不含涂鸦、豌豆荚】10k*13

14. 完美世界 最低12k*12+其他 【出乎意料地低】

15. 巨人 9k【低】

16. 大众点评 13k*14~16,有special

17. 豌豆荚 20w+

18. 携程旅行 11k*15

19. 盛大游戏 10k~12k*15

20. 爱奇艺 招人不多,一般13k*14

21. 豆瓣 21w+。

22. 凤凰网 视频开发10K*14 (2014)

23. 4399 技术类10K*14 (2014) 据说年终奖很多。

24. 赶集网 技术类 本科12K*15.2 (2014)

25. 酷派 技术类10K*14

26. 杭州同花顺 技术类6K*15

27. 锐捷 技术类11K*13

28. 兰亭集势 产品类 10K*12

29. 携程 技术类 6~9k*16

30. 小米 技术类硕士 13k*(13-15),special多1k

31. 陌陌 技术类11k×14+ 一些福利

32. 风云直播 研发22w

33. 北京风行网络 技术类 9000×15

34. 京东商城 技术类 9K*13

35. uc浏览器 技术类 8k×14+每天四顿大概12w

36. 科大讯飞 技术类 合肥硕士7.5k×13 上海杭州北京8500×13+1400住房补贴

37. 广州捷游 技术类 6.9*13 包三餐

38. 苏宁云商 技术类 南京/7000+400(房补)+200(饭补)

39. 福州锐捷网络 技术类硕士10k*13

40. 金山网络 C++开发(研究生)10~11K*14

测试(研究生) 8k*14

41. 创新工厂 技术类 10k×13大概13w

42. 盛大创新研究院 基础研发26W

43. 完美时空 技术类18W+

其他小互联网不列了,一般很少给得起【18w+】。

二、外企

1. 微软 【实习留用,校招少】,15~16k*12+奖金若干万。

2. IBM 【实习留用,校招极少】,11.5/12/12.5k*14,签约奖5w分两年给

3. 微策略 分档次,20~25w都可能。

4. 英特尔 【招人很少】 一般11k*13,其他不知

5. 思科 【缩招】18~20w

6. EMC 【招人很少】12k*14~15+其他约等于18w+

7. vmware 上海测试、研发校招名额不超过5人,18~20w

8. ebay 【缩招,往年校招已结束,今年刚开始,无网申,邮箱投递】,19w

9. EA【今年不招,去年26w+奖金】

10. 英伟达 18w+

11. ARM 【无校招】11k*13+其他

12. oracle 【招聘进行中】

13. Freewheel 16k*14

14. AMD、Autodesk,基本无校招,待遇不超过15w

15. 摩根IT base 由18涨至21

16. SAP 今年基本无校招 去年 ~11k*13+福利

17. 趋势 技术 12W一年

18. TP-Link

技术类本科 7.2K*16 3年拿分红

技术类研究生 10K*16 2年拿分红

其他外企不列,很多外企今年缩招甚至不招人

三、超级招人大户

1. 华为 10~13k*14,大多数是10*14.

2. 中兴 周围投得同学太少,请补充

四、金融机构

1. 招行信用卡 14w

2. 建行软开

3. 农行总行软开 6.5K*16个月+1500×12

4. 交行软开

5. 工行软开 待遇四大行中基本垫底

6. 中行软开 待遇四大行中基本垫底

7. 中国证券登记结算中心 20w+

8. 平安科技IT 技术15w,咨询18w+

9. 上海清算所,18w+

10. 银联商务 约17w

11. 银联数据 6000*18+高公积金+高福利,约等于15~16w

12. 南方基金IT IT部门 25W?

1211月/130

PHP中Push(推送)技术的探讨

发布在 邵珠庆

随着人们对Web即时应用需求的不断上升,Server Push(推送)技术在聊天、消息提醒尤其是社交网络等方面开始兴起,成为实时应用的数据流核心。这篇日志试图探讨的便是各种适合于PHP的Push的实现方式以及其优劣。

1. 什么是Server Push

想象在聊天应用中,如果使用传统的ajax来承担消息的传入,那么一般是通过每隔一定时间拉取一次信息的方式实现,但是其实这种方式有大量查询是浪费的。聊天等Web应用更需要服务器在特定时间来主动告知前端有新的消息(Push),而不是前端每时每刻问服务器:“来消息了吗?”(Pull)。这也正是为什么这个技术常被叫做反向ajax。

其他别名:Comet,反向Ajax

 

2. 如何实现Push

其实所谓的推送技术也没有多么复杂,目前从大类上有3种,一种仍然建立在ajax基础上,还有一种建立在框架基础上,最后一种抛弃了传统的HTTP协议,使用Flash或者HTML5的WebSockets技术。接下来将对这三种类别产生的不同的方式进行探讨。

 

1) Ajax 长轮询

Ajax长轮询从本质上来说仍然是一种pull,但是实时性较高,无用请求减少很多,是一种不错的Push实现方案。不过它只减少了网络上的无谓消耗。

核心: 客户端发起一个ajax请求,服务端将请求搁置(pending)或者说挂起,直到到了超时时间(timeout)或需要推送时返回;客户端则等待ajax返回后处理数据,再发起下一个ajax请求。

优点: 兼容性较高,实现简单

缺点: 对于php这种语言来说,如果要做到实时,那么服务端就要承受大得多的压力,因为搁置到什么时候往往是不确定的,这就要php脚本每次搁置都进行一个while循环。
当然,如果服务器刷新每秒级,那尚可接受,只是实时性上退化了。

注意: 浏览器有连接数限制。我得出的结论是如果当前页面上有一个ajax请求处于等待返回状态,那么其他ajax请求都会被搁置(Chrome, Firefox已测)。似乎跟页面标记有关,一个规范的HTML可以同时有多个请求。如果页面有一般ajax需求怎么办?解决方法是开个框架,框架中使在另一个域名下进行Comet长轮询,需要注意跨域问题。

PHP实现: Jquery+php实现comet

相关: Ajax跨域和js跨域解决方案

 

2) Frame 长连接

受到ajax启发,出现了框架下的长连接。

核心: Frame中发起一个普通请求,服务器将其搁置;需要推送时输出直接执行
脚本,然后继续保持连接。如果担心超时问题可以改成框架论询。

优点: 与1一样具有高兼容特性

缺点: 最大的问题是如果框架在载入,那么浏览器就好一直显示“载入中”,这就弱爆了(解决方法参见文末的相关阅读资源)。同样服务器也要能hold住大量循环……另外,是否有同域连接限制没测试。

 

3) Flash/HTML5 WebSockets

用flash来发起WebSockets,秒杀前面一切问题。

优点: 标准化, RealTime, Push

缺点: 服务器需要能应对WebSockets;还有如果既没有Flash又不支持HTML5的怎么办?

PHP实现: Start Using HTML5 WebSockets Today

 

6) 使用兼容封装层(socket.io)

以上每种方法都有优劣,那么终极解决方案便是合在一起!能WebSockets时候就WebSockets,不支持HTML5特性就退化到Flash,没有Flash则退化到Ajax长轮询。这也是我的Rainbowfish所采用的方式。

优点: 高度封装,编写非常容易,几乎不需要关心如何去实现的。实时,超低负载,高并发。

缺点: 其实算不上缺点,socket.io的服务器端要求是node.js,而不是php。

个人看法: 如果你是独立主机,能运行程序,那么socket.io配合node.js是个非常高效的选择。为什么呢?因为它还可以避免php的服务端高负载。

Rainbowfish的消息系统通过这种方式实现: 所有客户端都通过socket.io挂在nodejs服务器上(注意: 只是挂着,不需要任何循环,因为它是事件驱动的);需要推送消息了,服务器就与nodejs通信(比如访问某个地址来实现),告诉它推送什么消息到哪里;nodejs收到推送信号后,则通过socket.io实时传输数据给浏览器。这个其实也是一条单向的路,因为nodejs服务器不具备与php通信的能力,实际上也不需要,网页上直接连php就可以了。

 

3. 结束语

事实上,第一个方法(Ajax Long Pull)是一个不错的方法,只是如果使用php完成的话服务器负载上有点大,但这其实是通病;而最后列举的socket.io方案完全避免了这个问题,因为它属于另一种架构,并且这种组合也可以配合几乎所有的脚本语言实现push。

对于实时性要求非常高的应用,或许使用php实现实时部分并不是一个好的选择,将会面临非常大的服务器负载(可以通过编写支持等待事件的扩展来解决这个问题);如果只是消息提示等,则可以调整服务器上刷新的间隔降低到秒的级别,负载尚可接受。不过无论哪种用途,配合那些非阻塞语言或许才是最好的选择。

 

4. 相关阅读

How to implement COMET with PHP

Start Using HTML5 WebSockets Today

Comet(Wikipedia)

Ajax跨域和js跨域解决方案

Jquery+php实现comet

269月/119

值得开发人员关注的jQuery技术网站和博客20个

发布在 邵珠庆

1. John Resig - http://ejohn.org

毫无疑问,jQuery的缔造者的博客是你首先必须关注的。

2. Filmament Group Lab

这个也是必看之一,因为jQuery UI类库就出自这个网站

3.  Learning jQuery

老牌的学习jQuery的网站之一,这个网站是由几个作者联合建立

4.  Soh Tnaka Blog

非常酷的一个jQuery设计和分享网站,风格非常酷,里面的教程和插件实现非常有艺术感,本人这里强烈推荐。

5.  nettuts

老牌的网页设计网站,里面包含了非常多的jQuery教程和技巧。同时这个网站也有大量的设计相关的文章,大家可以学习。

6. jQuery4u

老牌的jQuery网站学习网站,里面有很多jQuery的教程,及其收集的jQuery插件。

7. WebResourceDepot

收集了许多jQuery插件教程及其信息

8.  The Sea of ideas - personal blog of Paul Bakus

Paul Bakus是jQueryUI的创始者并且也是很多著名插件的开发人,在他的博客中我们可以找到大量javascript,jQuery,jQueryUI开发的信息和文章

9.  James Padolsey

Jame是一个具有丰富开发经验的前端开发工程师,在他的博客中,他经常介绍最新的开发技术和价格,并且分享很多jQuery代码及其实现

10.  jankoatwarpspeed

Janko的博客发布有很多写的非常好的jQuery开发文章,并且也有新书的发布

11. jQueryhowto

jQueryHowto提供了大量的代码片段帮助你解决jQuery编程中的个实现问题,非常实用的开发查询网站,GBin1这里强烈推荐

12.  Marcofolio

这个博客拥有很多不错的教程,帮助大家实现非常实用的jQuery功能, 例如,如何实现TechCrunch的像素Logo

13.  Build internet

Build internet拥有很多书写的非常好的jQuery教程,当然由于它是一个综合性的网站,也拥有很多其它的web开发教程和资料

14. W3CSchools

比较老牌的一个网站,主要提供各种W3C相关教程,包括HTML,XML,CSS,Javascript,也包括jQuery等其它教程

15. Addy Osmani Blog

Addy Osmani拥有很多详细讲解的jQuery教程及其相关Javascript toolkit。

16. jQuery style

一个完全讲解jQuery类库的网站,分享代码片段及其各种jQuery插件。

17. The Ultimate jQuery List

一个非常完整的jQuery类库,插件,演示及其教程说明, 完全值得大家去查看内容

18. Queness

这个个人blog拥有很多实用的jQuery资源

19. Tutorialzine

这个博客有很多实用的资源,可以直接在代码中实用

20. GBin1

GBin1是提供互联网相关技术的综合类博客,我们提供最新的互联网信息,技术及其教程,希望能帮助大家了解最新的互联网技术和信息

56月/100

网页表单密码破解程序技术

发布在 邵珠庆

使用说明

1、Target:填写表单将要的路径,该路径可以通过查看网页的源文件得到,如<FORM NAME="form1" METHOD="post " ACTION="http://www.163.com/CheckUser.jsp>

2、Referer:有些网页的验证表单处要 ...
使用说明

1、Target:填写表单将要的路径,该路径可以通过查看网页的源文件得到,如
<FORM NAME="form1" METHOD="post " ACTION="http://www.163.com/CheckUser.jsp>

2、Referer:有些网页的验证表单处要检测表单由何处提交,这里可以填写该表单的URL,如
www.163.com

3、CorrectFlag:此处填写表单验证后正确的关键字,如何得知该关键字呢?如果你有一个帐号能够通过该表单验证,可以使用GetFlag按钮来获得该关键字。

4、WrongFlag:同上,这里是获得验证失败的关键字,也是通过GetFlag得到的。

5、Keep Session:是保持页面在传递中的Session(目前没有实现)

6、Var1Name:指表单中第一个文本框的名字,一般是用户名:),也可以通过查看源程序得到,如
<input name="username"size=12 class=log>
其中的usrname就是名字

Var1Value:指该处应该填写的内容,如果要猜jack的密码,就填写jack

UseDict:指是否使用字典文件,如果该标记被选中,会让你选择字典文件。

Var2Name、Var2Value、UseDict同上。

注意:如果想检测某个用户名是否已存在(一般网站都会提供该功能),可以将Var1使用字典,Var2留白。如果只是猜某一指定用户的密码,则将Var2使用字典。目前不支持用户名和密码同时使用字典文件。

7、Delay如果某些ISP限制了访问页面的时间间隔,请设定该间隔时间,单位为毫秒。

8、OtherParameters:如果表单中还有其它需要提交的元素,可以自己拼写提交,如
submit="登录"&style="1"

9、此处是反馈的结果

Load/Save:打开/保存配置文件

下面是示例:

我在自己的机器上准备了4个文件:default.html(登录页面),check.jsp(身份验证),error.jsp(用户名或密码错误页面),ok.jsp(登录成功的页面)

default.htm的内容

<form name="form1" method="post" action="check.jsp">
用户名:<input name="username" type="text" size="12"><br>
密 码:<input name="password" type="password" value="" size="12">
<input name="submit" type="submit" value="提交">
</form>
--------------------------------------------------------------------------------

check.jsp

<%
String username = request.getParameter("username");
String password = request.getParameter("password");

if (!username.equals("zhang")) {
response.sendRedirect("error.jsp?msg=用户不存在");
return ;
}

if (!password.equals("test")) {
response.sendRedirect("error.jsp?msg=密码不正确");
return ;
}

response.sendRedirect("ok.jsp");
%>
--------------------------------------------------------------------------------

error.jsp

<%
out.println(request.getParameter("msg"));
%>
--------------------------------------------------------------------------------

ok.jsp

<%
out.println("Login Success");
%>

由default.htm中可以看出,Target应该是check.jsp,Var1Name是username,Var2Name是password,因此,Target处应该填写http://localhost:8080/server/check.jsp,Var1Name处填写username,Var2Name处填写password,上面的程序中我已经知道了用户zhang使用密码test时能够正确登录,因此我将Var1Value填写zhang,Var2Value填写test,然后GetFlag,返回的结果如下:

HTTP/1.1 302 Moved Temporarily
Set-Cookie: JSESSIONID=D774019940B30BC65709C15197A13B0A; Path=/server
Location: http://127.0.0.1:8080/server/ok.jsp
Content-Type: text/html
Content-Length: 0
Date: Sat, 10 Apr 2004 14:57:27 GMT
Server: Apache-Coyote/1.1
Connection: close

在我们再将Var1Value和Var2Value留空,再看看登录失败时的返回数据

HTTP/1.1 302 Moved Temporarily
Set-Cookie: JSESSIONID=21E3ECB8815AC7876A78D1479B30EB7D; Path=/server
Location: http://127.0.0.1:8080/server/error.jsp?msg=ó??§2?′??ú
Content-Type: text/html
Content-Length: 0
Date: Sat, 10 Apr 2004 15:00:22 GMT
Server: Apache-Coyote/1.1
Connection: close

从上面返回的两组数据中可以看到,当登录成功时,返回的数据包含Location: http://127.0.0.1:8080/server/ok.jsp,失败则包含Location:http://127.0.0.1:8080/server/error.jsp?msg=ó??§2?′??ú(这里没有处理中文编码,所以显示乱码),因此,我们在CorrectFlag中填写http://127.0.0.1:8080/server/ok.jsp,WrongFlag中填写Location: http://127.0.0.1:8080/server/error.jsp?msg=ó??§2?′??ú,现在再假设我要猜测用户zhang的密码,这时可以将Var1Value中填写zhang,Var2Value使用字典文件。我准备的字典文件内容如下:

iloveyou
loveyou
love
ILOVEYOU
LOVEYOU
LOVE
loveme
LOVEME
test
778852177885217788521
77885217788521
7788521
521521521
521521
521
520520520
520520
520
zhang
772587725877258
7725877258
77258
258258258
258258
258
sina
sohu
163
263
(最后一行要留空)

此时界面应该如下:

然后Start,结果如下

注意:

1、选择关键字最好是尽量靠前,这样会使网络传输的数据量比较小

2、能务必填写CorrectFlag,也就是说你必须知道登录正确的关键字(这也是提高速度的一个方面,同时,如果仅通过错误的关键字来猜测密码是否正确比较困难,这是由于关键字比较难找,最重要的是,如果不填写CorrectFlag,目前不能正常工作:))