iOS開發小記網絡篇(持續更新)

NO IMAGE

工作需要,網絡接觸的不算深入,留個坑後續填上~

五層協議體系


iOS開發小記網絡篇(持續更新)

其中TCP/IP是一類協議系統,是用於網絡通信的協議集合。TCP/IP協議傳統認為值四層協議

iOS開發小記網絡篇(持續更新)

HTTP和HTTPS


  • 什麼是HTTP?

HTTP是客戶端瀏覽器或者其他程序與Web服務器之間的應用層通信協議。在Internet上的Web服務器上存放的內容都是超文本信息,客戶端需要通過HTTP協議傳輸要訪問的超文本信息。

  • GET、POST

GET和POST是最常用的請求方式,有以下區別:

  1. GET通常用於查詢、獲取數據,而POST請求則用於發送數據。
  2. GET請求的參數明文放在URL中,因此不能使用GET請求傳輸敏感數據,POST請求的參數保存在請求頭中(也是明文),相對安全一些。
  3. GET請求參數會被緩存,但是POST不會。
  4. GET請求參數類型只能為ASCII字符,POST沒有限制。
  5. GET請求參數有長度限制,POST沒有。
  • HTTP的缺點
  1. 通信內容為明文,即未加密,內容可能被竊聽。
  2. 通信雙方沒有驗證身份,可能會被冒充。
  3. 接受的報文無法確保完整性,可能中途被篡改。
  • HTTPS

針對上述安全性問題,在HTTP協議基礎上,通過在HTTP和TCP中間加了一層SSL加密層,從而誕生了HTTPS。針對上述三個問題,HTTPS增加了通信加密、證書認證和完整性保護。

  • HTTPS的握手過程
  1. 客戶端通過HTTPS訪問Web服務器,要求建立SSL連接。
  2. Web服務器收到請求後,會將網站的證書信息(包含公鑰)發送給客戶端。
  3. 客戶端收到後判斷公鑰是否有效,無效則警告,有效則隨機生成數串,並且根據此數串生成共享密鑰。
  4. 客戶端通過公鑰對數串加密,然後發送給Web服務器。
  5. Web服務器接收到加密報文後,通過私鑰解密報文,並根據此數串生成共享密鑰。此時服務器和客戶端擁有相同的共享密鑰,並以此加密通信。
  • HTTP和HTTPS區別
  1. HTTPS協議需要在CA上申請證書,一般需要收費。
  2. HTTP是明文傳輸,HTTPS是SSL加密傳輸。
  3. 連接方式不同,端口號也不同,HTTP是80端口,HTTPS是443。
  4. HTTP是無狀態的,HTTPS需要身份驗證。
  5. HTTPS握手階段比較耗時,會延長加載時間。
  • HTTP能實現長連接麼?

也能,但是並非真正的全雙工通信,它基於客戶端的長輪詢或者Long poll來實現的,比較消耗資源,也無法讓服務器主動通知客戶端。

TCP的三次握手和四次揮手


  • TCP連接的建立(三次握手)

最開始的時候客戶端和服務器都是處於CLOSED狀態。主動打開連接的為客戶端,被動打開連接的是服務器。忽略報文內容,大致步驟為:

  1. 客戶端告訴服務器需要建立TCP連接。
  2. 服務器收到報文後,如果同意連接,則發出確認報文。
  3. 客戶端收到確認後,告訴服務器收到確認,此後雙方開始通信。
  • 兩次握手為什麼不行?

主要是為了防止已經失效的請求報文突然又傳送給服務器,從而建立錯誤連接。
如果是兩次握手,假設這樣的場景,客戶端發送一個請求報文,在某一個網絡節點因為網絡原因被滯留,客戶端遲遲沒有收到確認報文,以為服務器沒有收到,從而重新發送了一次請求報文,經歷兩次握手後雙方建立連接,傳輸數據後關閉連接。後來突然此前滯留的請求報文網絡通暢又到達了服務器,這個報文本該是失效的,但是服務器經歷兩次握手後再次建立連接,但實際上客戶端並不需要傳數據,導致服務器空等,造成資源浪費。而如果是三次握手,即使服務器確認了失效的報文,客戶端沒有再次確認,也是不會建立連接的。

  • TCP連接的釋放(四次揮手)

數據傳輸完畢後,雙方都可釋放連接。最開始的時候,客戶端和服務器都是處於ESTABLISHED狀態,然後客戶端主動關閉,服務器被動關閉。忽略報文內容,大致步驟如下:

  1. 客戶端發出連接釋放報文,並且停止發送數據。
  2. 服務器端接收到報文後,發出確認報文嗎,然後將最後的數據發送完畢後。
  3. 服務器發送完數據後發送連接釋放報文,等待客戶端的確認。
  4. 客戶端收到連接釋放報文後,必須發出確認報文,此時TCP連接還沒釋放,需要等2∗ MSL(最長報文段壽命)的時間後,才會進入CLOSE狀態。
  5. 服務器端接收到確認報文後,立即進入CLOSE狀態。
  • 為什麼客戶端最後還要等待2MSL?

客戶端之所有接收到服務器發送的連接釋放報文後必須發出確認報文,是因為服務器在發送連接釋放報文後,如果沒有得到客戶端的確認,會認為報文發送失敗,那麼它會重新發送連接釋放報文,所以客戶端不會立即關閉,如果2∗ MSL時間內沒有再接收到服務器發送的連接釋放報文,那麼客戶端認為服務器已經接收到了確認報文,則結束TCP連接。2MSL就是一個發送和一個回覆所需的最大時間。

  • 三次揮手為什麼不行?

由於TCP是全雙工通信,任意一方都能發送數據,一方想要關閉連接必須等待數據發送完畢,也就需要另一方同意,如果是三次揮手,服務器端發送了連接釋放報文時,此時客戶端和服務端均半關閉狀態,客戶端接收到連接釋放報文後如果不發送確認報文,服務器端無法確定客戶端收到了關閉的消息,當前僅僅只有客戶端知道雙方可以關閉了,但是服務器端並不知道,所以需要發一次確認報文,並且客戶端通過2MSL時間來判斷服務器端也知道了此時雙方可以關閉,最終雙方斷開此次鏈接。

Socket和WebSocket


  • 什麼是Socket?

Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口,提供一套調用TCP/IP協議的API。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket接口後面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議。

  • 什麼是WebSocket?

為了解決網絡傳輸中的雙向通信問題,來作為HTTP協議的一個替代者,用於支持長連接(HTTP也可以長連接,但並非真正的全雙工通信)。
WebSocket通過HTTP請求告訴服務器要建立WebSocket連接,然後進行三次握手,在此期間的數據通信都是HTTP的,連接建立完成後,才使用WebScoket協議進行數據通信。
其連接斷開也是通過四次揮手。

相關文章

HelloType:JS運行時數據類型檢查工具

WebRTC點對點通訊架構設計

angular髒檢查原理及偽代碼實現

區塊鏈不談技術的都是韭菜——區塊鏈技術組成及架構