今天翻譯一篇關於HTTP
和WebSocket
的文章,同時也是爲Go Web編程接下來Socket
部分的文章作鋪墊。web
HTTP
和WebSocket
都是客戶端-服務器通訊中使用的通訊協議。文章用幾個例子解釋了二者的不一樣以及分別適用在什麼應用場景。有些容易混淆的概念(好比說HTTP
長鏈接)和待補充的概念我用斜體字註解到了文章中。編程
HTTP
是單向的,客戶端發送請求,服務器發送響應。舉例來講,當客戶端向服務器發送請求時,該請求以HTTP
或HTTPS
的形式發送,在接收到請求後,服務器會將響應發送給客戶端。每一個請求都與一個對應的響應相關聯,在發送響應後客戶端與服務器的鏈接會被關閉。每一個HTTP
或HTTPS
請求每次都會新建與服務器的鏈接,而且在得到響應後,鏈接將自行終止。HTTP
是在TCP
之上運行的無狀態協議,TCP
是一種面向鏈接的協議,它使用三向握手方法保證數據包傳輸的傳遞並從新傳輸丟失的數據包。後端
HTTP
能夠運行在任何可靠的面向鏈接的協議(例如TCP
,SCTP
)的上層。當客戶端將HTTP
請求發送到服務器時,客戶端和服務器之間將打開TCP
鏈接,而且在收到響應後,TCP
鏈接將終止,每一個HTTP
請求都會創建單獨的TCP
鏈接到服務器,例如若是客戶端向服務器發送10個請求,則將打開10個單獨的HTTP
鏈接。並在得到響應後關閉。服務器
理解上面這段關於 HTTP
的描述時我以爲還要了解一下HTTP
長鏈接的概念,以及HTTP
與TCP
的關係,簡單歸納一下就是:websocket
HTTP
協議的長鏈接和短鏈接,實質上是TCP
協議的長鏈接和短鏈接。HTTP
鏈接完成後,其對應的TCP
鏈接並非每次都會關閉。從 HTTP/1.1
起,默認使用長鏈接,用以保持鏈接特性。使用長鏈接的HTTP
協議,會在響應頭有加入這個頭部字段:Connection:keep-alive
HTTP
數據的TCP
鏈接不會關閉,若是客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經創建的鏈接。Keep-Alive
不會永久保持鏈接,它有一個保持時間,能夠在不一樣的服務器軟件(如Apache
,Nginx
,Nginx
中這個默認時間是 75s)中設定這個時間。實現長鏈接要客戶端和服務端都支持長鏈接。HTTP
屬於應用層協議,在傳輸層使用TCP
協議,在網絡層使用IP
協議。IP
協議主要解決網絡路由和尋址問題,TCP
協議主要解決如何在IP
層之上可靠的傳遞數據包,使在網絡上的另外一端收到發端發出的全部包,而且順序與發出順序一致。TCP
有可靠,面向鏈接的特色。HTTP消息信息是用ASCII
編碼的,每一個HTTP
請求消息均包含HTTP
協議版本(HTTP/1.1
,HTTP/2
),HTTP
方法(GET
/POST
等),HTTP
標頭(Content-Type
,Content-Length
),主機信息等。以及包含要傳輸到服務器的實際消息的正文(請求主體)。HTTP
標頭的大小從200字節到2KB
不等,HTTP
標頭的常見大小是700-800字節。當Web
應用程序在客戶端使用更多cookie
和其餘工具擴展代理的存儲功能時,它將減小HTTP
標頭的荷載。cookie
WebSocket
是雙向的,在客戶端-服務器通訊的場景中使用的全雙工協議,與HTTP
不一樣,它以ws://
或wss://
開頭。它是一個有狀態協議,這意味着客戶端和服務器之間的鏈接將保持活動狀態,直到被任何一方(客戶端或服務器)終止。在經過客戶端和服務器中的任何一方關閉鏈接以後,鏈接將從兩端終止。網絡
讓咱們以客戶端-服務器通訊爲例,每當咱們啓動客戶端和服務器之間的鏈接時,客戶端-服務器進行握手隨後建立一個新的鏈接,該鏈接將保持活動狀態,直到被他們中的任何一方終止。創建鏈接並保持活動狀態後,客戶端和服務器將使用相同的鏈接通道進行通訊,直到鏈接終止。socket
新建的鏈接被稱爲WebSocket
。一旦通訊連接創建和鏈接打開後,消息交換將以雙向模式進行,客戶端-服務器之間的鏈接會持續存在。若是其中任何一方(客戶端服務器)宕掉或主動關閉鏈接,則雙方均將關閉鏈接。套接字的工做方式與HTTP
的工做方式略有不一樣,狀態代碼101
表示WebSocket
中的交換協議。工具
Web
應用程序:即時Web
應用程序使用一個Web
套接字在客戶端顯示數據,這些數據由後端服務器連續發送。在WebSocke
t中,數據被連續推送/傳輸到已經打開的同一鏈接中,這就是爲何WebSocket
更快並提升了應用程序性能的緣由。WebSocket
遊戲應用程序中很是有幫助。WebSocket
創建一次鏈接,便能在訂閱戶之間交換,發佈和廣播消息。它重複使用相同的WebSocket
鏈接,用於發送和接收消息以及一對一的消息傳輸。若是咱們須要經過網絡傳輸的任何實時更新或連續數據流,則可使用WebSocket
。若是咱們要獲取舊數據,或者只想獲取一次數據供應用程序使用,則應該使用HTTP
協議,不須要很頻繁或僅獲取一次的數據能夠經過簡單的HTTP
請求查詢,所以在這種狀況下最好不要使用WebSocket
。性能
注意:若是僅加載一次數據,則RESTful
Web
服務足以從服務器獲取數據。
WEBSOCKET | HTTP |
---|---|
WebSocket 是一種雙向通訊協議,能夠經過重用已創建的鏈接通道將數據從客戶端發送到服務器,或者從服務器發送到客戶端。鏈接保持活動狀態,直到被客戶端或服務器終止。 |
HTTP 協議是TCP 協議之上的單向協議,TCP 是面向鏈接的傳輸層協議,咱們能夠在得到響應HTTP鏈接關閉後再使用HTTP請求方法來建立鏈接。 |
幾乎全部的實時應用程序(如(交易,監視,通知)服務)都使用WebSocket 在單個通訊通道上接收數據。 |
簡單的RESTful 應用程序使用無狀態的HTTP 協議。 |
全部常常更新的應用程序都應該使用WebSocket ,它比HTTP 鏈接更快。 |
當咱們不想在特定時間內保留鏈接或不重複使用單個鏈接來傳輸數據時使用HTTP ,HTTP 鏈接的速度比WebSocket 慢。 |
來源:GeeksforGeeks
原文連接: https://www.geeksforgeeks.org...