寫(xiě)于: 2016年05月08日
這三個(gè)概念經(jīng)常被談到, 也是比較容易被混淆掉的概念. 在會(huì)回顧之前我們先看一下這三者在TCP/IP協(xié)議族中的位置關(guān)系:

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