尽管你只提供了URL,OkHttp在规划连接服务器的连接时使用了三种类型:URL,Address和Route。
URLs
URLs是HTTP和网络的最基本的。除了作为一个通用的,网络资源的分散命名机制,它们也规定了如何访问网络资源。
URLs是抽象的:
- 它们规定了调用可能是明文(http)或密文(https),但是没有规定应该使用哪个加密算法。也没有规定如何验证对等的证书(HostnameVerifier)或者哪个证书可被信任(SSLSocketFactory)。
- 它们没有规定是否一个特定的代理服务器可以使用或如何认证代理服务器。
它们也是具体的:每一个URL确定一个特定路径(像/square/okhttp)和查询(像?q=sharks&lang=en)。每个服务器有很多URL。
Addresses
Addresses规定了服务器(像github.com)和所有连接服务器需要的静态配置:端口号,HTTPS设置和优先网络协议(像HTTP/2或SPDY)。
共享相同address的URLs也可能共享相同的下层TCP socket连接。共享一个连接有巨大的性能好处:低延迟,高吞吐量(因为TCP启动慢)和节省电源。OkHttp使用ConnectionPool来自动复用HTTP/1.X连接和多路传输HTTP/2和SPDY连接。
在OkHttp中,address的一些字段来自URL(机制,主机名,端口),剩下的来自OkHttpClient。
Routes
Routes提供了真正连接到服务器所需要的动态信息。这是明确的要尝试的IP地址(通过DNS查询发现),明确的要使用的代理服务器(如果使用了ProxySelector)以及什么版本的TLS来协商(针对HTTPS连接)。
对于一个地址有可能有很多路由,一个存在多个数据中心的网络服务器可能在它的DNS响应中产生多个IP地址。
Connections
当你使用OkHttp请求一个URL时,下面是它所做的:
- 它使用URL和配置的OkHttpClient来创建一个address。这个address规定了如何连接到服务器。
- 它尝试用这个address从连接池中获取一个连接。
- 如果它没有在池中找到一个连接,它会选择一个route来尝试。这通常意味着创建一个DNS请求来获取服务器的IP地址。如果需要,它之后会选择一个TLS版本和代理服务器。
- 如果这是一个新route,它会通过构建一个直接的socket连接或一个TLS隧道(对于HTTP代理上的HTTPS)或一个直接的TLS连接来进行连接。如果需要它会执行TLS握手。
- 它发送HTTP请求然后读取响应。
当连接出现问题时,OkHttp会选择另外一个route进行尝试。这使得OkHttp可以在服务器部分地址无法访问时恢复。它同时对于当连接池过期或尝试的TLS版本不支持时有用。
一旦接收到响应,连接就会返回到池中,这样它可以在之后的请求复用。连接空闲一段时间会从池中移除。
原文链接:
https://github.com/square/okhttp/wiki/Connections
OkHttp官方文档系列文章: