HTTP流量,SPDY的代理连接

有了SPDY协议,客户端与代理之间就又多了一种选择,除了明文的不加密的传统的HTTP,和效率低下的Stunnel模式,还可以用Shrpx+Squid跑SPDY协议。其过程是这样的

[客户端] -SSL CLIENT HELLLO-> [代理]
[客户端] <-SSL SERVER HELLO/CERTIFICATE/NPN (HTTP/1.1, SPDY/3, SPDY/2)等 [代理]
[客户端] -SSL CLIENT CERTIFICATE/NPN(SPDY/3)等-> [代理]
[客户端] <-SSL SERVER FINISHED- [代理]
 # 与代理建立好SSL连接,通过NPN选择了选择SPDY3协议
[客户端] -SSL加密的SYN FRAME(Stream1 HTTP GET)-> [代理] -HTTP GET-> [服务器1]
[客户端] -SSL加密的SYN FRAME(Stream2 HTTP GET)-> [代理] -HTTP GET-> [服务器2]
[客户端] <-SSL加密的SYN REPLY FRAME(Stream2 200 OK)- [代理] <-200 OK- [服务器2]
[客户端] <-SSL加密的SYN REPLY FRAME(Stream1 200 OK)- [代理] <-200 OK- [服务器1]

可见利用SPDY协议,客户端与代理之间的数据传输就是SSL加密的,而且避免了每个HTTP请求都建立新的TCP连接,重新进行SSL握手。而代理与服务器因为都在墙外,所以HTTP明文交流并没有任何问题。

HTTPS流量,SPDY的代理连接

SPDY协议的SYN FRAME除了支持HTTP GET/POST这些之外,HTTP CONNECT也是可以的。除了需要包装成SPDY的各种FRAME之外,HTTP协议自身的语义其实都是一样的。其交互过程是这样的:

客户端] -SSL CLIENT HELLLO-> [代理]
[客户端] <-SSL SERVER HELLO/CERTIFICATE/NPN (HTTP/1.1, SPDY/3, SPDY/2)等 [代理]
[客户端] -SSL CLIENT CERTIFICATE/NPN(SPDY/3)等-> [代理]
[客户端] <-SSL SERVER FINISHED- [代理]
 # 与代理建立好SSL连接,通过NPN选择了选择SPDY3协议
[客户端] -SSL加密的SYN FRAME(HTTP CONNECT)-> [代理] -TCP SYN-> [服务器]
[客户端] <-SSL加密的SYN REPLY FRAME(200 OK)- [代理] <-TCP SYN ACK- [服务器]
[客户端] -SSL加密的DATA FRAME(HTTP GET)-> [代理] -HTTP GET-> [服务器]
[客户端] <-SSL加密的DATA FRAME(200 OK)- [代理] -200 OK-> [服务器]

完成了HTTP CONNECT之后,对应的SPDY STREAM就是自由的了。无论发送什么样的DATA FRAME(SPDY的FRAME的一种,传输二进制数据流)给代理,代理就直接转给服务器。服务器无论返回什么样的数据,代理也以DATA FRAME的形式转给客户端。这个SPDY STREAM和一个TCP连接就一样了。除了可以用来发HTTP GET之外,跑什么样的协议都行了,代理反正也不管里面是什么,它只管转发DATA FRAME。


相关内容

    暂无相关文章