寫于: 2016年05月08日
這三個概念經(jīng)常被談到, 也是比較容易被混淆掉的概念. 在會回顧之前我們先看一下這三者在TCP/IP協(xié)議族中的位置關(guān)系:
![圖1. 圖層關(guān)系](https://o3pxzuakz.qnssl.com/image/e/e7/1a4b1cbf5ecaf2183865c5c64942a.png)
HTTP是應(yīng)用層的協(xié)議, 更靠近用戶端;
TCP是傳輸層的協(xié)議; 而Socket是從傳輸層上抽象出來的一個抽象層,本質(zhì)是接口.
所以本質(zhì)上三種還是很好區(qū)分的.
盡管如此, 有時候你可能會懵逼, HTTP連接碟绑、TCP連接俺猿、Socket連接有什么區(qū)別?
好吧, 如果上面的圖解釋的還是不夠清楚的話, 我們繼續(xù)往下看.
1. TCP連接和HTTP連接的區(qū)別
上文提過, HTTP是基于TCP的, 客戶端往服務(wù)端發(fā)送一個HTTP請求時第一步就是要建立與服務(wù)端的TCP連接, 也就是先三次握手, "你好, 你好, 你好". 從HTTP1.1開始支持持久連接, 也就是一次TCP連接可以發(fā)送多次的HTTP請求.
==小結(jié): HTTP基于TCP==
2. TCP連接與Socket連接的區(qū)別
在圖1 中我們提到, Socket層只是在TCP/UDP傳輸層上做得一個抽象接口層, 因此一個Socket連接可以基于連接, 也有可能基于UDP. 基于TCP協(xié)議的Socket連接同樣需要三次握手建立連接, 是可靠的. 基于UDP協(xié)議的Socket連接不需要建立連接的過程, 不管對方能不能接收到都會發(fā)送過去, 是不可靠的, 大多數(shù)的及時通訊IM都是后者.
==小結(jié): Socket也基于TCP==
3. HTTP連接和Socket連接的區(qū)別
區(qū)分這兩個概念是比較有意義的, 畢竟TCP看不到摸不著, HTTP與Socket是實實在在能用到的.
HTTP是短連接, Socket(基于TCP協(xié)議的)是長連接. 盡管HTTP1.1開始支持持久連接, 但仍無法保證始終連接. 而Socket連接一旦建立TCP三次握手, 除非一方主動斷開, 否則連接狀態(tài)一直保持.
HTTP連接服務(wù)端無法主動發(fā)消息, Socket連接雙方請求的發(fā)送先后限制. 這點比較重要了, 因為它將決定二者分別適合應(yīng)用在什么場景下. HTTP采用"請求-響應(yīng)"機制, 在客戶端還沒發(fā)送消息給服務(wù)端錢, 服務(wù)端無法推送消息給客戶端. 必須滿足客戶端發(fā)送消息在前, 服務(wù)端回復(fù)在后. Socket連接雙方類似peer2peer的關(guān)系, 一方可以向另一方喊話.
4. 問題來了:什么時候該用HTTP, 什么時候該用Socket
這個問題的提出是自然而然的. 當(dāng)你接到一個與另一方的網(wǎng)絡(luò)通訊需求, 自然會考慮用HTTP還是Socket.
- 用HTTP的情況: 雙方不需要時刻保持連接在線, 比如客戶端資源的獲取、文件上傳等
- 用Socket的情況: 大部分及時通訊應(yīng)用(QQ格仲、微信)押袍、聊天室、蘋果APNs等
在iOS中, 發(fā)HTTP請求一般用原生的 NSURLConnection凯肋、NSURLSession或者開源的AFNetworking(推薦)伯病、ASIHttpRequest(已停止更新). 連接Socket連接 可以用CocosAsyncSocket.
The end
祝所有的母親,節(jié)日快樂,健健康康!
==歡迎留言, 寫的不對的地方還請不吝賜教.==