1. 程式人生 > >OkHttp完全解析(四)連線Connections

OkHttp完全解析(四)連線Connections

儘管程式只提供了URL,但是OkHttp在連線web伺服器時會使用三種類型:URL, 地址Addresses,路線Route。

[原始碼分析:4.2] 連線引擎HttpEngine

5.1  URL

URLs是抽象的

   * 它們指定了呼叫是明文的http還是加密的https,而不是那個加密規則系統被使用。它們也沒有指定如何驗證數字證書,或者應該能夠信任哪個數字證書。

   * 它們沒有指定是否特定的代理伺服器會被使用或者如何證明一個代理伺服器。

URLs也是固定的,每個URLs表明一個特定的地址,和查詢,每個web伺服器持有許多個URL。

5.2  Address

地址指定了一個web伺服器,所有的靜態配置需要連線到伺服器:埠號,https設定,優先順序網路協議(像 HTTP/2 或者 SPDY)

共享相同地址的URL也可能共享相同的潛在TCP socket連線。 共享一個連線有巨大的效能優勢:低延時,高生產力(因為TCP啟動緩慢),省電。OKHttp使用一個可以自動重用chongyo9ngHTTP/1.x 連線,多路傳輸的HTTP/2連線,SPDY連線的連線池。

在OkHttp中,地址的有些屬性來自URL,剩下的來自OkHttpClient。

5.3  Route

路線提供實際連線到web伺服器的動態資訊。包括連線的IP地址,具體使用的代理伺服器,以及協商的TLS版本。

對於一個地址而言,可能有很多的線路,例如,一個託管在多個數據中心的web伺服器在其DNS相應中可能產生多個IP地址。

5.4  Connections

當你通過OkHttp請求一個URL時,會發生下面的事情:

   1.通過URL和配置的OkHttpClient建立一個地址。這個地址指定如何連線到web伺服器。

   2.試圖根據這個地址從連線中恢復一個連線。

   3.如果沒有在連線池中找到連線,則選擇一條線路連線。這就意味著建立一個DNS請求,獲取伺服器的IP地址。 然後根據需要,選擇一個TLS版本,和代理伺服器。

   4.如果這是一條新的線路,則通過建立一個直接的socket連線,一個TLS隧道(對於HTTPS而言是一個HTTP代理),或者建立一個直接的TLS連線。然後進行TLS握手。

   5.傳送請求,獲取響應。如果連接出問題,OkHttp

會選擇另外一條路線重試。這就允許OkHttp在伺服器地址的子集不可達時進行恢復。 在連線池中的連線陳舊或者嘗試的TLS版本不支援時,這一功能也是非常有用的。

    注:TLS: 安全傳輸層協議(TLS)用於在兩個通訊應用程式之間提供保密性和資料完整性。該協議由兩層組成: TLS 記錄協議(TLS Record)和 TLS 握手協議(TLS Handshake)。