Connections
盡管你只提供了URL,OkHttp還是會使用3種方式連接到你的服務(wù)器:URL,Adress,和Route。
URLs
URL(比如 https://github.com/square/okhttp )是HTTP和網(wǎng)絡(luò)的基礎(chǔ)。另外它也是普遍的互聯(lián)網(wǎng)分散式命名方案,它也規(guī)定了如何訪問一個(gè)互聯(lián)網(wǎng)資源。
URL是抽象的:
它規(guī)定了訪問是明文(http)還是密文(https),但是卻沒有規(guī)定使用哪種加密算法,怎么驗(yàn)證其他網(wǎng)站的可靠性( 主機(jī)名驗(yàn)證)和那些證書是可信的(SSLSocketFactory)
它沒有規(guī)定是否使用特別的代理服務(wù)器和怎么通過代理服務(wù)器的用戶驗(yàn)證。
每個(gè)URL都指定了具體的訪問路徑(例如:/square/okhttp)和查詢請求(例如:?q=sharks$lang=en)。每個(gè)服務(wù)器都包含了大量的URL。
Addresses
地址指定了一個(gè)服務(wù)器(例如:github.com)和訪問服務(wù)器所必須的靜態(tài)配置:端口,和網(wǎng)絡(luò)協(xié)議(HTTP/2或者SPDY)。
使用相同地址的URL很可能使用相同的底層TCP套接字連接。共享連接有如下好處:更低的網(wǎng)絡(luò)延時(shí),更高的吞吐量(源于TCP的慢啟動(dòng)),更省電。OkHttp使用連接池自動(dòng)重用HTTP/1.X連接和復(fù)用HTTP/2與SPDY連接。
OkHttp中地址的字段一部分來自于URL(scheme,主機(jī)名,端口)其他的來自于 OkHttpClient。
Routes
Routes提供了連接到具體服務(wù)器所必須的動(dòng)態(tài)的信息。IP地址(通過DNS查詢獲?。矸?wù)(通過使用的ProxySelector獲?。┖退褂玫腡LS版本(用于HTTPS連接)。
對于一個(gè)地址可能有很多Routes。例如一個(gè)服務(wù)器托管在多個(gè)數(shù)據(jù)中心在它的DNS響應(yīng)中可能包含多個(gè)IP地址。
Connections
當(dāng)你使用OkHttp訪問一個(gè)URL時(shí),OkHttp將做如下的事情:
- 使用URL,配置OkHttpClient來創(chuàng)建一個(gè)address,這個(gè)address規(guī)定了如何連接到服務(wù)器。
- 試圖從連接池獲取這個(gè)address的連接
- 如果在連接池中沒有找到連接,選擇一個(gè)route連接,這通常意味著通過DNS請求服務(wù)器的IP地址,在必要的情況下選擇TLS版本和代理服務(wù)器。
- 如果這是一個(gè)新route,它既可以通過一個(gè)套接字直連,一個(gè)TLS通道(用于HTTP上的HTTPS代理)也可以通過TLS直連必要時(shí)進(jìn)行TLS握手。
- 發(fā)送HTTP請求,獲取響應(yīng)。
如果在建立連接時(shí)遇到問題,OkHttp嘗試選擇另外一個(gè)route連接。OkHttp將釋放服務(wù)器地址無法訪問的連接。這對那些已經(jīng)緩存的過時(shí)連接或者不支持的TLS版本同樣起作用(將無效的連接釋放)。
一旦接收response,連接就會被連接池收集用于接下來的連接(復(fù)用),連接池會釋放閑置的連接。