2010年8月,HTTP协议的原创作者Roy Fielding接受了“Geek of the Week”栏目记者Richard Morris的采访,其中有很长一段内容涉及到了Google的SPDY协议。Fielding对于SPDY协议提出了一些批评意见:
不过Fielding也承认,HTTP/1.1的线路语法注2(wire syntax)中存在很多低效率的部分,HTTP/1.1肯定会被某种类似HTTP+SPDY的协议所取代。事实上他在2001年就开始了相关的努力,开发了一个叫做WAKA的新协议,但是并没有选择在IETF/W3C内部来开发。
2012年3月底,在W3C的邮件列表中,有一个标题为“SPDY = HTTP/2.0 or not ?”的讨论。这个讨论有很多人参与,值得关心HTTP协议发展方向的同学们仔细一读。在这个讨论中,Roy Fielding与SPDY协议作者Mike Belshe阐述了各自针锋相对的观点。Mike Belshe在他的第一次发言中提到:
我们现在正处在一个十字路口,需要做出重要的抉择。
[..]请你们去满世界寻找到哪怕只有一个人,他想要一个不安全的互联网。我不相信世界上存在这样的用户。大多数用户没有意识到他们所使用的互联网是不安全的。我知道很多网站为了节省开支,甘愿让用户冒风险。我们究竟应该迎合这些网站呢,还是应该迎合用户?
[..]在任何产品中,安全性都不是一个选项,而是一个必需品。用户期望安全性,并且需要安全性。
接下来他还提到两点,借以证明SSL可以,也有必要称为“必需品”:
他补充道:
如果你们不相信我所说的安全性的重要性,请看看所有主要的社交网站内容提供商。Google和Twitter已经100%使用了SSL,Facebook和Microsoft也没有落后多少。用户需要安全性,他们现在就需要!我们应该停止将安全性作为一个选项的讨论。
一个更好的争论话题应该是:“SSL是否是保护Web的正确方式?”而不是:“我们是否应该保护Web?”
Roy Fielding在发言中提到:
我从不认为应该将SSL作为保障协议安全的必要手段。SSL虽然有助于对被动的观察者隐藏数据交换的内容,但是传统的User Agent证书管理方式对于保证协议安全来说其实是有欠缺的。
Fielding质疑“在任何时候,每一个用户都想要一个安全的协议”这个观点是不切题的。他指出,在实践中有很多使用HTTP的例子,开发者既不想用SSL/TLS,也不适合使用SSL/TLS。同样的,很多人在亭子间、公立学校、图书馆和其他区域使用HTTP,SPDY设计者所认为的用户对于隐私问题的关注,其实不如该区域所属组织对于防止HTTP协议被滥用的责任更重要注3。
其实还有其他的方法既可以保证协议安全,又能保证协议对于中间组件的可见性,但是我们不必预先就同意安全性是一件“必需品”。如果协议的前提无法支持自己并自圆其说,那么我不需要一个新的协议。
Mike Belshe回应了Roy Fielding的言论:
实际上,我没见过哪个例子能证明用户想要一个不安全的产品或者协议。我们当然无法解决所有的问题,但是这不意味着我们能对其置之不理。我们现在已经能够解决大多数的偷听问题(eavesdropping problem)了。所以问题在于:为何我们不应该去做这件事情? [..] 协议只有在提供了真正的价值时才会成功。这里有一个主观的问题是,安全性和隐私保护是否是价值的一部分。
笔者点评:
在“SPDY = HTTP/2.0 or not ?”这个大讨论中,Mike Belshe并没有完全理解Roy Fielding的观点,甚至有些抵触。笔者怀疑Roy Fielidng在2010年“Geek of the Week”访谈中对SPDY协议的批评让他很不满,因为Fielding甚至怀疑Mike Belshe没有做运维的经验(特别是高可伸缩性网站架构的设计和实践的经验),需要Google做运维的同事给他上上课。
总的说来,Fielding的批评还是比较中肯的,考虑问题也更加全面。因为设计一个像HTTP这样的Web基础协议,除了安全性之外,还有一些同样重要的考量,例如可伸缩性,甚至还需要考虑一些社会性方面的问题。在安全性、可伸缩性、社会性等方面的考量,常常存在着冲突,无法兼顾,在每一方面都要达到完美的境界,因此需要非常慎重地加以权衡。这些权衡,Fielding已经很清楚地写在了他于2000年所发表的博士论文之中。正是在这篇博士论文中,Fielding通过讨论架构风格所要满足的架构约束,严谨地推导出一种专门为面向互联网的Web应用量身定制的架构风格——REST。
笔者推测Mike并没有认真读过这篇论文,不然他应该能更容易地理解Fielding和IETF/W3C中一些其他专家的观点。REST要满足的一个非常重要的架构约束就是“分层系统”(Layered System)。HTTP/1.1协议为何如此设计,背后的指导原理正是REST。HTTP/1.1协议有一个很重要的目标就是支持分层系统的架构设计(常见的分层系统例如分层的缓存、分层的代理服务器、分层的防火墙等等)。分层系统要求整个系统实现统一接口,保持HTTP消息的语义对于中间组件具有可见性。
而SPDY协议因为强制使用SSL,只支持端到端(User Agent到Origin Server)的密钥协商和通信,将参与到HTTP通信链路之中的其他中间组件(缓存、代理服务器、防火墙等等)完全排除,因此无法满足“分层系统”的架构约束。SPDY协议最大的问题就在于此,引起争论最多的正是强制使用SSL,这会给协议的部署工作带来很多麻烦。其实还有其他的方法,在满足“分层系统”架构约束的情况下,解决安全性的问题。
如果网站已经大量使用了SSL,例如国内像支付宝、网上银行一类的网站,那么可以将SPDY协议作为一种优化的HTTPS实现。这样做不会有什么问题,部署起来难度也不算大。但是如果网站没有大量使用SSL,选择SPDY协议时需要非常慎重。
SPDY协议中确实有很多值得借鉴的地方,其团队也才华横溢。但笔者认为SPDY协议不大可能在未来直接取代HTTP/1.1,认为SPDY协议就是未来的HTTP/2.0,要么是夸大其词,要么是故意的市场炒作。事实上,IETF的HTTPbis工作组的主要工作,正是对HTTP/1.1协议进行重新评估和改造,欲了解他们的工作成果,可以访问其官方Wiki。他们已经将HTTP/1.1协议模块化,划分成了7个模块:
(图片源自:http://restlet.files.wordpress.com/2011/10/http-1-1-bis.png?w=460)
估计在大约两年之内,IETF将会发布一个HTTP/1.1协议的修订版(但不是传说中的HTTP/2.0协议)。SPDY协议中多路复用、头信息压缩、设置请求优先级的做法可能会被最基础的Messaging模块所借鉴。但是强制使用SSL,以及SSL是否就是解决Web安全性问题的正确选择,在IETF/W3C仍然受到广泛的质疑。笔者认为在可预期的未来,强制使用SSL不可能成为HTTP协议的一部分。
各位读者朋友,您又是如何看待SPDY协议的呢?
注1:“分层系统”是REST所要满足的一个架构约束,常见的分层系统有分层的缓存、分层的代理服务器、分层的防火墙等等。
注2:就是一些标准头信息的语法。
注3:考虑一下恐怖分子在这些区域散布恐怖信息。
作者李锟,网名dlee,知名技术专家,出版过《REST实战》、《Ajax实战》等多部译作。
感谢丁雪丰对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至[email protected]。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。