深入理解OkHttp3:(三)连接(Connections)

尽管我们只提供给OkHttp一个URL,但OkHttp计划使用三种类型来连接到服务器:URL、地址(Address)、和路由(Route)。

URLs

URL(比如https://github.com/square/okhttp)是HTTP和互联网的基础。除了是web上所有事物的通用的、分散的命名方案(DNS)之外,它们还指定了如何访问web资源。

URL是抽象的。

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

URL也是具体的。

  • 每个URL标识一个特定的路径(path)(比如/square/okhttp)和查询(query)(比如?q=sharks&lang=en)。每个web服务器都承载许多url。

地址(Addresses)

地址指定一个webserver(如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来创建一个地址。这个地址指定我们如何连接到webserver。
  • 它试图从连接池检索具有该地址的连接。
  • 如果它没有在连接池中找到连接,它会选择要尝试的路由。这通常意味着发出DNS请求以获取服务器的IP地址。然后在必要时选择TLS版本和代理服务器。
  • 如果是新的路由,它可以通过构建直接套接字连接、TLS隧道(HTTP代理上的HTTPS)或TLS连接来连接。它会在必要的时候建立握手。
  • 它发送HTTP请求并读取响应。

如果连接有问题,OkHttp将选择另一个路由并再次尝试。这允许OkHttp在服务器地址的子集不可用时恢复。当池连接过时或尝试的TLS版本不受支持时,这点也很有受用。

一旦接收到响应,连接就会返回到池中,以便在将来的请求中重用它。在一段时间不活动之后,连接将从池中退出。

 

本文为翻译文章:原文地址:https://github.com/square/okhttp/wiki/Connections

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值