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

工做須要,網絡接觸的不算深刻,留個坑後續填上~設計模式

五層協議體系


其中TCP/IP是一類協議系統,是用於網絡通訊的協議集合。TCP/IP協議傳統認爲值四層協議 瀏覽器

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來實現的,比較消耗資源,也沒法讓服務器主動通知客戶端。markdown

TCP的三次握手和四次揮手


  • TCP鏈接的創建(三次握手)

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

  1. 客戶端告訴服務器須要創建TCP鏈接。
  2. 服務器收到報文後,若是贊成鏈接,則發出確認報文。
  3. 客戶端收到確認後,告訴服務器收到確認,此後雙方開始通訊。
  • 兩次握手爲何不行?

主要是爲了防止已經失效的請求報文忽然又傳送給服務器,從而創建錯誤鏈接。 若是是兩次握手,假設這樣的場景,客戶端發送一個請求報文,在某一個網絡節點由於網絡緣由被滯留,客戶端遲遲沒有收到確認報文,覺得服務器沒有收到,從而從新發送了一次請求報文,經歷兩次握手後雙方創建鏈接,傳輸數據後關閉鏈接。後來忽然此前滯留的請求報文網絡通暢又到達了服務器,這個報文本該是失效的,可是服務器經歷兩次握手後再次創建鏈接,但實際上客戶端並不須要傳數據,致使服務器空等,形成資源浪費。而若是是三次握手,即便服務器確認了失效的報文,客戶端沒有再次確認,也是不會創建鏈接的。網站

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

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

  1. 客戶端發出鏈接釋放報文,而且中止發送數據。
  2. 服務器端接收到報文後,發出確認報文嗎,而後將最後的數據發送完畢後。
  3. 服務器發送完數據後發送鏈接釋放報文,等待客戶端的確認。
  4. 客戶端收到鏈接釋放報文後,必須發出確認報文,此時TCP鏈接還沒釋放,須要等2∗ MSL(最長報文段壽命)的時間後,纔會進入CLOSE狀態。
  5. 服務器端接收到確認報文後,當即進入CLOSE狀態。
  • 爲何客戶端最後還要等待2MSL?

客戶端之全部接收到服務器發送的鏈接釋放報文後必須發出確認報文,是由於服務器在發送鏈接釋放報文後,若是沒有獲得客戶端的確認,會認爲報文發送失敗,那麼它會從新發送鏈接釋放報文,因此客戶端不會當即關閉,若是2∗ MSL時間內沒有再接收到服務器發送的鏈接釋放報文,那麼客戶端認爲服務器已經接收到了確認報文,則結束TCP鏈接。2MSL就是一個發送和一個回覆所需的最大時間。spa

  • 三次揮手爲何不行?

因爲TCP是全雙工通訊,任意一方都能發送數據,一方想要關閉鏈接必須等待數據發送完畢,也就須要另外一方贊成,若是是三次揮手,服務器端發送了鏈接釋放報文時,此時客戶端和服務端均半關閉狀態,客戶端接收到鏈接釋放報文後若是不發送確認報文,服務器端沒法肯定客戶端收到了關閉的消息,當前僅僅只有客戶端知道雙方能夠關閉了,可是服務器端並不知道,因此須要發一次確認報文,而且客戶端經過2MSL時間來判斷服務器端也知道了此時雙方能夠關閉,最終雙方斷開這次連接。

Socket和WebSocket


  • 什麼是Socket?

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

  • 什麼是WebSocket?

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

相關文章
相關標籤/搜索