OKHTTP(三) Connections

Connections

虽然您只提供URL,但OkHttp使用三种类型计划其与您的Web服务器的连接:URL,地址和路由。

URLs

URL(如https://github.com/square/okhttp)是HTTP和Internet的基础。
除了作为Web上所有内容的通用,分散的命名方案之外,它们还指定了如何访问Web资源。
网址是抽象的:

  • 它们指定呼叫可以是明文(http)或加密(https),但不能使用哪种加密算法。
    它们也没有指定如何验证对等方的证书(HostnameVerifier)或可以信任哪些证书(SSLSocketFactory)。
  • 它们未指定是否应使用特定代理服务器或如何使用该代理服务器进行身份验证。

它们也具体:每个URL标识一个特定的路径(如/ square / okhttp)和查询(如?q = sharks&lang = en)。
每个Web服务器都托管许多URL。

Addresses

地址指定Web服务器(如github.com)以及连接到该服务器所需的所有静态配置:端口号,HTTPS设置和首选网络协议(如HTTP / 2或SPDY)。
共享相同地址的URL也可以共享相同的底层TCP套接字连接。
共享连接具有显着的性能优势:更低的延迟,更高的吞吐量(由于TCP慢启动)和节省的电池。
OkHttp使用ConnectionPool,它自动重用HTTP / 1.x连接并多路复用HTTP / 2和SPDY连接。

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

Routes

路由提供实际连接到Web服务器所需的动态信息。这是要尝试的特定IP地址(由DNS查询发现),要使用的确切代理服务器(如果正在使用ProxySelector),以及要协商的TLS版本(用于HTTPS连接)。
单个地址可能有很多路由。
例如,托管在多个数据中心中的Web服务器可能会在其DNS响应中生成多个IP地址。

Connections

当您使用OkHttp请求URL时,它的作用如下:

  • 它使用URL并配置OkHttpClient来创建地址。
    此地址指定我们将如何连接到Web服务器。
  • 它尝试从连接池中检索具有该地址的连接。
  • 如果它在池中找不到连接,则会选择要尝试的路由。
    这通常意味着发出DNS请求以获取服务器的IP地址。
    然后,如有必要,它会选择TLS版本和代理服务器。
  • 如果它是新路由,则通过构建直接套接字连接,TLS隧道(通过HTTP代理的HTTPS)或直接TLS连接来连接。
    它根据需要进行TLS握手。
  • 它发送HTTP请求并读取响应。

如果连接有问题,OkHttp将选择另一条路线并再试一次。这允许OkHttp在服务器地址的子集无法访问时进行恢复。当池化连接过时或者不支持尝试的TLS版本时,它也很有用。
收到响应后,连接将返回到池中,以便可以将其重新用于将来的请求。
经过一段时间的不活动后,连接将从池中逐出。