Connections
虽然您只提供URL,但OkHttp使用三种类型计划其与您的Web服务器的连接:URL,地址和路由。
URLs
除了作为Web上所有内容的通用,分散的命名方案之外,它们还指定了如何访问Web资源。
URLs 是抽象的:
- 它们指定呼叫可以是明文(http)或加密(https),但没有指定使用哪种加密算法。它们也没有指定如何验证对等方的证书(HostnameVerifier)或可以信任哪些证书(SSLSocketFactory)。
- 它们不指定是否应使用特定代理服务器或如何使用该代理服务器进行身份验证。
它们也具体:每个URL标识一个特定的路径(如/ square / okhttp)和查询(如?q = sharks&lang = en)。每个Web服务器都托管许多URL。
Addresses
地址指定Web服务器(如github.com)以及连接到该服务器所需的所有静态配置:端口号,HTTPS设置和首选网络协议(如HTTP / 2或SPDY)。
URLs 共享相同地址也可以共享相同的底层TCP套接字连接。共享连接具有显着的性能优势:更低的延迟,更高的吞吐量(由于TCP慢启动)和节省的电池。OkHttp使用连接池,它自动重用HTTP / 1.x连接并多路复用HTTP / 2和SPDY连接。
在OkHttp中,地址的某些字段来自URL(方案,主机名,端口),其余字段来自OkHttpClient。
Routes
Routes 提供实际连接到Web服务器所需的动态信息 。特定IP地址(由DNS查询发现),确切的代理服务器(如果正在使用ProxySelector),具体版本的TLS协议(用于HTTPS连接)。
单个地址可能有很多路由。例如,托管在多个数据中心中的Web服务器可能会在其DNS响应中生成多个IP地址。
Connections
当您使用OkHttp请求 URL 时,这是 Connections 的作用:
- Connection 使用 URL 和配置的 OkHttpClient 来创建 address。address 指定我们将如何连接到Web服务器。
- Connection 尝试从连接池中取出具有该地址的连接。
- 如果在池中找不到连接,则会路由。这通常意味着发出 DNS 请求,获取服务器的IP地址。然后,如有必要,它会选择 TLS 版本和代理服务器。
- 如果 Connection 是新路由,则通过构建直接套接字连接,TLS 隧道连接(通过HTTP代理的HTTPS)或直接 TLS 连接。需要时,它会进行 TLS 握手。
- 发送HTTP请求并读取响应。
如果连接出现问题,OkHttp 将选择另一条路线并再尝试。这允许 OkHttp 在服务器地址子集的一条地址无法访问时,使用另一条进行恢复。当连接池的连接过时或者不支持当前的TLS版本时,它也非常有用。
收到响应后,连接将存储到连接池中,以便可以将其重新用于将来的请求。一段时间不活动后,该连接将被连接池去除。
Word List
- URLs (like
https://github.com/square/okhttp
) are fundamental to HTTP and the Internet. - In addition to being a universal, decentralized naming scheme for everything on the web, they also specify how to access web resources.
- They specify that the call may be plaintext (
http
) or encrypted (https
), but not which cryptographic algorithms should be used. - They're also concrete: each URL identifies a specific path (like
/square/okhttp
) and query (like?q=sharks&lang=en
). Each webserver hosts many URLs. - URLs that share the same address may also share the same underlying TCP socket connection.
- Sharing a connection has substantial performance benefits
- lower latency, higher throughput (due to TCP slow start) and conserved battery.
- OkHttp uses a ConnectionPool that automatically reuses HTTP/1.x connections and multiplexes HTTP/2 and SPDY connections.
- Routes supply the dynamic information necessary to actually connect to a webserver
- 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).
- If it's a new route, it connects by building either a direct socket connection, a TLS tunnel (for HTTPS over an HTTP proxy), or a direct TLS connection. It does TLS handshakes as necessary.
- This allows OkHttp to recover when a subset of a server's addresses are unreachable.
- Connections are evicted from the pool after a period of inactivity.