WebSocket 入門教程

WebSocket 總結

1.webSocket 技術介紹

WebSocket 是一種網絡通信協議,很多高級功能都需要它.

WebSocket是HTML5下一種新的協議。它實現了瀏覽器與服務器全雙工通信,能更好的節省服務器資源和帶寬並達到實時通訊的目的。它與HTTP一樣通過已建立的TCP連接來傳輸數據,但是它和HTTP最大不同是:
1) WebSocket是一種雙向通信協議。在建立連接後,WebSocket服務器端和客戶端都能主動向對方發送或接收數據,就像Socket一樣;
2)WebSocket需要像TCP一樣,先建立連接,連接成功後才能相互通信。
3) 這允許WebSocket應用程序更容易地適應現有的基礎架構。例如,WebSocket應用程序可以使用標準HTTP端口80和443,從而允許使用現有的防火牆規則。

2.爲什麼需要WebSocket

1)初次接觸 WebSocket 的人,都會問同樣的問題:我們已經有了 HTTP 協議,爲什麼還需要另一個協議?它能帶來什麼好處?

答案很簡單,因爲 HTTP 協議有一個缺陷:通信只能由客戶端發起。

2)舉例來說,我們想了解今天的天氣,只能是客戶端向服務器發出請求,服務器返回查詢結果。
HTTP 協議做不到服務器主動向客戶端推送信息。

3)這種單向請求的特點 註定瞭如果服務器有連續的狀態變化,客戶端要獲知就非常麻煩。我們只能使用"輪詢":每隔一段時候,就發出一個詢問,瞭解服務器有沒有新的信息。最典型的場景就是聊天室。

4)輪詢的效率低,非常浪費資源(因爲必須不停連接,或者 HTTP 連接始終打開)。因此,工程師們一直在思考,有沒有更好的方法。WebSocket 就是出現就是應對此場景

3.nginx配置支持websocket

在實際的生產環境中,要求多個WebSocket服務器必須具有高性能和高可用,那麼WebSocket協議就需要一個負載均衡層,NGINX從1.3版本開始支持WebSocket,其可以作爲一個反向代理和爲WebSocket程序做負載均衡。
允許在客戶機和後端服務器之間建立隧道,NGINX支持WebSocket。對於NGINX將升級請求從客戶端發送到後臺服務器,必須明確設置Upgrade和Connection標題。

1)編輯nginx.conf,在http區域內一定要添加下面配置:
map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

2)編輯vhosts下虛擬主機的配置文件,在location匹配配置中添加如下內容:
proxy_connect_timeout :後端服務器連接的超時時間_發起握手等候響應超時時間
proxy_read_timeout:連接成功後_等候後端服務器響應時間_其實已經進入後端的排隊之中等候處理(也可以說是後端服務器處理請求的時間)
proxy_send_timeout :後端服務器數據回傳時間_就是在規定時間之內後端服務器必須傳完所有的數據
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";

4.HTTP和Websocket流程圖


它的最大特點就是,服務器可以主動向客戶端推送信息,客戶端也可以主動向服務器發送信息,是真正的雙向平等對話,屬於服務器推送技術的一種。

![](https://s4.51cto.com/images/blog/202004/15/0fa55033fcb8f2bd7ea54b02f826f7c8.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

websocket特點:

(1)建立在 TCP 協議之上,服務器端的實現比較容易。
(2)與HTTP協議有着良好的兼容性。默認端口也是80和443,並且握手階段採用HTTP協議,因此握手時不容易屏蔽,能   通過各種 HTTP 代理服務器。
(3)數據格式比較輕量,性能開銷小,通信高效。
(4)可以發送文本,也可以發送二進制數據。
(5)沒有同源限制,客戶端可以與任意服務器通信。
(6)協議標識符是ws(如果加密,則爲wss),服務器網址就是 URL。

示例:ws://example.com:80/some/path

![](https://s4.51cto.com/images/blog/202004/15/0b9c98159f49e6f422f832b36d857d5e.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

5.websocket 總結

5.1 WebSocket與Http相同點

  • 都是一樣基於TCP的,都是可靠性傳輸協議。
  • 都是應用層協議。

5.2 WebSocket與Http不同點

  • WebSocket是雙向通信協議,模擬Socket協議,可以雙向發送或接受信息。HTTP是單向的。
  • WebSocket是需要瀏覽器和服務器握手進行建立連接的。而http是瀏覽器發起向服務器的連接,服務器預先並不知道這個連接。

5.3 WebSocket與Http聯繫

  • WebSocket在建立握手時,數據是通過HTTP傳輸的。但是建立之後,在真正傳輸時候是不需要HTTP協議的。

  • 在WebSocket中,只需要服務器和瀏覽器通過HTTP協議進行一個握手的動作,然後單獨建立一條TCP的通信通道進行數據的傳送。

  • WebSocket連接的過程是:
    1)客戶端發起http請求,經過3次握手後,建立起TCP連接;http請求裏存放WebSocket支持的版本號等信息,如:Upgrade、Connection、WebSocket-Version等;
    2)服務器收到客戶端的握手請求後,同樣採用HTTP協議回饋數據;
    3)客戶端收到連接成功的消息後,開始藉助於TCP傳輸信道進行全雙工通信。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章