HTTP、Socket、TCP這三個概念在網路開發中經常被提及,也是比較容易被混淆的概念,這三者在TCP/IP協議族中的位置關係:
其中,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+訊息廣播的方式)、大檔案傳輸等。