摘抄並用於自查
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
