iOS網絡編程中會涉及一些協議(HTTP/HTTPS)和計算機網絡相關概念,只有了解它們的相關機制和概念才能在實際的編程中解決一些出現的問題。本文主要會講解HTTP、HTTPS、Cookie、Session等概念。
HTTP
HTTP是超文本傳輸協議,是用于從服務器傳輸超文本到本地瀏覽器的傳送協議,它是基于TCP實現的,由于TCP是一個端到端的可靠的面向連接的協議,所以HTTP基于傳輸層TCP協議不用擔心數據的傳輸的各種問題。移動端可通過HTTP向服務端請求數據(JSON/XML)或者下載上傳二進制數據等,那么HTTP是如何工作的?
HTTP的工作流程
一次HTTP操作稱為一個事務,其工作過程可分為四步:
- 首先客戶端與服務器需要建立連接。只要出發一個HTTP請求,HTTP的工作開始。
- 建立連接(建立連接的過程涉及到TCP的三次握手操作)后,客戶端發送一個請求給服務器,請求方式的格式為:統一資源標識符(URL)、協議版本號,后邊是MIME信息包括請求修飾符、客戶機信息和其他的內容。
- 服務器接到請求后,給予相應的響應信息,其格式為一個狀態行,包括信息的協議版本號、一個成功或錯誤的代碼,后邊是MIME信息包括服務器信息、實體信息和可能的內容。
- 客戶端接收服務器所返回的信息進行解析操作,然后客戶機與服務器斷開連接。
HTTP請求報文和響應報文的格式
- 起始行:如 GET / HTTP/1.0 (請求的方法 請求的URL 請求所使用的協議)
- 頭部信息:User-Agent Host等成對出現的值
- 主體
GET 請求報文
GET /books/?sex=man&name=Professional HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
POST 請求報文
POST / HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
sex=man&name=Professional
響應報文
HTTP/1.1 200 OK
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112
<html>...
GET 與 POST 的區別
GET提交的數據會受到長度限制,GET和POST提交的數據存放位置一個在URL中一個在HTTP Body中;
HTTP 請求的錯誤碼
- 2xx : 成功狀態碼
- 3xx : 重定向
- 4xx : 客戶端狀態錯誤碼
- 5xx : 服務端錯誤狀態嗎
- 500 : 服務器內部錯誤
- 502 : 代理服務器連接不到后端的服務器
- 504 : 后端服務器給代理服務器的響應超時
HTTP Header
- Accept 就是告訴服務器端,我接受那些MIME類型
- Accept-Encoding 這個看起來是接受那些壓縮方式的文件
- Accept-Lanague 告訴服務器能夠發送哪些語言
- Connection 告訴服務器支持keep-alive特性
- Cookie 每次請求時都會攜帶上Cookie以方便服務器端識別是否是同一個客戶端
- Host 用來標識請求服務器上的那個虛擬主機,比如Nginx里面可以定義很多個虛擬主機,那這里就是用來標識要訪問那個虛擬主機。
- User-Agent 用戶代理,一般情況是瀏覽器,也有其他類型,如:wget curl 搜索引擎的蜘蛛等
會話跟蹤
- 什么是會話: 客戶端打開與服務器的連接發出請求到服務器響應客戶端請求的全過程稱之為會話;
- 什么是會話跟蹤: 會話跟蹤指的是對同一個用戶對服務器的連續的請求和接受響應的監視。
-為什么需要會話跟蹤: 瀏覽器與服務器之間的通信是通過HTTP協議進行通信的,而HTTP協議是”無狀態”的協議,它不能保存客戶的信息,即一次響應完成之后連接就斷開了,下一次的請求需要重新連接,這樣就需要判斷是否是同一個用戶,所以才有會話跟蹤技術來實現這種要求。
cookie
- 什么是cookie: cookie 實際上是包含用戶信息的一小段文本信息
- 為什么會使用cookie: HTTP的無狀態性,服務端想記住某一個訪問者只能通過某中標識來判斷,cookie就作為服務端頒發給客戶端的證書,作為繼續請求的憑證
- cookie的局限性: cookie保存在本地,存儲信息不能超過3K,易于被偽造造成安全問題;所以敏感信息不能存儲
Session
- 什么是Session: Session是服務端記錄用戶信息的一種機制;Session相當于在服務器上建立了一個客戶檔案,通過SessionID來確定用戶的信息
- Session的有效期和過期時間: Session清理掉;一般被服務端放在內存中,但是大量訪問會可能造成內存溢出的情況,所以超過設定時間的session會被清理掉!
密文處理
由于目前的app絕大多數已經切換到HTTPS協議,也就是傳輸的報文都是經過加密的,這其中包含一些相關概念需要講述。
- 公鑰密碼機制: 該機制包含公鑰、私鑰、加密算法;并且最重要的是只有私鑰才能解析出密文的信息;
- 對稱與非對稱加密算法: 公鑰和私鑰相同的機密算法叫對稱加密算法(例如DES/AES等),公鑰和私鑰不相同的算法叫做非對稱加密算法
- 簽名
在傳輸的信息后面加上一段傳輸信息的hash后的內容,這樣能夠保證信息的完整和安全性; - 數字證書
CA機構頒發的一個憑證,包含頒發機構、有效期、公鑰、加密算法;
HTTPS
HTTPS被稱為安全的HTTP原因在與它被SSL/TSL包裹了一層,客戶端與服務端進行通訊是兩者之間共同商議的加密機制對傳輸報文進行加密操作;
發起一個HTTPS請求,客戶端和服務端進行了哪些溝通

HTTPS請求客戶端和服務端之間的交互
- client發送'我是客戶端'的請求給server端,server接到請求返回自己的數字證書(CA機構頒發的);
- client驗證數字證書的真偽(由客戶端的TSL完成),client生成一個隨機數(使用證書的公鑰加密)發給服務端;
- server接收到請求后使用私鑰解密隨機數,sever將隨機數hash計算用私鑰加密后傳給客戶端
- client使用公鑰解密和本身的隨機數hash值做比較,確定是server的身份;client此時用公鑰加密一套對稱加密算法和密鑰給server用于以后的數據傳輸;
- server和client就能進行正常的數據傳輸了
TCP協議和UDP協議
計算機網絡層級
TCP協議
TCP協議是面向連接、保證高可靠性(數據無丟失、數據無失序、數據無錯誤、數據無重復到達)傳輸層協議。
UDP協議
UDP協議也是傳輸層協議,它是無連接,不保證可靠的傳輸層協議
IP協議
I P是T C P / I P協議族中最為核心的協議。所有的T C P、U D P、I C M P及I G M P數據都以I P數據
報格式傳輸。它的特點不可靠無連接;
TCP的三次握手操作
SYN(synchronous)是TCP/IP建立連接時使用的握手信號。在客戶機和服務器之間建立正常的TCP網絡連接時,客戶機首先發出一個SYN消息
TCP的三次握手操作
- 客戶端發送syn報文并將序列號X放在Sequence Number字段中 ;
- 服務端接收到請求,發送確認報文(Acknowledgement Number)X+1,將序列號Y放在Sequence Number字段中,SYN標志位仍舊為1;
- 客戶端收到響應再次發送確認報文Y+1,將序列號Z放在Sequence Number字段中;三次握手完成
TCP的四次揮手操作
TCP的四次揮手操作
客戶端基于Token的身份驗證
- 客戶端使用用戶名跟密碼請求登錄
- 服務端收到請求,去驗證用戶名與密碼
- 驗證成功后,服務端會簽發一個 Token,再把這個 Token 發送給客戶端
- 客戶端收到 Token 以后可以把它存儲起來,比如放在 Cookie 里或者 Local Storage 里
- 客戶端每次向服務端請求資源的時候需要帶著服務端簽發的 Token
- 服務端收到請求,然后去驗證客戶端請求里面帶著的 Token,如果驗證成功,就向客戶端返回請求的數據
文章參照