okhttp翻译计划(二)--Connections

第二部分:Connections

Connections

虽然你只提供了URL,OkHttp也可以有三种方式连接你的网站服务器分别是:URL,地址和路由

URLs

URLs(比如 https://github.com/square/okhttp) 是HTTP和互联网的基础.除了是一个应用于网络上的所有事物的通用的,分散式的命名规则,它还规定了怎样去访问一个网络资源.
URLs是抽象的:

  • 它明确规定发起的请求可以是明文的(http)或者是密文的(https),但是没说应该使用哪一种加密算法.它也没规定怎样验证证书(the HostnameVerifier)或者应该信任哪个证书(the SSLSocketFactory).
  • 它也没有规定是否应该使用一个特定的代理服务和如何认证一个代理服务

同时URL也是具体的:每个URL都支持一个具体的路径(比如/squre/okhttp)和查询操作(比如?q=sharks&lang=en).每个网站服务器都有许多URLs.

Address

地址描述了一个网站服务器(比如github.com)和所有连接服务器所需的静态配置:端口号,HTTPs设置和首选的网络通讯协议(比如HTTP/2或者SPDY).
共享相同的地址的URLs可能也会共享相同的底层TCP套接字连接.共享同一个连接可以带来可观的性能优势:低延时,高吞吐量(由于TCP缓慢的启动)和节省电量.OkHttp使用了一个连接池ConnectionPool来自动的复用HTTP/1.x连接,多元的HTTP/2和SPDY连接.
OkHttp中地址的一部分来自于URL(连接方案(译者注:HTTP或者是HTTPs),主机名,端口),其余的部分来自于OkHttpClient.

Routes

路由为实际中连接网站服务器提供了必要的动态信息.这都包括要尝试访问的具体IP地址(可向DNS服务器询问得知),使用精确的代理服务器(在使用了ProxySelector的情况下)和协商使用哪个版本的TLS(传输层安全协议)(在使用HTTPs连接的情况下).
可能一个地址可由多个路由连接.举一个例子,一个网站服务器存在于多个数据中心,它就会在DNS的响应中生成多个IP地址.

Connections

当你使用Okhttp请求一个URL时,以下是它所做的事情:

  1. 使用URL和配置好的OkHttpClient来生成一个地址(address).这个地址会指定我们将怎样去连接网站服务器.
  2. 尝试用这个地址从**连接池(connection pool)**里取出一个连接
  3. 如果没有在连接池里找到一个已有的连接,它会选择一个**路由(route)**去尝试.这通常意味着要向DNS服务器发送请求来拿到相应的IP地址.然后选择一个TLS版本,必要的话还会选择代理服务器.
  4. 如果这是一个新的路由,它会由一个直接的套接字连接或者一个TLS隧道(HTTPS对HTTP的代理)或是一个直连的TLS连接来构建.这使得TLS握手变得有必要.
  5. 发送HTTP请求并读取响应.

如果连接出现了问题,OkHttp将会选择另一个路由再次尝试.这使得当服务器端地址的子集不可达时允许OkHttp重新开始.这对于当连接池中的连接过时或者尝试的一个TLS版本不被支持时很有用.
一旦收到响应,连接将会返回连接池,这会使得连接可以被复用.在一个不活跃的周期之后,连接将被清除.