1. 程式人生 > >HTTP、TCP與UDP、Socket與Websocket之間的聯絡與區別

HTTP、TCP與UDP、Socket與Websocket之間的聯絡與區別

ICP/IP協議(Transmission Control Protocol/InternetProtocol):網路通訊協議,是Internet最基本的協議、Internet國際網際網路絡的基礎,由網路層的IP協議和傳輸層的TCP協議組成。協議採用了4層的層級結構,每一層都呼叫它的下一層所提供的協議來完成自己的需求。
通俗而言:TCP負責發現傳輸的問題,一有問題就發出訊號,要求重新傳輸,直到所有資料安全正確地傳輸到目的地。而IP是給因特網的每一臺聯網裝置規定一個地址。

TCP/IP協議棧主要分為四層:應用層、傳輸層、網路層、資料鏈路層,
每層都有相應的協議,如下圖
這裡寫圖片描述

概念理解:

  • IP:網路層協議;(高速公路)
  • TCP和UDP:傳輸層協議;(卡車)
  • TCP/IP:代表傳輸控制協議/網際協議,指的是一系列協議,TCP/IP 模型在 OSI 模型的基礎上進行了簡化,變成了四層,從下到上分別為:網路介面層、網路層、傳輸層、應用層。
  • SOCKET:套接字,TCP/IP網路的API。(港口碼頭/車站)Socket是應用層與TCP/IP協議族通訊的中間軟體抽象層,它是一組介面。socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層複雜的操作抽象為幾個簡單的介面供應用層呼叫已實現程序在網路中通訊。
  • HTTP:應用層協議;(貨物)。HTTP(超文字傳輸協議)是利用TCP在兩臺電腦(通常是Web伺服器和客戶端)之間傳輸資訊的協議。客戶端使用Web瀏覽器發起HTTP請求給Web伺服器,Web伺服器傳送被請求的資訊給客戶端。
  • WebSocket:WebSocket protocol 是HTML5一種新的協議。它實現了瀏覽器與伺服器全雙工通訊(full-duplex)。一開始的握手需要藉助HTTP請求完成。
    WebSokcet目的:即時通訊,替代輪詢。
    網站上的即時通訊是很常見的,比如網頁的QQ,聊天系統等。按照以往的技術能力通常是採用輪詢、Comet技術解決。
    HTTP協議是非持久化的,單向的網路協議,在建立連線後只允許瀏覽器向伺服器發出請求後,伺服器才能返回相應的資料。當需要即時通訊時,通過輪詢在特定的時間間隔(如1秒),由瀏覽器向伺服器傳送Request請求,然後將最新的資料返回給瀏覽器。這樣的方法最明顯的缺點就是需要不斷的傳送請求,而且通常HTTP request的Header是非常長的,為了傳輸一個很小的資料 需要付出巨大的代價,是很不合算的,佔用了很多的寬頻。
    缺點:會導致過多不必要的請求,浪費流量和伺服器資源,每一次請求、應答,都浪費了一定流量在相同的頭部資訊上。
    然而WebSocket的出現可以彌補這一缺點。在WebSocket中,只需要伺服器和瀏覽器通過HTTP協議進行一個握手的動作,然後單獨建立一條TCP的通訊通道進行資料的傳送。

注:什麼是單工、半雙工、全工通訊? 資訊只能單向傳送為單工; 資訊能雙向傳送但不能同時雙向傳送稱為半雙工;
資訊能夠同時雙向傳送則稱為全雙工。

概念聯絡與區別:

  • TCP與UDPTCP,傳輸控制協議,Transmission Control Protocol):(類似打電話) 面向連線、傳輸可靠(保證資料正確性)、有序(保證資料順序)、傳輸大量資料(流模式)、速度慢、對系統資源的要求多,程式結構較複雜,每一條TCP連線只能是點到點的,TCP首部開銷20位元組。 UDP,(使用者資料報協議,User Data Protocol):(類似發簡訊)面向非連線 、傳輸不可靠(可能丟包)、無序、傳輸少量資料(資料報模式)、速度快,對系統資源的要求少,程式結構較簡單 , UDP支援一對一,一對多,多對一和多對多的互動通訊, UDP的首部開銷小,只有8個位元組。

tcp三次握手建立連線:這裡寫圖片描述
第一次握手:客戶端傳送syn包(seq=x)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=x+1),同時自己也傳送一個SYN包(seq=y),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=y+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。
握手過程中傳送的包裡不包含資料,三次握手完畢後,客戶端與伺服器才正式開始傳送資料。理想狀態下,TCP連線一旦建立,在通訊雙方中的任何一方主動關閉連線之前,TCP
連線都將被一直保持下去。 主機A向主機B發出連線請求資料包:“我想給你發資料,可以嗎?”,這是第一次對話;
主機B向主機A傳送同意連線和要求同步(同步就是兩臺主機一個在傳送,一個在接收,協調工作)的資料包:“可以,你什麼時候發?”,這是第二次對話;
主機A再發出一個數據包確認主機B的要求同步:“我現在就發,你接著吧!”,這是第三次對話。
三次“對話”的目的是使資料包的傳送和接收同步,經過三次“對話”之後,主機A才向主機B正式傳送資料。

  • HTTP與WebSocket

相同點:1. 都是一樣基於TCP的,都是可靠性傳輸協議。2. 都是應用層協議。
不同點:1. WebSocket是雙向通訊協議,模擬Socket協議,可以雙向傳送或接受資訊。HTTP是單向的。2. WebSocket是需要握手進行建立連線的。
聯絡:WebSocket在建立握手時,資料是通過HTTP傳輸的。但是建立之後,在真正傳輸時候是不需要HTTP協議的。

傳統 HTTP 請求響應客戶端伺服器互動圖:
這裡寫圖片描述
WebSocket 請求響應客戶端伺服器互動圖:
這裡寫圖片描述
上圖對比可以看出,相對於傳統 HTTP 每次請求-應答都需要客戶端與服務端建立連線的模式,WebSocket 是類似 Socket 的 TCP 長連線的通訊模式,一旦 WebSocket 連線建立後,後續資料都以幀序列的形式傳輸。在客戶端斷開 WebSocket 連線或 Server 端斷掉連線前,不需要客戶端和服務端重新發起連線請求。在海量併發及客戶端與伺服器互動負載流量大的情況下,極大的節省了網路頻寬資源的消耗,有明顯的效能優勢,且客戶端傳送和接受訊息是在同一個持久連線上發起,實時性優勢明顯。

我們再通過客戶端和服務端互動的報文看一下 WebSocket 通訊與傳統 HTTP 的不同:
在客戶端,new WebSocket 例項化一個新的 WebSocket 客戶端物件,連線類似 ws://yourdomain:port/path 的服務端 WebSocket URL,WebSocket 客戶端物件會自動解析並識別為 WebSocket 請求,從而連線服務端埠,執行雙方握手過程,客戶端傳送資料格式類似:
1、 WebSocket 客戶端連線報文:

GET /webfin/websocket/ HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin: 
http://localhost
:8080
Sec-WebSocket-Version: 13

可以看到,客戶端發起的 WebSocket 連線報文類似傳統 HTTP 報文,”Upgrade:websocket”引數值表明這是 WebSocket 型別請求,“Sec-WebSocket-Key”是 WebSocket 客戶端傳送的一個 base64 編碼的密文,要求服務端必須返回一個對應加密的“Sec-WebSocket-Accept”應答,否則客戶端會丟擲“Error during WebSocket handshake”錯誤,並關閉連線。

2、WebSocket 服務端響應報文:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=

“Sec-WebSocket-Accept”的值是服務端採用與客戶端一致的金鑰計算出來後返回客戶端的,“HTTP/1.1 101 Switching Protocols”表示服務端接受 WebSocket 協議的客戶端連線,經過這樣的請求-響應處理後,客戶端服務端的 WebSocket 連線握手成功, 後續就可以進行 TCP 通訊了。

在開發方面,WebSocket API 也十分簡單,我們只需要例項化 WebSocket,建立連線,然後服務端和客戶端就可以相互發送和響應訊息。

  • WebSocket與Socket

Socket是傳輸控制層介面,WebSocket是應用層協議。

可以把WebSocket想象成HTTP(應用層),HTTP和Socket什麼關係,WebSocket和Socket就是什麼關係。
當兩臺主機通訊時,必須通過Socket連線,Socket則利用TCP/IP協議建立TCP連線。TCP連線則更依靠於底層的IP協議,IP協議的連線則依賴於鏈路層等更低層次。
WebSocket就像HTTP一樣,則是一個典型的應用層協議。
這裡寫圖片描述