Friday, January 22, 2016

HTTP/2 你需要知道的知识

HTTP/2 是 HTTP 协议的第二个正式版本,于 2015 年 5 月 15 日正式发布,到现在短短半年时间里已经获得了大量的关注和实现支持。本文将介绍其核心的理念和相关知识要点。
可以通过访问 Akamai HTTP/2 测试页 来体会性能提升效果。本地测试结果差一个数量级 。

为何要有 HTTP/2

主要目标是优化性能,次要目标是安全性和互操作性。其实也是因为现在越来越多的 Web 应用,对性能等方面的需求。
最早的 HTTP/1.0 (RFC 1945,1996 年发布)中每个资源(文本、图片)默认要单独创建一个 TCP 连接来传输。创建一个 TCP 连接的时间成本是比较高的。
HTTP/1.1 (RFC 2616,1999 年发布,最近替代的是 2014 年 RFC 7230)是目前互联网世界的主流协议,通过优化对 TCP 连接的使用来提高效率,主要改进包括:
  • 默认采用持久化连接:同一个网页上的所有资源可以共用一个 TCP 连接;
  • 请求的流水化:多个请求可以不用等前面请求完成就一次性顺序发出(但应答消息还得顺序返回);
  • 其它特殊头字段(Host、Keep-Alive、Range 等)支持更多语义。
注:RFC 7230 中去掉了一个域名最多 2 个连接的限制。

来源

项目主页在 http2.github.io
HTTP/2 规范内容是基于 Google 提出的 SPDY 的 3 号草案,这也是为何实现如此之快。
Google 后来基于 SPDY 提了一个 QUIC 协议,试图基于 UDP 来实现类似 HTTP/2 的效果。
注:UDP 和 TCP 之争由来已久,只能说两者各有适合的场景,不能简单对比。

具体内容

核心思路是在继续遵循 HTTP 规范的前提下,(通过多路复用等手段)进一步提高对 TCP 连接的利用率,减少无谓的等待时间;同时采用头部压缩减少传输量。
实现上,在应用层(HTTP/2)和传输层(TCP or UDP)之间增加一个二进制分帧层(分为 Header 帧和 Data 帧)。加层的做法果然是 IT 行业的瑞士军刀。
跟 HTTP/1.1 比,没变的:
  • HTTP 方法
  • HTTP 状态码
  • HTTP 语义
意味着原先基于 HTTP 设计的 API 照样可用。
改进的地方主要包括:
  • 用二进制流(Stream)代替原先的文本格式,一个连接可以并发多个流;
  • 流支持优先级和对其他流的依赖;
  • 流通过单独的窗口来控制流量;
  • 流可以通过重置帧来中断前面发出的消息;
  • 头部信息支持压缩(HPACK);
  • 除了客户端请求,服务器端也可以主动推送资源(例如页面中的各种元素资源);
  • TLS 规范中是可选的,但实现上 Chrome 和 Firefox 仅支持 TLS。
其中,HPACK 是采取基于字典(包括预置的静态字典和动态添加的动态字典)的压缩机制 + Haffman 编码进行编码。原来的域值现在只需要使用对应索引号即可。

相关规范

相关的两个 RFC:
前者是 HTTP/2 主体内容的规范,后者是头部压缩技术(HPACK)的规范。
正式版本之前先后经过 0~17 等 18 次草稿。
一般,通过 h2-x 表示是协议的第几版本草稿,h2 默认表示正式版。

技术组

前者是关于 HTTP 协议的官方机构;后者 2007 年成立,负责更新 HTTP/1.1 规范,是 RFC 7230 的提出者。

支持 HTTP/2 的项目

除了知名浏览器,其它项目包括 Apache HTTP Server 2.4.17+NginxChromiumcurlJettyNettyNodejs ,Wireshark等。
此外,部分国外网站也已经默认开启 HTTP/2 支持。
这里有 完整列表

扩展阅读

Sunday, January 17, 2016

从比特币到区块链的未来

很早就想写一写区块链(Blocking Chain)技术,作为比特币等一系列应用背后最核心的技术,它的前景充满了各种可能和挑战。最近身边不少人感兴趣,正好总结下。

起源和背景

相比区块链,更多人都听说过比特币。其实最早 08 年的时候比特币就已经问世了,但真正流行起来还是在 10 年后的事情。其官方网站是 bitcion。发明人(传言代号为中本村的澳大利亚人)到目前为止尚无法确认身份,但是一个团队的概率较大。
比特币是一种概念金融货币。主要是希望解决已有金融货币系统的几个问题:
  • 被掌控在发行机构手中;
  • 自身的价值无法保证;
  • 无法匿名化交易。
搞金融的人都能想到,实际上,要设计这么一套系统,最关键的还是一套强大的交易记录系统和中立的货币发行机制。
首先,这个系统要能中立、公正、无法被篡改地记录发生过的每一笔交易。对比已有的银行系统,可以看出,现在的银行机制作为第三方,是有代价的提供了这样的服务,即如果交易双方都相信银行的数据库,那么就没问题了。可是如果是世界范围内流通的货币呢?有哪个银行能让大家完全信任它?于是,需要有一套分布式的数据库,在世界范围内都可以访问,而且都无法去控制。这也就是区块链设计的目的。
货币的发行则是通过比特币的协议来规定的,总量必须控制,发行速度会自动调整。既然总量一定,那么单个比特币的价值肯定会随着承认比特币的实体经济的加入而水涨船高。发行速度的调整则避免了通胀或者滞涨的出现。

原理

区块链的基本原理其实十分简单。
首先假设存在一个 P2P 的数据库(这方面的技术相对成熟),剩下来就是大家如何决策去添加数据上来。只允许添加、不允许删除避免了作伪的可能性。这个数据库的结构是一个链,由一个个块组成,这也是其名字的来源。新的数据要加入,必须作为一个新的块来加入。而这个块能否加入,可以通过一些手段来检验出来。
具体到比特币如何使用了区块链技术。比特币将每十分钟内所有的交易都打包在一起,这些信息组成一个块。然后,网络中所有的成员都可以试图来找到一个合法的块(比如基于当前的块的信息,加上时间、id,加上某些其它有用信息等),然后进行一些 hash 计算,并且找到的结果还得满足一定条件(比如小于某个值)。一旦算出来就可以进行全网广播,大家拿到这个算出来的结果,进行正向验证,发现确实符合条件了,就承认你算出来了。
因为算出来的概率要从数学上进行保证,比如每十分钟内大概就刚好算出来一个。所以保证了区块链每十分钟增加一个块。算出来的这个人将获取得到这个时间内所有交易产生的管理费和协议固定发放的奖励费(目前是 25 比特币)。也即俗称的挖矿。

挖矿

五年前,挖矿还是一个很有前途的行业。但是现在,建议还是不要考虑了,因为从概率上说,由于当前参与挖矿的计算力实在过于庞大(已经超出了大部分的超算中心),获得比特币的收益已经眼看要 cover 不住电费了。特别那些想着用云计算虚机来挖矿的想法,意义确实不大了。
从普通的 CPU、到后来的 GPU、到后来的 asic 矿机、到现在的 asic 数据中心。短短数间,比特币矿机的技术走完了过去的计算机的历程,并且还颇有创新之处。确实是哪里有利益,哪里的技术就飞速发展!
有哥们当年去内蒙古用近乎白给的价格租了当地的机房,打着创业幌子搞挖矿,不知道今日身家几何!
很自然的,有人会想到,如果我有很强大的计算力,所有的块我都算出来了,那是不是就能破坏比特币网络。确实如此,基本上拿到 1/3 的计算力,比特别网络就存在被破坏的风险了;拿到 1/2,概率上就掌控整个网络了。
想想看,你可以一直不承认别人的计算结果,只承认自己的,从概率上风险是很大的。这里,要区别分布式系统里面的拜占庭将军问题,这里完全是概率意义,并非数学证明。
那么有没有办法防护呢?
除了尽量避免计算力放到同一个组织手里,没太好的办法,这是目前 pow (proof of work)的协议规定的。
也有人觉得为了算一个块,大部分计算力(特别到最后根本没算出来的)其实都浪费了。
有人提出用所谓的 pos,即大节点作为多个节点代理人的模式来节约计算力。那怎么选大节点?又容易导致“富则越富”问题。呵呵,这就是完全民主 vs 选举人制度嘛。
个人认为,无论 pow 还是 pos,都无法解决问题。要从根本上解决,得引入随机代理人制度,通过算法在某段时间内只让部分节点参加计算,然后要发放一部分“普世奖励”给所有在线节点。

安全

既然区块链一个可能的应用前景是金融系统,那么安全自然是讨论最多、挑战最多的话题。区块链的实现是开源的,基于了现有的成熟的密码学算法。但这是否就能确保其安全呢?
未必。有如下几个方面是很难逃避的。
首先是,攻击区块链系统是否是犯罪?攻击银行系统是要承担后果的。但是目前还没有任何法律保护区块链以及基于它的实现。
其次是软件实现的潜在漏洞是无法避免的。考虑到使用了几十年的 openssl 还带着那么低级的漏洞(heart bleeding),而且是源代码在大家眼皮底下。这背后曾经发生过啥,让人遐想连篇。金融系统自身到底有没有必要开源,也值得商榷。
另外,区块链所有交易都是公开可见的。搞大数据的人听了是不是开始激动起来了,呵呵,这里面能分析的东西还真不少,而且规模够大、影响力够大……
还有就是作为一套完全的分布式系统,区块链缺乏足够的调整机制,一旦运行起来,真的无人能控制。即使是让它变得更公平、更完善的修改,只要有部分既得利益者合起来反对,那就无法加入进去。这让比特币本身的价值也蒙上了一层阴影。

展望

无论如何,区块链确实是第一个试图做公开、中立、匿名化的分布式数据库的系统。它的出现,让大家意识到除了互联网这样的基础设施外,数据库系统也可以成为公共基础设施。而且像比特币这样的例子,给与了区块链更多的遐想空间。如果交易无法造价,信息无法造价,世界是不是会多了一些算法来保证的公平呢?这是又一次用技术给人类发展带来进步的福利。
不提这种去中心化的金融系统是否现实(个人认为至少 5-10 年后的事情了),在跨国交易、跨组织合作日益频繁的今天,区块链、比特币都是很好的一些尝试和参考。