一:HTTP版本簡介
這里我把HTTP版本簡單分為三類:1.1之前,1.1,2.0,針對這三類做個主要差異的介紹:
1.HTTP 1.1之前
不支持持久連接脸狸。一旦服務(wù)器對客戶端發(fā)出響應(yīng)就立即斷開TCP連接
無請求頭跟響應(yīng)頭
客戶端的前后請求是同步的。下一個請求必須等上一個請求從服務(wù)端拿到響應(yīng)后才能發(fā)出藐俺,有點(diǎn)類似多線程的同步機(jī)制炊甲。
2.HTTP 1.1(主流版本)
與1.1之前的版本相比,做了以下性能上的提升
增加請求頭跟響應(yīng)頭
支持持久連接欲芹∏浞龋客戶端通過請求頭中指定Connection為keep-alive告知服務(wù)端不要在完成響應(yīng)后立即釋放連接。HTTP是基于TCP的菱父,在HTTP 1.1中一次TCP連接可以處理多次HTTP請求
客戶端不同請求之間是異步的颈娜。下一個請求不必等到上一個請求回來后再發(fā)出,而可以連續(xù)發(fā)出請求滞伟,有點(diǎn)類似多線程的異步處理揭鳞。
3.HTTP 2.0
本著向下兼容的原則炕贵,1.1版本有的特性2.0都具備梆奈,也使用相同的API。但是2.0將只用于https網(wǎng)址称开。由于2.0的普及還需要比較長的一段時間亩钟。
我們重點(diǎn)關(guān)注一下當(dāng)前1.1版本所做幾點(diǎn)改變乓梨。支持持久連接有什么好處呢?HTTP是基于TCP連接的清酥,如果連接被頻繁地啟動然后斷開就會花費(fèi)很多資源在TCP三次握手以及四次揮手上扶镀,效率低下。以請求一個網(wǎng)頁為例焰轻,我們知道臭觉,一個html網(wǎng)頁上的圖片資源并不是直接嵌入在網(wǎng)頁上,而只是提供url辱志,圖片仍需要額外發(fā)HTTP 請求去下載蝠筑。一個網(wǎng)頁從請求到最終加載到本地往往需要經(jīng)過過個HTTP請求。在1.1版本之前請求一個網(wǎng)頁就需要發(fā)生多次"握手-揮手"的過程揩懒,每次連接之間相互獨(dú)立什乙;而1.1及之后的版本最少只需要一次就夠。
再來就是請求異步已球,其好處參考多線程異步處理臣镣,在此不展開。
以上特性可以用圖1.1表示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖1.1 異步請求
我們可以看到:1智亮、N次請求其實(shí)只建立了1次TCP連接忆某,2、N次請求連續(xù)異步發(fā)出鸽素。
二:HTTP褒繁、Socket、TCP的區(qū)別
這三個概念經(jīng)常被談到馍忽,也是比較容易被混掉的概念棒坏。在回顧之前我們先看一下這三者在TCP/IP協(xié)議族中的位置關(guān)系:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖2.1 層次關(guān)系
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連接仗阅,也就是先三次握手昌讲,“你好,你好减噪,你好”短绸。從HTTP 1.1開始支持持久連接,也就是一次TCP連接可以發(fā)送多次的HTTP請求筹裕。
小總結(jié):HTTP基于TCP
2鸠按、TCP連接與Socket連接的區(qū)別
在圖4.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是實(shí)實(shí)在在能用到的花吟。
HTTP是短連接,Socket(基于TCP協(xié)議的)是長連接厨姚。盡管HTTP1.1開始支持持久連接衅澈,但仍無法保證始終連接。而Socket連接一旦建立TCP三次握手谬墙,除非一方主動斷開今布,否則連接狀態(tài)一直保持。
HTTP連接服務(wù)端無法主動發(fā)消息拭抬,Socket連接雙方請求的發(fā)送先后限制部默。這點(diǎn)就比較重要了,因?yàn)樗鼘Q定二者分別適合應(yīng)用在什么場景下造虎。HTTP采用“請求-響應(yīng)”機(jī)制傅蹂,在客戶端還沒發(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連接我用的比較多是robbiehanson大神的CocoaAsyncSocket(XMPPFramework也是出自他手)。
三:小結(jié)
以上就是關(guān)于HTTP與TCP的一些區(qū)別凡桥,歡迎留言蟀伸,如果不對的地方還請不吝指出,謝謝缅刽!