Connections
盡管你只提供了URL籽懦,OkHttp還是會使用3種方式連接到你的服務器:URL枉层,Adress速缆,和Route懂扼。
URLs
URL(比如 https://github.com/square/okhttp )是HTTP和網絡的基礎。另外它也是普遍的互聯(lián)網分散式命名方案嘹锁,它也規(guī)定了如何訪問一個互聯(lián)網資源葫录。
URL是抽象的:
它規(guī)定了訪問是明文(http)還是密文(https),但是卻沒有規(guī)定使用哪種加密算法领猾,怎么驗證其他網站的可靠性( 主機名驗證)和那些證書是可信的(SSLSocketFactory)
它沒有規(guī)定是否使用特別的代理服務器和怎么通過代理服務器的用戶驗證米同。
每個URL都指定了具體的訪問路徑(例如:/square/okhttp)和查詢請求(例如:?q=sharks$lang=en)摔竿。每個服務器都包含了大量的URL面粮。
Addresses
地址指定了一個服務器(例如:github.com)和訪問服務器所必須的靜態(tài)配置:端口,和網絡協(xié)議(HTTP/2或者SPDY)继低。
使用相同地址的URL很可能使用相同的底層TCP套接字連接熬苍。共享連接有如下好處:更低的網絡延時,更高的吞吐量(源于TCP的慢啟動),更省電柴底。OkHttp使用連接池自動重用HTTP/1.X連接和復用HTTP/2與SPDY連接婿脸。
OkHttp中地址的字段一部分來自于URL(scheme,主機名柄驻,端口)其他的來自于 OkHttpClient狐树。
Routes
Routes提供了連接到具體服務器所必須的動態(tài)的信息。IP地址(通過DNS查詢獲仍浼摺)褪迟,代理服務(通過使用的ProxySelector獲取)和所使用的TLS版本(用于HTTPS連接)答憔。
對于一個地址可能有很多Routes。例如一個服務器托管在多個數(shù)據(jù)中心在它的DNS響應中可能包含多個IP地址掀抹。
Connections
當你使用OkHttp訪問一個URL時虐拓,OkHttp將做如下的事情:
- 使用URL,配置OkHttpClient來創(chuàng)建一個address傲武,這個address規(guī)定了如何連接到服務器蓉驹。
- 試圖從連接池獲取這個address的連接
- 如果在連接池中沒有找到連接,選擇一個route連接揪利,這通常意味著通過DNS請求服務器的IP地址态兴,在必要的情況下選擇TLS版本和代理服務器。
- 如果這是一個新route疟位,它既可以通過一個套接字直連瞻润,一個TLS通道(用于HTTP上的HTTPS代理)也可以通過TLS直連必要時進行TLS握手。
- 發(fā)送HTTP請求甜刻,獲取響應绍撞。
如果在建立連接時遇到問題,OkHttp嘗試選擇另外一個route連接得院。OkHttp將釋放服務器地址無法訪問的連接傻铣。這對那些已經緩存的過時連接或者不支持的TLS版本同樣起作用(將無效的連接釋放)。
一旦接收response祥绞,連接就會被連接池收集用于接下來的連接(復用)非洲,連接池會釋放閑置的連接。