什麼是WebSocket,它與HTTP有何不一樣?

what-is-websocket-featured.jpg
今天翻譯一篇關於HTTPWebSocket的文章,同時也是爲Go Web編程接下來Socket部分的文章作鋪墊。web

HTTPWebSocket都是客戶端-服務器通訊中使用的通訊協議。文章用幾個例子解釋了二者的不一樣以及分別適用在什麼應用場景。有些容易混淆的概念(好比說HTTP長鏈接)和待補充的概念我用斜體字註解到了文章中。編程

HTTP協議

HTTP是單向的,客戶端發送請求,服務器發送響應。舉例來講,當客戶端向服務器發送請求時,該請求以HTTPHTTPS的形式發送,在接收到請求後,服務器會將響應發送給客戶端。每一個請求都與一個對應的響應相關聯,在發送響應後客戶端與服務器的鏈接會被關閉。每一個HTTPHTTPS請求每次都會新建與服務器的鏈接,而且在得到響應後,鏈接將自行終止。
HTTP是在TCP之上運行的無狀態協議,TCP是一種面向鏈接的協議,它使用三向握手方法保證數據包傳輸的傳遞並從新傳輸丟失的數據包。後端

HTTP能夠運行在任何可靠的面向鏈接的協議(例如TCPSCTP)的上層。當客戶端將HTTP請求發送到服務器時,客戶端和服務器之間將打開TCP鏈接,而且在收到響應後,TCP鏈接將終止,每一個HTTP請求都會創建單獨的TCP鏈接到服務器,例如若是客戶端向服務器發送10個請求,則將打開10個單獨的HTTP鏈接。並在得到響應後關閉。服務器

理解上面這段關於 HTTP的描述時我以爲還要了解一下HTTP長鏈接的概念,以及HTTPTCP的關係,簡單歸納一下就是websocket

  • HTTP協議的長鏈接和短鏈接,實質上是TCP協議的長鏈接和短鏈接。
  • 每一個HTTP鏈接完成後,其對應的TCP鏈接並非每次都會關閉。從 HTTP/1.1起,默認使用長鏈接,用以保持鏈接特性。使用長鏈接的HTTP協議,會在響應頭有加入這個頭部字段:Connection:keep-alive
  • 在使用長鏈接的狀況下,當一個網頁打開完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP鏈接不會關閉,若是客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經創建的鏈接。Keep-Alive不會永久保持鏈接,它有一個保持時間,能夠在不一樣的服務器軟件(如ApacheNginxNginx中這個默認時間是 75s)中設定這個時間。實現長鏈接要客戶端和服務端都支持長鏈接。
  • HTTP屬於應用層協議,在傳輸層使用TCP協議,在網絡層使用IP協議。IP協議主要解決網絡路由和尋址問題,TCP協議主要解決如何在IP層之上可靠的傳遞數據包,使在網絡上的另外一端收到發端發出的全部包,而且順序與發出順序一致。TCP有可靠,面向鏈接的特色。

HTTP消息信息是用ASCII編碼的,每一個HTTP請求消息均包含HTTP協議版本(HTTP/1.1HTTP/2),HTTP方法(GET/POST等),HTTP標頭(Content-TypeContent-Length),主機信息等。以及包含要傳輸到服務器的實際消息的正文(請求主體)。HTTP標頭的大小從200字節到2KB不等,HTTP標頭的常見大小是700-800字節。當Web應用程序在客戶端使用更多cookie和其餘工具擴展代理的存儲功能時,它將減小HTTP標頭的荷載。cookie

WebSocket協議

WebSocket是雙向的,在客戶端-服務器通訊的場景中使用的全雙工協議,與HTTP不一樣,它以ws://wss://開頭。它是一個有狀態協議,這意味着客戶端和服務器之間的鏈接將保持活動狀態,直到被任何一方(客戶端或服務器)終止。在經過客戶端和服務器中的任何一方關閉鏈接以後,鏈接將從兩端終止。網絡

讓咱們以客戶端-服務器通訊爲例,每當咱們啓動客戶端和服務器之間的鏈接時,客戶端-服務器進行握手隨後建立一個新的鏈接,該鏈接將保持活動狀態,直到被他們中的任何一方終止。創建鏈接並保持活動狀態後,客戶端和服務器將使用相同的鏈接通道進行通訊,直到鏈接終止。socket

新建的鏈接被稱爲WebSocket。一旦通訊連接創建和鏈接打開後,消息交換將以雙向模式進行,客戶端-服務器之間的鏈接會持續存在。若是其中任何一方(客戶端服務器)宕掉或主動關閉鏈接,則雙方均將關閉鏈接。套接字的工做方式與HTTP的工做方式略有不一樣,狀態代碼101表示WebSocket中的交換協議。工具

什麼時候使用WebSocket

  • 即時Web應用程序:即時Web應用程序使用一個Web套接字在客戶端顯示數據,這些數據由後端服務器連續發送。在WebSocket中,數據被連續推送/傳輸到已經打開的同一鏈接中,這就是爲何WebSocket更快並提升了應用程序性能的緣由。
    例如在交易網站或比特幣交易中,這是最不穩定的事情,它用於顯示價格波動,數據被後端服務器使用Web套接字通道連續推送到客戶端。
  • 遊戲應用程序:在遊戲應用程序中,你可能會注意到,服務器會持續接收數據,而不會刷新用戶界面。屏幕上的用戶界面會自動刷新,並且不須要創建新的鏈接,所以在WebSocket遊戲應用程序中很是有幫助。
  • 聊天應用程序:聊天應用程序僅使用WebSocket創建一次鏈接,便能在訂閱戶之間交換,發佈和廣播消息。它重複使用相同的WebSocket鏈接,用於發送和接收消息以及一對一的消息傳輸。

不能使用WebSocket的場景

若是咱們須要經過網絡傳輸的任何實時更新或連續數據流,則可使用WebSocket。若是咱們要獲取舊數據,或者只想獲取一次數據供應用程序使用,則應該使用HTTP協議,不須要很頻繁或僅獲取一次的數據能夠經過簡單的HTTP請求查詢,所以在這種狀況下最好不要使用WebSocket性能

注意:若是僅加載一次數據,則RESTful Web服務足以從服務器獲取數據。

總結

WEBSOCKET HTTP
WebSocket是一種雙向通訊協議,能夠經過重用已創建的鏈接通道將數據從客戶端發送到服務器,或者從服務器發送到客戶端。鏈接保持活動狀態,直到被客戶端或服務器終止。 HTTP協議是TCP協議之上的單向協議,TCP是面向鏈接的傳輸層協議,咱們能夠在得到響應HTTP鏈接關閉後再使用HTTP請求方法來建立鏈接。
幾乎全部的實時應用程序(如(交易,監視,通知)服務)都使用WebSocket在單個通訊通道上接收數據。 簡單的RESTful應用程序使用無狀態的HTTP協議。
全部常常更新的應用程序都應該使用WebSocket,它比HTTP鏈接更快。 當咱們不想在特定時間內保留鏈接或不重複使用單個鏈接來傳輸數據時使用HTTPHTTP鏈接的速度比WebSocket慢。
來源:GeeksforGeeks
原文連接: https://www.geeksforgeeks.org...

第1頁.png

相關文章
相關標籤/搜索