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
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倍甚至更多。
"握手階段"的所有通訊都是明文的。整個握手階段全部結束。接下來,客戶端與伺服器進入加密通訊,就完全是使用普通的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的網路環境來設定不同的超時引數,以及網路服務的併發數量。比如在環境比較差的情況下:
- 將併發數設定為一個改成序列
- 動態設定超時時間
- throttle 進行節流
AFNetworking中的throttle方法
- (void)throttleBandwidthWithPacketSize:(NSUInteger)numberOfBytes
delay:(NSTimeInterval)delay;
複製程式碼
- 管道化連線
如果伺服器不支援管線化的話,那麼響應就會亂序。所以伺服器要支援。
AFNetworking中通過
HTTPShouldUsePipelining
屬性來設定,預設為NO。
- 減少資料傳輸量
選擇合適的資料格式進行傳輸,比如使用Protocol Buffer數等,使用WebP圖片格式
- 提供網路服務重發機制
當第一次網路請求失敗的時候,自動嘗試再次重發
- 使用HTTP快取