HTTP、Socket鲁纠、TCP這三個概念在網(wǎng)絡開發(fā)中經(jīng)常被提及总棵,也是比較容易被混淆的概念,這三者在TCP/IP協(xié)議族中的位置關系:
其中改含,HTTP是應用層的協(xié)議情龄,也是開發(fā)中最常用的一個網(wǎng)絡協(xié)議鞍爱;TCP是傳輸層的協(xié)議,大學學過計算機網(wǎng)絡的都知道,該層還有一個UDP協(xié)議翼闹;而Socket是從傳輸層上抽象出來的,采用IP地址加端口號的形式來標識,并不是傳統(tǒng)意義上的網(wǎng)絡協(xié)議拒垃,所以從協(xié)議簇來說艰猬,三者還是很好區(qū)分的。那么HTTP連接胸蛛、TCP連接迹蛤、Socket連接有什么區(qū)別嚷量?
1身坐、TCP連接與HTTP連接
在網(wǎng)絡分層中,HTTP協(xié)議是基于TCP協(xié)議的,客戶端向服務端發(fā)送一個HTTP請求時抹腿,需要先與服務端建立TCP連接盅称,也就是經(jīng)典的三次握手(通常對用戶來說是很難察覺的)混狠,握手成功以后才能進行數(shù)據(jù)交互云芦。HTTP是基于請求響應模式且無狀態(tài)的協(xié)議,1.1之前只支持短連接水醋,也就是請求響應一次以后連接中斷拳魁,下次請求需要重新進行TCP連接,而1.1之后支持持長連接,即進行一次TCP連接以后,客戶端可以發(fā)送多次的HTTP請求給服務器端。
小結:HTTP基于TCP
2筋栋、TCP連接與Socket連接
Socket是應用層與傳輸層之間的同一個抽象層襟交,它是一套接口焕梅,所以Socket連接可以基于TCP連接该窗,也有可能基于UDP规肴。我們知道,TCP協(xié)議是可靠的,UDP協(xié)議是不可靠的,那么基于TCP協(xié)議的Socket連接同樣是可靠的翻擒;基于UDP協(xié)議的Socket連接是不可靠的巩趁,大多數(shù)的即時通訊工具都是基于后者實現(xiàn)的草讶。
小結:Socket可基于TCP浇雹,亦可UDP
3、HTTP連接與Socket連接
HTTP 1.1之前是短連接抠蚣,基于TCP協(xié)議的Socket連接是長連接嘶窄,雖然HTTP1.1開始支持長連接忠蝗,但不像Socket連接一旦建立阁最,除非一方主動斷開哟旗,否則連接狀態(tài)一直保持。(網(wǎng)友ttdevs向我補充:基于TCP的Socket可能是短連接近上,也可能是長連接岖是,長連接可能需要通過心跳等一些手段來維持陆错,各自有不同的應用場景危号。而不是簡單的"基于TCP協(xié)議的Socket連接是長連接"。后在網(wǎng)上查找了相關資料素邪,有這么一句:"在TCP連接保持期間外莲,如果沒有數(shù)據(jù)包發(fā)送,定時發(fā)送數(shù)據(jù)包(心跳)兔朦,以維持連接狀態(tài)偷线。"因為我自己沒做過這塊的具體工作,如果有大神可以詳解沽甥,歡迎指正声邦! )
HTTP連接中,只有客戶端發(fā)起請求后服務端才會響應摆舟,服務端是無法主動向客戶端發(fā)消息的亥曹。而Socket連接中,通信雙方發(fā)送消息并沒有先后的限制恨诱,通信雙方中的任何一方可以隨時向另一方發(fā)送消息媳瞪。
4、HTTP Or Socket照宝?
用HTTP:雙方不需要時刻保持連接蛇受,客戶端只是通過一個個HTTP請求來獲取服務器的特定資源。如通過get/post請求獲取網(wǎng)頁厕鹃、圖片兢仰、JSON或者XML數(shù)據(jù)乍丈,還有常用的文件上傳、小文件下載等把将。
用Socket:大部分即時通訊應用(知乎上說QQ有部分功能是基于TCP轻专,因為TCP每次都需要三次握手,雖然可靠但是網(wǎng)絡不好的時候就慘了)秸弛、聊天室(基于UDP+消息廣播的方式)铭若、大文件傳輸?shù)取?/strong>