HTTP、Socket與TCP

HTTP、Socket、TCP這三個概念在網絡開發中經常被提及,也是比較容易被混淆的概念,這三者在TCP/IP協議族中的位置關係:
這裏寫圖片描述

三者的位置關係.png
其中,HTTP是應用層的協議,也是開發中最常用的一個網絡協議;TCP是傳輸層的協議,大學學過計算機網絡的都知道,該層還有一個UDP協議;而Socket是從傳輸層上抽象出來的,採用IP地址加端口號的形式來標識,並不是傳統意義上的網絡協議,所以從協議簇來說,三者還是很好區分的。那麼HTTP連接、TCP連接、Socket連接有什麼區別?

1、TCP連接與HTTP連接
在網絡分層中,HTTP協議是基於TCP協議的,客戶端向服務端發送一個HTTP請求時,需要先與服務端建立TCP連接,也就是經典的三次握手(通常對用戶來說是很難察覺的),握手成功以後才能進行數據交互。HTTP是基於請求響應模式且無狀態的協議,1.1之前只支持短連接,也就是請求響應一次以後連接中斷,下次請求需要重新進行TCP連接,而1.1之後支持持長連接,即進行一次TCP連接以後,客戶端可以發送多次的HTTP請求給服務器端。

小結:HTTP基於TCP

2、TCP連接與Socket連接
Socket是應用層與傳輸層之間的同一個抽象層,它是一套接口,所以Socket連接可以基於TCP連接,也有可能基於UDP。我們知道,TCP協議是可靠的,UDP協議是不可靠的,那麼基於TCP協議的Socket連接同樣是可靠的;基於UDP協議的Socket連接是不可靠的,大多數的即時通訊工具都是基於後者實現的。

小結:Socket可基於TCP,亦可UDP

3、HTTP連接與Socket連接
HTTP 1.1之前是短連接,基於TCP協議的Socket連接是長連接,雖然HTTP1.1開始支持長連接,但不像Socket連接一旦建立,除非一方主動斷開,否則連接狀態一直保持。(網友ttdevs向我補充:基於TCP的Socket可能是短連接,也可能是長連接,長連接可能需要通過心跳等一些手段來維持,各自有不同的應用場景。而不是簡單的”基於TCP協議的Socket連接是長連接”。後在網上查找了相關資料,有這麼一句:”在TCP連接保持期間,如果沒有數據包發送,定時發送數據包(心跳),以維持連接狀態。”因爲我自己沒做過這塊的具體工作,如果有大神可以詳解,歡迎指正! )

HTTP連接中,只有客戶端發起請求後服務端纔會響應,服務端是無法主動向客戶端發消息的。而Socket連接中,通信雙方發送消息並沒有先後的限制,通信雙方中的任何一方可以隨時向另一方發送消息。

4、HTTP Or Socket?
用HTTP:雙方不需要時刻保持連接,客戶端只是通過一個個HTTP請求來獲取服務器的特定資源。如通過get/post請求獲取網頁、圖片、JSON或者XML數據,還有常用的文件上傳、小文件下載等。

用Socket:大部分即時通訊應用(知乎上說QQ有部分功能是基於TCP,因爲TCP每次都需要三次握手,雖然可靠但是網絡不好的時候就慘了)、聊天室(基於UDP+消息廣播的方式)、大文件傳輸等。

發佈了41 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章