2014/10/11

GoAgent的工作原理

GoAgent的工作原理。
个人理解;作者解释; 访谈;

运行图示(实线表示发送,虚线表示返回)


个人理解:

用户发送数据给本地的服务器(goagent客户端),然后goagent客户端将你要发送的数据进行封装,以逃避GFW的屏蔽和封锁,封装之后发送给GAE(google application engine),然后GAE(也是一个服务器)调用urlfetch服务(谷歌提供的一个叫 URLFetch Python API,GoAgent 就是利用它和外界联系,让它能自由和谷歌以外的网站沟通。)对目标网站进行访问,目标网站返回数据,gae又一次对数据进行封装,然后返回本地,本地的goagent对数据解包,并返回浏览器,我们就“翻墙”了。

Goagent作者本人对工作原理的解答。

Phus.Lu:
goagent 的原理用一句 python 代码就可以演示
urllib2.urlopen(urllib2.Request('mail.google.com/fetch.p', data='methd=GET&url=twitter.com/&&body=', headers={'Host': 'goagent.appspot.com'}))
好了,你现在有了一个托管在国外主机上的 WEB API,剩下的事情就是如何把它包装成一个本地代理了。

包装成 HTTP 代理也比较简单,借助 python 标准库的 SimpleHTTPServer/BaseHTTPHanlder 我们大约需要 500 行的 python 代码完成这个代理。

接下来的问题是大文件(视频)的支持和 HTTPS 的支持。
这个阶段你会遇到各种 HTTP/HTTPS 的细节问题,幸好我们完成了它,这时候代码增加到了 1000 行。

好了,现在现在我们可以让它真正开始工作了。需要处理各个平台 windows/macos/linux/android 的问题,还好大多数平台我们可以自己找到,并且修复在这些平台的 bug。代码中会增加 1500 行。

另外,我们还需要在各种浏览器下测试程序的行为,这时候程序 LOC 增长不会太大,但是解决这个兼容性问题会耗掉一些精力。

为了这个程序能够易用,我们需要在各个平台写个简单的 GUI 外壳,这需要我们懂 pyobjc/gtk/win32 等等支持。不过这个并不算难,折腾一番,我们也把这些外壳捣鼓出来了。此时代码已经大大膨胀了。

最后,用户会提出一些很合理的改进要求,比如 PAC/DNS/PHP 等等支持。嗯,加油做完这些,就差不多了。

好吧,如上述所示,goagent 的确没有特别的难点,我相信任何一个 python 程序员会在一个星期到一个月的时间内把它做出来。 :)

那么最后一个问题,
为什么各种软件中 goagent 相对比较受欢饮,它难在什么地方?
答案其实很简单:
热情和精力。

是的,有心做这个程序的人不少,尤其是程序员,对于开发一个自用的翻墙软件很多人有相当的兴趣。事实上也有不少这样的实现。
但是当用户提起 goagent 的评价是:“好用,快速,稳定,免费”。能够同时满足这些要求,goagent 花了不少心思。

好用:为了让 goagent 好用,需要学习不同平台和不同浏览器的特性,琢磨用户的用法,反复推敲功能的实现。
快速:为了能让 goagent 跑的更快,作者阅读 python 的标准库代码和 CPython 的实现,看完了 sildeshares 上的绝大部分关于 python 高效代码的方式和技巧。
稳定:Google 时常被干扰,如何优化连接方式是个永恒的话题,goagent 的连接方式前后一共改过三次。
免费:是的,如同 Goagent是怎么赢利的? 这个问题的最佳回答,我很赞同这个回答 "3、不是所有东西都是为了盈利才出现的"


“开源中国”对Phus.Lu进行的一次访谈:

【开源访谈】 GoAgent作者 Phus.lu访谈实录
【作者简介】
 Phus.Lu, Python 程序员一名,常用 Geeker 自诩。混迹于 twitter/v2ex/oschina, 喜欢科幻/奇幻,动漫和编程。对世界保持着强大的好奇心,职业理想是做一名自由软件从业人员。

【软件简介】
goagent 是一款使用 Python/PHP 编写的网络工具,可以运行在 windows/linux/macos/android/ios/ddwrt 上。  

1. 能否先介绍一下你自己(技术背景、工作经历、学习经历)?
科班出生,2010 毕业之后一直从事 Python 相关的工作,搞过自动化测试,前端服务器,后台日志分析等等项目。 技术上喜欢自动化一切可能被自动化的事物。

2. 是什么促使你开发了 GoAgent 这款软件?
2011 年前后访问 google 开始有些不稳定, 而自己正好私下写过一个 hosts 优化器,两者结合就成了GoAgent. 

3. 目前有哪些人参与了 GoAgent 项目的开发?
很多人给 GoAgent 提供了代码,以至于我不好意思称作 goagent 的作者,后来索性在源代码中列出了一个contributor 列表,把我和所有其他人一起列在上面。

4. 你花费多少精力在这个项目中?
GoAgent 是个业余项目,大部分工作是在晚上和周末维护的。花费在上面的精力和工作相关,忙的话一周可能会花上 4 小时左右,不忙的话可能会到 10 小时左右。

5. GoAgent 将来的发展方向如何?
稳定和快速是 GoAgent 一直追求的。 

6.你们有统计过目前使用 GoAgent 的人数吗?
没有统计,本来有意加入GoAgent自动检测升级代码,这样虽然可以方便用户,但是有可能会暴露用户隐私,所有就没有做。由于这个原因,目前使用 GoAgent 的人数我们也不知道。

7. 你是否有通过 GoAgent 这个项目获得收入?
没有。一直以来有很多用户表示愿意捐助,在此顺便表示感谢,谢谢你们的认可。 

8. 鉴于中国的国情,开发这样的项目是否有给你造成困扰?
暂时没有,GoAgent 也很谨慎的将自己定位为网络工具(tool),不提供服务,观点和社区。 

9. 能否谈一下你对开源的理解,以及对国内开源技术和产品的看法?
在我看来,开源起初由一些热心无私的程序员发起的“运动”,之后传统软件行业不可避免地收到的相当的冲击。于是有些公司拥抱开源,有些公司视开源社区为敌人。
再以后,开源就变成了一个现象:有人把开源当作旗帜,有人把开源当作爱好,有的公司把开源当作”武器“,有的公司把开源当作宣传工具。总之,开源作为现在软件业的一个现象,已经被赋予了很多的内涵。国内开源社区我觉得已经拥有很多一流技术和产品了,比如 LVS/OpenResty/Cocos2d 等等产品,和这些大牛产品相比,GoAgent 微不足道了。相信在不远的将来,像 LVS/OpenResty/Cocos2d 这样的拥有世界级影响力的开源产品会在国内越来越多的出现。

10. 你有什么建议给程序员初学者吗?
兴趣是最好的老师,共勉。 

没有评论:

发表评论