簡介
本文介紹Http,Socket,Websocket的差別。
Socket是抽象層,在應用層與運輸層中間。是以本文重點對比HTTP與Websocket。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SM3cDM0AzNiNDMyIjYilDMyYzX4UDNxATM0EzLcJDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
Http與Websocket的對比
相同點
項 | Http | Websocket |
相同點 | ||
所在層面 | 應用層(調用Socket,基于TCP) | 應用層(模拟Socket,基于TCP) |
不同點
項 | Http | Websocket |
連接配接類型 | 短連接配接(浏覽器控制,頁面無法控制)。 | 長連接配接。 連接配接時間可程式設計,可永久連接配接(除非斷網)。 |
通信方式 | 客服端發起請求,服務端才響應。服務端不能主動聯系用戶端,隻能由用戶端發起。(單向) | 隻需要完成一次握手,兩者之間就直接可以建立持久性的連接配接,并進行雙向資料傳輸。 不用再次發起網絡請求,它允許服務端主動向用戶端推送資料。 |
端口 | 預設為8080 | 預設情況下,Websocket協定使用80端口;運作在TLS之上時,預設使用443端口。 |
聯系
WebSocket通過HTTP協定建立握手建立之後,使用TCP協定傳輸。
HTTP
短連接配接
在HTTP1.0中,用戶端發送請求,伺服器接收請求,雙方建立連接配接,伺服器響應資源,請求結束。
長連接配接
持久連接配接的特點是,隻要任意一端沒有明确提出斷開連接配接,則保持 TCP 連接配接狀态。
HTTP1.1開始,預設采用持久連接配接,使用了一種叫做keepalive connections 的機制。在傳輸資料後仍然保持連接配接,當用戶端再次擷取資料時,直接使用剛剛空閑下來的連接配接,而無需再次握手,低線路負載,提高傳輸速度。
Keep-Alive不會永久保持連接配接,它有一個保持時間,可以在不同的伺服器軟體(如Apache)中設定這個時間。實作長連接配接需要用戶端和服務端都支援長連接配接。
長連接配接優勢:減少了連接配接請求,降低TCP阻塞,減少了延遲,實時性較好。
長連接配接劣勢:可能會影響性能,因為它在檔案被請求之後還保持了不必要的連接配接很長時間。
Websocket
WebSocket連接配接的過程如下
-
- 首先,用戶端發起http請求,經過3次握手後,建立起TCP連接配接;http請求裡存放WebSocket支援的版本号等資訊,如:Upgrade、Connection、WebSocket-Version等;
- 然後,伺服器收到用戶端的握手請求後,同樣采用HTTP協定回饋資料;
- 最後,用戶端收到連接配接成功的消息後,開始借助于TCP傳輸信道進行全雙工通信。
其他網址
WebSocket原理淺析與實作簡單聊天 - 個人文章 - SegmentFault 思否