OkHttp学习三——Connections

在使用OkHttp时,虽然我们只提供URL,但是OkHttp将会使用三种方式连接到服务器,这三种方式是:URL,Address和Route

URLs

URLs(类似于:https://github.com/square/okhttp)是HTTP协议和互联网的基础。

除了为网上的所有内容提供一个通用又分散的命名方案,它也指定了如何访问网络资源。

URLs是抽象的:

  • URLs指定了请求是明文的(http)或者是加密的(https),但是不需要使用加密算法。他们也不需要指定如何验证证书(hostnameVerifier),或者哪些证书可以信任(SSLSocketFactory)。
  • 不指定是否使用特殊代理服务器或者如何验证代理服务器。

他们也是具体的:每个URL都是一个特定的路径(比如/square/okhttp)和查询(如:?q=sharks&lang=en)。每个服务器有许多的URL。

Addresses

地址指定了服务器(如:github.com)和所有连接到服务器的必要静态配置:端口号、HTTPS设置和首选的网络协议(如:HTTP/2或SPDY)。

 

分享同一个地址(Address)的URL也会共享同一个底层的TCP套接字连接。分享同一个连接有很多性能优势:更低的延迟、更高的吞吐量(由于TCP慢启动)以及电池保护。OkHttp使用一个连接池,连接池会自动复用Http/1.x连接和多路HTTP/2以及SPDY连接。

 

在OkHttp中,地址的某些字段来自于URL(scheme(方案),主机名,端口),其余部分来自OkHttpClient。

Routes

路由提供实际连接到服务器的动态信息。这些信息包括:指定的IP地址(通过DNS查询发现),精确的代理服务器(如果使用了ProxySelector)以及TLS版本号(用于HTTPS连接)。

单个地址会有多个路由。例如,托管在多个数据中心的Web服务器也许会在DNS响应中有多个IP地址。

 

Connections

当我们使用OkHttp向一个url发出请求时,以下是OkHttp所做的工作:

  1. OkHttp使用URL配置OkHttp客户端来创建一个address(地址),这个地址指定了我们如何连接网络服务器。
  2. OkHttp会尝试在连接池中检索拥有该地址的连接(connection)。
  3. 如果OkHttp没有在连接池中找到该连接,它将会尝试使用路由Route。这通常是指使用DNS请求获取服务器的IP地址,然后,如果必要,还会选择TLS版本和代理服务器。
  4. 如果这是一个新的路由,它的连接将会通过创建一个直接的socket connection套接字连接,这是一个TLS通道(用过HTTP代理的HTTPS),或者一个直接的TLS连接。根据需要,OkHttp会进行TLS握手。
  5. OkHttp会发送HTTP请求以及读取响应。

如果连接发生问题,OkHttp将选择另一个路径并重试。这表示,当一个服务器的部分地址无法访问时允许OkHttp恢复。当连接池过时或者TSL版本不支持时OkHttp仍可使用。

一旦接收到响应,连接(connection)就会被返回到连接池(connection pool)中,以便之后的请求可以再次使用该连接。连接一段时间不活跃后会被移出连接池。

 

posted @ 2020-03-20 14:22  pyt123456  阅读(213)  评论(0)    收藏  举报