虽然我们想发起请求时只是提供了 URL
,但 OkHttp 会通过三种类型与web服务器进行连接:URL
,Address
和 Route
.
URLs
URLs(如 https://github.com/square/okhttp )是 HTTP 和 Internet 的基础。 除了 to being a universal, decentralized naming scheme for everything on the web,它们还指定了如何访问网络资源
-
URLs 是抽象的:
-
它们指定该
call
是明文的 (http
) 或是加密的 (https
),但没有指定该用哪个加密算法。 他们也不指定如何验证对方的证书 (HostnameVerifier) 或证书是否可以信任 (SSLSocketFactory) -
它们不指定是否应使用特定的代理服务器(proxy server),也不指定如何与该代理服务器进行身份验证
-
URLs 是具体的:
-
每个URL识别特定的路径(如
/square/okhttp
)和查询(如?q=sharks&lang=en
) -
Each webserver hosts many URLs.
Addresses
Addresses
(地址)指定一个网络服务器(如github.com )和所有必要的连接到服务器的 静态 配置:
- 端口号
-
HTTPS
设置 - 首选的网络协议(如
HTTP/2
或SPDY
)
共享相同地址的 URL
也可以共享相同的 TCP socket 连接
共享一个连接有实实在在的性能优点:
- 更低的延迟
- 更高的吞吐量(由于TCP的慢启动 )
- 保守的电量
OkHttp使用一个 ConnectionPool 自动重用 HTTP/1.x
的连接和 multiplexes HTTP/2 and SPDY connections.
在 OkHttp Address
中的的某些字段来自 URL
(scheme
,hostname
,port
),其余的则来自 OkHttpClient .
Routes
路由(Routes)提供真正连接到一个网络服务器所必需的动态信息。 This is the specific IP address to attempt (as discovered by a DNS query), the exact proxy server to use (if a ProxySelector is in use), and which version of TLS to negotiate (for HTTPS connections).
单个地址可能有许多路由:
例如,在多个数据中心托管的Web服务器可能会在其DNS响应产生多个IP地址
Connections
当你用OkHttp请求一个URL,它会做以下工作:
- 它使用
URL
和配置了的OkHttpClient
来创建 **address (地址) **
此 address 指定我们将如何连接到网络服务器 - 它试图从 连接池 中取得使用该 address 的连接
- 如果它没有找到在池中的连接,它会选择一个 route 去尝试。这通常意味着使一个
DNS
请求去获取服务器的IP地址。接下来如果需要,它会选择一个 TLS 版本和代理服务器 - 如果它是一个新的 route,它或通过建立直接的socket连接,或使用 TLS 安全通道(for HTTPS over an HTTP proxy),或直接 TLS 连接。无论如何,它的 TLS 握手是必要的
- 它发送
HTTP
请求,并读取响应
如果有连接出现问题,OkHttp 将选择另一条 route ,然后再试一次。当服务器地址的子集不可达时,OkHttp是允许进行恢复的。 当连接池是陈旧或者 TLS 版本不受支持时,这也是有用的。
- 一旦响应已经被接收到,该连接将被返回到池中,因此它可以被将来的请求进行重用
- Connections 是从池中闲置一段时间后会被驱逐
参考文章
[1] OkHttp官方wiki: Connections
网友评论