Netty In Action中文版 - 第十二章:SPDY
![]()
本章我将不会直接翻译Netty In Action书中的原文,感觉原书中本章讲的很多废话,我翻译起来也吃力。所以,本章内容我会根据其他资料和个人理解来讲述。
12.1 SPDY概念及背景
SPDY是Google开发的基于传输控制协议(TCP)的应用层协议,开发组正在推动SPDY成为正式标准(现为互联网草案).SPDY协议旨在通过压缩,多路复用和优先级来缩短网页的加载时间和提高安全性。(SPDY是Speedy的昵音,意思是更快)。
为什么需要SPDY?SPDY协议只是在性能上对HTTP做了很大的优化,其核心思想是尽量减少连接个数,而对于HTTP的语义并没有做太大的修改。具体来说是,SPDY使用了HTTP的方法和页眉,但是删除了一些头并重写了HTTP中管理连接和数据转移格式的部分,所以基本上兼容HTTP的。
Google在SPDY白皮书里表示要协议栈下面渗透并替换掉传输层协议(TCP),但是因为这样无论是部署起来还是实现起来暂时相当困难,因此Google准备先对应用层协议HTTP进行改进,先在SSL之上增加一个会话层来实现SPDY协议,而HTTP的GET和POST消息格式保持不变,即现有的所有服务端应用均不用做任何修改。因此在目前,SPDY的目的是为了加强HTTP,是对HTTP一个更好的实现和支持。至于未来SPDY得到广泛应用后会不会演一出狸猫换太子,替换掉HTTP并彻底颠覆整个Internet就是Google的事情了。
距离万维网之父蒂姆·伯纳斯 - 李发明并推动HTTP成为如今互联网最流行的协议已经过去十几年了(现用HTTP 1.1规范也停滞了13年了),随着现在WEB技术的飞速发展尤其是HTML5的不断演进,包括WebSockets协议的出现以及当前网络环境的改变,传输内容的变化,当初的HTTP规范已经逐渐无法满足人们的需要了,HTTP需要进一步发展,因此HTTPbis工作组已经被组织并被授权考虑HTTP 2.0,希望能解决掉目前HTTP所带来的诸多限制。而SPDY正是Google在HTTP即将从1.1跨越到2.0之际推出的试图成为下一代互联网通信的协议,长期以来一直被认为是HTTP 2.0唯一可行选择。
SPDY相比HTTP有如下优点:
- SPDY多路复用,请求优化;而HTTP单路连接,请求低效
- SPDY支持服务器推送技术;而HTTP只允许由客户端主动发起请求
- SPDY压缩了HTTP头信息,节省了传输数据的带宽流量;而HTTP头冗余,同一个会话会反复送头信息
- SPDY强制使用SSL传输协议,全部请求SSL加密后,信息传输更安全
谷歌表示,引入SPDY协议后,在实验室测试中页面加载速度比原先快64%。
支持SPDY协议的浏览器:
- Google Chrome 19+和Chromium 19+
- Mozilla Firefox 11+,从13开始默认支持
- Opera 12.10+
- Internet Explorer 11+
12.2本例子流程图
12.3 Netty中使用SPDY
支持SPDY的的ChannelPipeline如下图:
不支持SPDY的的ChannelPipeline如下图:
例子代码如下:
- package netty.in.action.spdy;
-
- import javax.net.ssl.ManagerFactoryParameters;
- import javax.net.ssl.TrustManager;
- import javax.net.ssl.TrustManagerFactorySpi;
- import javax.net.ssl.X509TrustManager;
- import java.security.InvalidAlgorithmParameterException;
- import java.security.KeyStore;
- import java.security.KeyStoreException;
- import java.security.cert.X509Certificate;
-
- 公共类 SecureChatTrustManagerFactory 扩展 TrustManagerFactorySpi {
-
- private static final TrustManager DUMMY_TRUST_MANAGER = new X509TrustManager(){
- @覆盖
- public X509Certificate [] getAcceptedIssuers(){
- 返回新的 X509Certificate [ 0 ];
- }
-
- @覆盖
- public void checkClientTrusted(X509Certificate [] chain,String authType){
-
-
-
-
- 通信System.err.println(
- “UNKNOWN CLIENT CERTIFICATE:” + chain [ 0 ] .getSubjectDN());
- }
-
- @覆盖
- public void checkServerTrusted(X509Certificate [] chain,String authType){
-
-
- 通信System.err.println(
- “UNKNOWN SERVER CERTIFICATE:” + chain [ 0 ] .getSubjectDN());
- }
- };
-
- public static TrustManager [] getTrustManagers(){
- 返回新的 TrustManager [] {DUMMY_TRUST_MANAGER};
- }
-
- @覆盖
- 受保护的 TrustManager [] engineGetTrustManagers(){
- 返回 getTrustManagers();
- }
-
- @覆盖
- protected void engineInit(KeyStore keystore) 抛出 KeyStoreException {
-
- }
-
- @覆盖
- protected void engineInit(ManagerFactoryParameters managerFactoryParameters)
- 抛出 InvalidAlgorithmParameterException {
-
- }
- }
12.4小结
这一章没有详细的按照netty in action书中来了翻译,因为我感觉书中讲的很多都不是netty的重点,鄙人英文能实现有限,所以也就把精力不放在非核心上面了。若有读者需要详细在网状中使用SPDY可以查看其它相关资料或文章,或者看本篇博文的例子代码。后面几章也会如此。