iOS網路層詳解和優化

FlyOceanFish發表於2018-03-15

HTTP

HTTP方法

HTTP屬於應用層。具有以下方法:

  • GET 最常見
  • HEAD 伺服器只返回頭部。比如可用於瞭解資源情況,看看某個物件是否存在,測試資源是否被修改了。
  • PUT 向伺服器寫入文件,是全部更新
  • PATCH 區域性更新。比如我們有一個UserInfo,裡面有userId、userName、等10個欄位。只編輯部分欄位進行提交的時候
  • POST 寫伺服器提交資料,通常是表單
  • TRACE 允許客戶端在最終將請求傳送給伺服器時,看看請求變成了什麼樣。因為有可能被防火牆、代理、閘道器等修改
  • OPTIONS 請求伺服器告知其支援的各種功能。比如伺服器支援哪些方法;對某些特殊資源支援哪些方法等。
  • DELETE 請伺服器上傳請求URL所指定的資源

狀態碼

  • 100-199 資訊性狀態碼,。
  • 200-299 成功狀態碼。200是最常見的
  • 300-399 重定向。302、304比較常見。比如判斷伺服器圖片是否修改了使用304
  • 400-499 客戶端錯誤。 客戶端向伺服器傳送了一些無法處理的東西,比如錯誤的請求報文,請求一個不存在的URL404
  • 400-599 伺服器內部錯誤。

Api請求過程

當我們向伺服器傳送一個請求的時候,做了以下事情:

1.DNS Lookup

2.TCP Handshake

3.TLS或SSL Handshake

4.TCP/HTTP Request/Response

image.png

DNS Lookup

DNS(Domain Name System)域名解析系統,計算機之間的通訊不認識域名,只能認識IP,所以DNS就是網路請求的第一步,通過域名獲取IP

TCP Handshake

HTTP屬於應用層協議,它不關心網路t通訊的具體細節,全部交給TCP/IP。TCP(Transmission Control Protocol 傳輸控制協議)它完成第四層傳輸層所指定的功能。

TCP三次握手連線

第一次握手:建立連線時,客戶端傳送syn包(syn=j)到伺服器,並進入SYN_SENT狀態,等待伺服器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。

第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也傳送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;

第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED(TCP連線成功)狀態,完成三次握手。

三次握手

第三次握手,主機A傳送一次確認是為了防止:如果客戶端遲遲沒有收到伺服器返回的確認報文,這時他會放棄連線,重新啟動一條連線請求;但問題是:伺服器不知客戶端沒收到,所以他會收到兩個連線請求,白白浪費了一條連線開銷。

SSL握手

SSL執行在TCP/IP層之上、應用層之下,為應用層提供加密資料通道

HTTPS比較消耗效能,主要體現在SSL握手消耗的時間。它消耗的時間是TCP握手的時間的3倍甚至更多。

SSL四次通訊握手圖

"握手階段"的所有通訊都是明文的。整個握手階段全部結束。接下來,客戶端與伺服器進入加密通訊,就完全是使用普通的HTTP協議,只不過用"會話金鑰"加密內容。

HTTP和HTTPS時間消耗

HTTP耗時 = TCP握手

HTTPs耗時 = TCP握手 + SSL握手

keep-alive

客戶端與伺服器保持連線的狀態,比如長連線

HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Thu, 11 Aug 2016 15:23:13 GMT
Keep-Alive: timeout=5, max=1000
Last-Modified: Mon, 25 Jul 2016 04:32:39 GMT
Server: Apache
複製程式碼
  • max:表示伺服器還希望為多少個事物保持此連線的活躍狀態
  • timeout:伺服器能夠保持多久活躍狀態

網路優化

  • 優化DNS解析和快取

APP內建Server IP列表,該列表可以在App啟動服務中下發更新。App啟動後的首次網路服務會從Server IP列表中取一個IP地址進行TCP連線,同時DNS解析會並行進行,DNS成功後,會返回最適合使用者網路的Server IP,那麼這個Server IP會被加入到Server IP列表中被優先使用。

Server IP列表有權重機制的,DNS解析返回的IP很明顯具有最高的權重,每次從Server IP列表中取IP會取權重最高的IP。列表中IP權重也是動態更新的,根據連線或者服務的成功失敗來動態調整,這樣即使DNS解析失敗,使用者在使用一段時間後也會選取到適合的Server IP。

  • 網路質量檢測(根據網路質量來改變策略)

根據使用者是在2G/3G/4G/Wi-Fi的網路環境來設定不同的超時引數,以及網路服務的併發數量。比如在環境比較差的情況下:

  1. 將併發數設定為一個改成序列
  2. 動態設定超時時間
  3. throttle 進行節流

AFNetworking中的throttle方法

- (void)throttleBandwidthWithPacketSize:(NSUInteger)numberOfBytes
                                  delay:(NSTimeInterval)delay;
複製程式碼
  1. 管道化連線 如果伺服器不支援管線化的話,那麼響應就會亂序。所以伺服器要支援。 AFNetworking中通過HTTPShouldUsePipelining屬性來設定,預設為NO。
  • 減少資料傳輸量

選擇合適的資料格式進行傳輸,比如使用Protocol Buffer數等,使用WebP圖片格式

  • 提供網路服務重發機制

當第一次網路請求失敗的時候,自動嘗試再次重發

  • 使用HTTP快取

部落格

FlyOceanFish

相關文章