Okhttp解析(四)网络连接的建立

Okhttp作为一款底层网络访问框架,它和Volley等上层网络框架不一样的地方在于,Okhttp自己实现了与服务端的TCP连接,并在此连接上根据HTTP协议的规范与服务端进行HTTP协议及内容的请求和响应。Okhttp将请求内容通过修正,填充等方式封装成符合HTTP规范的HTTP请求内容,通过TCP连接,将内容以流的方式输出给服务端,并从服务端返回的响应流中读取出响应内容,根据HTTP协议解析并作出相应的响应。

Okhttp连接建立的情况区分

Okhttp支持HTTP 1.0/1.1, HTTP2,SPDY 三种HTTP协议,同时支持加密传输HTTPS,以及SOCKS代理和HTTP代理。那么在连接建立时就需要处理它们组合时的处理操作了。这里的连接根据代理类型做主要区分。

无代理

无代理的HTTP请求,与服务器建立TCP连接。

无代理的HTTPS加密请求,与服务器建立TCP连接,然后建立TLS加密连接。

无代理的HTTP2/SPDY请求,与服务器建立TCP连接,然后建立TLS加密连接,然后创建帧连接。

SOCKS代理

SOCKS代理服务器会将请求信息转发给目标HTTP服务器,目标HTTP服务器返回信息之后,SOCKS代理服务器再将响应信息返回给客户端。SOCKS代理服务器只会对信息进行转发,而不会解析修改。

SOCKS代理下的HTTP请求,与SOCKS代理服务器建立TCP连接。

SOCKS代理下的HTTPS加密请求,通过SOCKS代理服务器与HTTP服务器建立连接,然后建立TLS加密连接。

SOCKS代理下的HTTP2/SPDY请求,通过SOCKS代理服务器与HTTP服务器建立连接,然后建立TLS加密连接,然后创建帧连接。

HTTP代理

HTTP代理下的HTTP请求,与HTTP代理服务器建立TCP连接。HTTP代理服务器会解析请求的内容信息,并根据这些信息去请求目标HTTP服务器,目标HTTP2服务器返回信息之后,再解析响应内容,然后再将这些响应信息返回给客户端。HTTP服务器会解析和修改请求和响应的内容。

HTTP代理下的HTTPS加密请求,与目标服务器建立通过HTTP代理的隧道连接,然后建立TLS加密连接。因为是加密连接,HTTP代理服务器不再解析请求和响应内容,而只是转发数据。

HTTP代理下的HTTP2/SPDY请求,与目标服务器建立通过HTTP代理的隧道连接,然后建立TLS加密连接,然后创建帧连接。因为是加密连接,HTTP代理服务器不再解析请求和响应内容,而只是转发数据。

虽然情况分为很多种,但是重要的部分只是以下几个阶段。

根据是否需要代理,创建Socket连接。

进入Socket连接阶段,判断是否需要TLS连接,进入TLS连接处理。

进入TLS连接处理阶段,判断是否需要建立隧道连接。

完成TLS握手,判断是否需要帧连接。

关于SOCKS代理和HTTP代理区别

Socks代理

是全能代理,就像有很多跳线的转接板,它只是简单地将一端的系统连接到另外一端。支持多种协议,包括http、ftp请求及其它类型的请求。它分socks 4 和socks 5两种类型,socks 4只支持TCP协议而socks 5支持TCP/UDP协议,还支持各种身份验证机制等协议。其标准端口为1080。socks代理相应的采用socks协议的代理服务器就是SOCKS服务器,是一种通用的代理服务器。Socks是个电路级的底层网关,是DavidKoblas在1990年开发的,此后就一直作为Internet RFC标准的开放标准。Socks不要求应用程序遵循特定的操作系统平台,Socks 代理与应用层代理、 HTTP 层代理不同,Socks代理只是简单地传递数据包,而不必关心是何种应用协议(比如FTP、HTTP和NNTP请求)。所以,Socks代理比其他应用层代理要快得多。它通常绑定在代理服务器的1080端口上。如果您在企业网或校园网上,需要透过防火墙或通过代理服务器访问Internet就可能需要使用SOCKS。一般情况下,对于拨号上网用户都不需要使用它。注意,浏览网页时常用的代理服务器通常是专门的http代理,它和SOCKS是不同的。因此,您能浏览网页不等于您一定可以通过SOCKS访问Internet。 常用的防火墙,或代理软件都支持SOCKS,但需要其管理员打开这一功能。如果您不确信您是否需要SOCKS或是否有SOCKS可用,请与您的网络管理员联系。

HTTP代理

www对于每一个上网的人都再熟悉不过了,www连接请求就是采用的http协议,所以我们在浏览网页,下载数据(也可采用ftp协议)是就是用http代理。它通常绑定在代理服务器的80、3128、8080等端口上。

Okhttp连接建立的流程

有了以上对HTTP连接建立的大概了解后,我们接下来分析代码就会更容易理解了。我们从RealConnection的connect方法开始

可以看到上面很简单,首先创建一个底层Socket,然后进入Socket连接阶段。我们继续看connectSocket

可以看到这里分为3个步骤。

建立了底层Socket的连接,并获得输入和输出流。

判断是否进行TLS握手连接。HTTPS,HTTP2,SPDY三种情况下需要建立TLS加密连接。

判断是否需要创建帧连接,并进行帧连接握手。HTTP2,SPDY情况下需要建立帧连接。

接着我们进入建立TLS连接的过程,

可以看到TLS连接这个阶段主要做了以下操作。

判断是否需要建立隧道连接。在HTTP代理下,HTTPS,HTTP2,SPDY情况下,要建立隧道连接

创建SSLSocket这个TLS连接,并开始握手。

获取握手后的返回信息,例如连接协议的商定,版本信息,加密算法,证书的验证等。

TLS成功建立后,更新socket,HTTP协议,输入输出流等信息。

释放资源,TLS连接成功后的资源清理和失败后的关闭操作。

接下来我们看看是如何建立隧道连接的。

可见隧道连接的建立过程,是通过封装的Http1xStream流对象,输出建立隧道连接所需要的请求头和请求行信息,去请求建立隧道连接,这个过程中,可能需要证书的验证,因此,在while循环中,根据返回的响应信息重新创建请求,并提交请求,知道返回隧道创建成功或抛出异常。

到这里的话,Okhttp网络连接的建立过程就讲解完成了。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180126G04WVN00?refer=cp_1026

相关快讯

扫码关注云+社区