WebSocket(WS)协议系列(一)基本概念

ws协议是什么?

WebSocket(WS)协议是一种网络通信协议,提供了全双工、单连接、低延迟的通信方式,通常用于浏览器和服务器之间的实时数据交换。与传统的HTTP协议相比,WebSocket允许在客户端和服务器之间建立持续的连接 ,可以在连接建立后双向发送消息,而不需要每次都重新建立连接。

基于什么协议而来的呢?

WebSocket协议是通过HTTP协议的"握手"过程来初始化的。具体来说,WebSocket协议通过HTTP的Upgrade头部来进行升级。这样,客户端首先通过HTTP向服务器发起请求,服务器响应后,如果同意升级,HTTP连接就会转换为WebSocket连接。

在建立WebSocket连接的初始阶段,客户端和服务器进行一次HTTP握手,确保通信双方都支持WebSocket协议。一旦握手成功,HTTP协议就不再参与数据传输,后续的数据交换是通过WebSocket协议进行的。

为什么可以解决HTTP协议的非持续连接问题?怎么解决的?

HTTP协议是基于请求-响应模型的,也就是说,

1.频繁的连接建立和断开: 每次客户端向服务器发起请求时,服务器都会建立一个新的连接,并在响应完成后关闭连接。

2.无法实现双向通信:客户端发送请求后只能等待服务器响应,无法主动向服务器发送数据。

WebSocket通过"升级"HTTP连接并保持持久连接,避免了HTTP协议每次请求都建立新连接的开销,并提供了双向通信能力。

持久连接: WebSocket连接在建立后会保持打开状态,直到客户端或服务器主动关闭连接。这避免了每次请求都需要重新建立连接的开销。

全双工通信: WebSocket允许客户端和服务器在同一个连接上进行双向通信。客户端不仅可以发送请求,还可以随时接收来自服务器的消息,反之亦然。这让实时数据传输成为可能,比如即时消息、股票行情更新等。

WebSocket如何保持持久连接?

WebSocket通过TCP连接来保持持久连接。TCP是一个面向连接的协议,它在客户端和服务器之间建立一个稳定的连接,直到主动断开。因此,WebSocket利用TCP的特性保持连接持续开放。

既然通过TCP进行保持,使用TCP握手不行吗,为什么还要使用HTTP握手呢?

  1. 浏览器的支持与安全性:
    浏览器本身通常只能直接支持HTTP和HTTPS 协议。
    通过HTTP握手,WebSocket连接可以更好地遵守浏览器的同源策略,并允许跨域通信。HTTP握手阶段通过HTTP头信息来进行跨域控制,从而使WebSocket能够更安全地在跨域环境中使用。
  2. HTTP协议的广泛支持:
    普遍存在: HTTP协议是互联网上最常见的协议,几乎所有的服务器和客户端都支持。通过HTTP的握手,WebSocket可以利用现有的基础设施进行初步的连接
    端口的兼容性: 默认情况下,HTTP协议使用80端口,HTTPS使用443端口,而WebSocket的默认端口是80(非加密)或443(加密)。因为HTTP和HTTPS协议通常已经在网络防火墙或代理中得到支持,WebSocket的HTTP握手使得WebSocket连接更容易穿透这些中间设备
  3. TCP握手的局限性:
    TCP协议本身确实也支持持久连接,但它并不具备像HTTP协议那样的协议协商机制。通过HTTP的握手,客户端和服务器可以协商一些WebSocket协议相关的特性 ,比如:
    协议版本: 在HTTP请求头中,可以指明使用的WebSocket版本以及其他的协议选项。
    安全性(加密): WebSocket也可以通过HTTP的握手阶段来协商是否使用加密(即wss://与ws://),确保数据传输的安全性。

下面看个小栗子:

WebSocket使用HTTP协议进行握手的具体流程。

1.客户端发起请求:客户端通过HTTP协议发起一个带有特定头部(如Upgrade : websocket和Connection: Upgrade)的请求,表示希望将连接升级为WebSocket协议。

GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlbG9naW5nCg==
Sec-WebSocket-Version: 13

2.服务器响应:

如果服务器支持WebSocket协议,它会通过HTTP响应返回一个"101 Switching Protocols"的状态码,并在响应头中确认协议升级

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

3.协议切换: 一旦握手成功,客户端和服务器之间的通信就不再使用HTTP协议,而是切换到WebSocket协议,这时可以开始进行持久的、双向的实时通信。

相关推荐
csbDD1 小时前
2025年网络安全(黑客技术)三个月自学手册
linux·网络·python·安全·web安全
荔枝荷包蛋6662 小时前
【Linux】HTTP:Cookie 和 Session 详解
网络·网络协议·http
EasyNVR2 小时前
EasyRTC智能硬件:实时畅联、沉浸互动、消音护航
运维·服务器·网络·安全·音视频·webrtc·p2p
劉煥平CHN2 小时前
RabbitMQ的脑裂(网络分区)问题
网络·分布式·rabbitmq
阿湯哥2 小时前
越权漏洞及其修复方法
网络·安全·web安全
遥遥远方 近在咫尺3 小时前
HTTPS原理
网络协议·https
编程星空3 小时前
HTTP 和 HTTPS 的区别
网络协议·http·https
我们的五年3 小时前
【Linux网络编程】应用层协议HTTP(请求方法,状态码,重定向,cookie,session)
linux·网络·http
ZachOn1y4 小时前
计算机网络:应用层 —— 动态主机配置协议 DHCP
网络·计算机网络·应用层·dhcp·408考研
我们的五年5 小时前
【Linux网络】TCP/IP地址的有机结合(有能力VS100%???),IP地址的介绍
linux·运维·网络·tcp/ip