iOS探索:網路相關

熊貓超人發表於2018-12-28

HTTP

超文字傳輸協議

  • 請求報文
    WX20181228-104135@2x.png

我們來看一下請求報文的格式,首先是請求行,請求行包括方法、URL、協議文字,方法常見的有GET/POST,URL就是我們的請求地址,協議文字一般是HTTP1.1版本

然後再看一下請求頭,頭部欄位都是以key:value的形式組合在一起的,由多個首部欄位名構成首部欄位區域

之後是我們的實體主體,一般在GET請求中沒有實體主體,而在POST請求中一般會帶有實體主體

  • 響應報文

WX20181228-105115@2x.png

首先是版本,然後是狀態碼,還有狀態碼的描述,我們稱之為短語,然後下面跟請求報文一致,由此組成響應報文

HTTP的請求方式
  • GET

  • POST

  • HEAD

  • PUT

  • DELETE

  • OPTIONS

GET和POST方式的區別

一般大家都知道的是:

  • GET請求引數是以?分割拼接到URL後面的,POST請求引數實在Body裡面的

  • GET引數長度限制2048個字元,POST一般沒有該限制

  • GET請求不太安全,POST請求比較安全

但是從語義的角度來比較的話,是這樣的:

  • GET:獲取資源,是安全的、冪等的、可快取的

  • POST:處理資源,是非安全的、非冪等的、不可快取的

對應的解釋

1、安全性:不應該引起Server端的任何狀態變化,比如說我們用GET請求多次去Server端去獲取資料,不會引起Server的一個狀態變化,安全性的請求包括:GET、HEAD、OPTIONS

2、冪等性:同一個請求方法執行多次和執行一次的效果完全相同,比如說我們用GET請求多次去Server端去獲取資料,執行的效果是完全相同的,這裡需要注意的是執行的效果,冪等性的請求包括:GET、PUT、DELETE

3、可快取性:請求是否可快取,我們一般在發起一個HTTP請求的過程中,傳遞的鏈路我們是不確定的,雖然說實在一條TCP連線上,但是網路路徑在接觸或者通過閘道器包括一些代理到達我們的Server端,在這上面會涉及到方方面面的內容,往往對於一些代理伺服器會有快取,而這種快取性是官方的一種規範,即可以遵守也可以不遵守,大多數情況會遵守,所以在GET請求會有相對應的快取,可快取性的請求包括:GET、HEAD

狀態碼

1XX:通知

2XX:成功

3XX:重定向

4XX:客戶端錯誤

5XX:服務端錯誤

連線建立流程

三次握手

  • 首先是客戶端傳送一個SYN的請求報文給服務端,請求建立連線

  • 當服務端收到報文後,服務端會返回給客戶端一個同步ACK的報文

  • 當客戶端收到報文後,會返回給服務端一個ACK報文,完成三次握手

四次揮手

  • 如果是客戶端發起主動斷開,客戶端會傳送一個FIN終止報文給服務端

  • 服務端會返回給客戶端一個ACK確認報文,這時客戶端與服務端的連線就斷開了,但是服務端到客戶端這個方向,可能還會傳遞資料,在一個合適時機,服務端會向客戶端請求斷開連線

  • 服務端想要斷開連線的時候,會向客戶端傳送FIN終止報文

  • 然後客戶端會回給服務端一個確認報文,此時完成服務端與客戶端的連線斷開

HTTP的特點
  • 無連線,補償方案為HTTP的持久連線

  • 無狀態,補償方案為Cookie/Session

HTTPS與網路安全

HTTPS = HTTP + SSL/TLS

HTTPS就是在原有HTTP基礎上,在應用層下面,傳輸層上面插入了一個SSL/TLS協議中間層,為我們實現一個安全的網路機制,也就是說HTTPS是安全的HTTP

HTTPS連線建立流程
  • 首先由客戶端向服務端傳送一個報文,這個報文包括三部分,一個是客戶端支援的TLS版本,客戶端支援的加密演算法,以及一個隨機數C

  • 然後服務端返回一個握手報文訊息,包括一個商定的加密演算法,隨機數S還有一個服務端的證書

  • 客戶端收到這條報文後,首先會驗證證書,之後會組裝會話祕鑰,這個祕鑰主要通過前面的隨機數C和隨機數S以及一個預主祕鑰進行會話祕鑰的組裝

  • 然後客戶端會通過服務端的公鑰對預主祕鑰進行加密傳輸,之後服務端通過私鑰解密得到預主祕鑰,最後服務端會通過前面的隨機數C、隨機數S以及解密得到的預主祕鑰組裝會話祕鑰

  • 之後再由客戶端向服務端傳送一個加密的握手訊息,服務端傳送一個加密的握手訊息,來驗證是否加密完成

TCP/UDP

傳輸層協議

TCP:傳輸控制協議

UDP:使用者資料包協議

UDP(使用者資料包協議)

特點:

1、無連線

2、盡最大努力交付

3、面向報文,既不合並,也不拆分

功能包括:

1、複用

2、分用

3、差錯檢測

TCP(傳輸控制協議)

特點:

1、面向連線

2、可靠傳輸(無差錯,不丟失,不重複,按序到達)

3、面向位元組流

4、流量控制

5、擁塞控制

DNS解析

域名到IP地址的對映,DNS解析請求是採用UDP資料包,且明文

WX20181228-163845@2x.png

DNS解析查詢方式
  • 遞迴查詢 (一層一層的查詢)

  • 迭代查詢 (返回結果找對應查詢)

DNS劫持問題

當客戶端傳送域名去DNS伺服器去查詢時,由於是UDP資料包並且明文,就會被竊聽,這時如果有一個釣魚伺服器劫持了這次查詢,返回給你一個錯誤的IP,這時你就會訪問到一個錯誤的網頁

這裡還需要注意一個點:就是DNS劫持和HTTP是完全沒有關係的,因為DNS解析是發生在HTTP建立連線之前,並且DNS解析請求使用的事UDP資料包,埠號53

那麼如何解決DNS劫持問題呢?

  • httpDNS:DNS解析請求使用的事UDP資料包,埠號53,解決方案是使用HTTP協議向DNS伺服器的80埠進行請求,不會產生正常的DNS解析,也就不會出現DNS的劫持問題

  • 長連線:在客戶端和服務端之間建立一個長連服務,也就是一個代理伺服器,在客戶端和代理伺服器之前建立長連通道,然後再代理伺服器和服務端之間通過內網專線進行內網DNS解析,然後進行請求

DNS解析轉發問題

簡單一句話,就是我們客戶端傳送請求時,我們的DNS伺服器可能為了節省資源等原因,會轉發給其他的DNS伺服器,會出現跨網訪問,可能會慢一點

Session/Cookie

HTTP協議無狀態特點的補償

Cookie

主要是用來記錄使用者狀態,區分使用者;狀態儲存在客戶端,客戶端傳送的Cookie在http請求報文的Cookie首部欄位中,服務端設定http響應報文的Set-Cookie首部欄位

修改Cookie
  • 新Cookie覆蓋舊Cookie

  • 覆蓋規則:name、path、domain等需要與原Cookie保持一致

刪除Cookie
  • 新Cookie覆蓋舊Cookie

  • 覆蓋規則:name、path、domain等需要與原Cookie保持一致

  • 設定Cookie的expires = 過去的一個時間點,或者maxAge = 0

怎樣保證Cookie的安全性
  • 對Cookie進行加密處理

  • 只在https上攜帶Cookie

  • 設定Cookie為httpOnly,防止跨站指令碼攻擊

Session

也是用來記錄使用者狀態,區分使用者;狀態儲存在服務端 Session需要依賴於Cookie機制

至此iOS基礎相關的內容暫時告一段落,寫的可能並不是特別詳細,也會有很多的瑕疵,也多謝各位對文章問題的指出,接下來會寫一些資料結構與演算法相關的內容,屆時希望大家可以共同探討,共同進步

iOS探索系列

iOS探索:UI檢視之事件傳遞&檢視響應

iOS探索:UI檢視之卡頓、掉幀及繪製原理

iOS探索:Runtime之基本資料結構

iOS探索:Runtime之訊息轉發及動態新增方法

iOS探索:Block解析淺談

iOS探索:RunLoop本質、資料結構以及常駐執行緒實現

iOS探索:網路相關

相關文章