websocket原理


摘抄並用於自查

 

1. WebSocket 與 HTTP

  websocket 協議在 2008 年誕生,2011年成為國際標准。現在所有瀏覽器都已經支持了。Websocket 的最大特點是,服務器可以主動向客戶端推送消息,客戶端也可以主動向服務器發送消息,是真正的雙向平等對話。

  HTTP 有 1.1 和 1.0 只說,也就是所謂的 keep-alive,把多個 HTTP 請求合並為一個,但是 Websocket 其實是一個新協議,跟 HTTP 協議基本沒有關系,只是為了兼容現有瀏覽器,所以在握手階段使用了 HTTP。

  下面偷一張圖說明 HTTP 和 Websocket 的主要區別:

 

Websocket 的其他特點:

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

 

2. WebSocket 是什么樣的協議,具體有什么優點

  首先,WebSocket 是一個持久化的協議,相對於 HTTP 這種非持久的協議來說。

  HTTP 的生命周期通過 Request 來界定,也就是一個 Request 一個 Response,那么在 HTTP1.0 中,這次 HTTP 請求就結束了。

 

  在 HTTP1.1 中有改進,使得有一個 keep-alive,也就是說,在一個 HTTP 連接中,可以發送多個 Request,接收多個 Response。但是,Request = Response,在 HTTP 中永遠是一個 Request 對應一個 Response。而且這個 Response 也是被動的,不能主動發起。

 

  WebSocket 是基於 HTTP 協議,借用 HTTP 協議完成一部分握手。

 

  下面一個典型的 WebSocket 握手

  GET /chat HTTP/1.1

  Host: server.xxx.com

  Upgrade:websocket

  Connection:Upgrade

  Sec-WebSocket-Key: xxxxxxx

  Sec-WebSocket-Protacal:chat, superchat

  Sec-WebSocket-Version:13

  Origin: http://xxx.com

 

  這段相比 HTTP 協議的握手請求,多了 Upgrade 和 Connection。這個就是 WebSocket 的核心了,告訴 Apache、Nginx 等服務器:我發起的請求要用 WebSocket 協議,需要對應的處理。

 

  Sec-WebSocket-Key: xxxx

  Sec-WebSocket-Protocol:chat, superchat

  Sec-WebSocket-Version:13

 

  首先,Sec-WebSocket-Key 是一個 Base64 encode 的值,這個是瀏覽器隨機生成的,驗證是否是可以處理 WebSocket 服務的。

  然后, Sec-WebSocket-Protocol 是一個用戶自定義的字符串,用來區分同 URL 下,不同的服務所需要的協議。

  最后,Sec-WebSocket-Version 是高速服務器所使用的 WebSocket 的協議版本。在最初的時候 WebSocket 協議有很多種,各瀏覽器都不同,現在大家都使用同一版本。

 

  然后服務器會返回下列東西,表示已經接受到請求,成功建立 WebSocket。

  HTTP/1.1 101 Switching Protocols

  Upgrade: websocket

  Connection: Upgrade

  Sec-WebSocket-Accept:xxxxxxxx

  Sec-WebSocket-Protocol:chat

  這里就是 HTTP 最后負責的區域,告訴客戶,已經成功切換協議。

  Sec-WebSocket-Protocol 是經過服務器確認,並且加密過后的 Sec-WebSocket-key 。

  Sec-WebSocket-Protocol 表示最終使用的協議、

  至此,HTTP 已經完成了它所有的工作,接下來就是完全按照 WebSocket 協議進行了。

 

3. WebSocket 的作用

 

  前奏

  ajax 輪詢:其原理是,讓瀏覽器每隔幾秒就發送一次請求,詢問服務器是否有新的信息

  long poll:其原理和 ajax 輪詢差不多,都是采用輪詢的方式,不過采取的是阻塞模型(一直打電話,沒收到就不掛電話),也就是說,客戶端發起請求后,如果沒消息,就一直不返回 Response 給客戶端。直到有消息才返回,返回完之后,客戶端再次建立連接,周而復始。

  從上面可以看出其實這兩種方式,都是在不斷地建立 HTTP 連接,然后等待服務端處理,可以體現 HTTP 協議的另外一個特點,被動性

 

  從上面很容易看出,不管怎么樣,上面兩種都是非常消耗資源的。ajax 輪詢需要服務器有很快的處理速度和資源。long poll 需要有很高的並發,也就是說同時接待客戶的能力。

 

  主題

  通過上面這兩個例子,我們可以看出,這兩種方式都不是最好的方式,需要很多資源。一種需要更快的速度,一種需要更多並發,這兩種都會導致性能需求越來越高。

  還有,HTTP 是一個無狀態協議。通俗就是,服務器每天要處理的請求很多,不會記得上次處理的你的請求參數和內容。

  所以在這種情況下出現了 WebSocket。他解決了 HTTP 的這幾個難題。首先,被動性,當服務器完成協議升級后,服務端就可以主動推送消息給客戶端。只需要經過一次 HTTP 請求,就可以做到源源不斷的信息傳送了。

 

https://www.cnblogs.com/nnngu/p/9347635.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM