什么是 ws 和 wss

简介: 本文深入解析 WebSocket 协议中 `ws` 与 `wss` 的区别,从原理、握手过程到 Node.js 实战部署,涵盖协议升级、TLS 加密、Nginx 反向代理及安全实践,助你构建稳定可靠的实时通信应用。

前言

在实时通信场景(聊天、协同编辑、行情数据)里,我们经常会看到 ws://wss:// 两种协议前缀。很多同学知道它们和 WebSocket 有关,却不一定清楚到底差别在哪、与 HTTP/HTTPS 有什么关系。本篇文章将延续《博客搭建一-项目工程搭建》那种“原理 + 步骤 + 示例”的讲解方式,带你彻底搞懂 ws 与 wss

一、WebSocket 协议回顾

1.1 解决了什么问题?

  • HTTP 天生是 请求-响应 模式,客户端必须主动拉取。
  • 某些业务需要 服务器主动推送 数据,例如消息提醒、看板更新。
  • WebSocket 通过一次握手升级,将 HTTP 连接变成 全双工 通道,允许双方随时发送数据。

1.2 握手关键点

  1. 浏览器发起 HTTP 请求,并在 Header 中附带:
    • Upgrade: websocket
    • Connection: Upgrade
    • Sec-WebSocket-Key
  2. 服务器验证并返回 Sec-WebSocket-Accept
  3. 双方切换到 WebSocket 帧格式持续通信。

这个握手阶段决定了我们使用 ws:// 还是 wss://

二、ws 与 wss 的区别

协议 传输层 默认端口 对应关系
ws:// TCP(明文) 80 类似 HTTP
wss:// TLS over TCP(加密) 443 类似 HTTPS
  • ws:未加密,适用于内网或对安全要求不高的场景。
  • wss:在 ws 之上加入 TLS(SSL),所有帧都被加密,浏览器也会执行证书验证,适合公开站点或涉及敏感数据的业务。

注意:现代浏览器在 HTTPS 页面中 禁止 创建 ws:// 连接,必须使用 wss://,否则会报 Mixed Content。

三、URL 结构与示例

ws://example.com:8080/path?token=abc
wss://realtime.webfem.com/quote
  • 协议前缀:ws / wss
  • 主机:域名或 IP
  • 端口:默认 80 / 443,可自定义
  • 路径与查询参数:用于区分业务、传递凭证

四、Node.js 服务端实战

使用 ws 库快速启动一个既支持 ws 又支持 wss 的服务:

import http from 'node:http';
import https from 'node:https';
import fs from 'node:fs';
import {
    WebSocketServer } from 'ws';

const server = http.createServer();
const secureServer = https.createServer({
   
  cert: fs.readFileSync('./ssl/fullchain.pem'),
  key: fs.readFileSync('./ssl/privkey.pem'),
});

const wss = new WebSocketServer({
    server });
const wssSecure = new WebSocketServer({
    server: secureServer });

const handleConnection = (socket) => {
   
  socket.on('message', (msg) => {
   
    console.log('来自客户端:', msg.toString());
    socket.send(`服务端已收到:${
     Date.now()}`);
  });
};

wss.on('connection', handleConnection);
wssSecure.on('connection', handleConnection);

server.listen(8080, () => console.log('ws://localhost:8080'));
secureServer.listen(8443, () => console.log('wss://localhost:8443'));
  • ws://localhost:8080 未加密
  • wss://localhost:8443 需要证书,可以使用自签名证书测试

五、调试

const socket = new WebSocket('wss://realtime.webfem.com/quote');

socket.addEventListener('open', () => {
   
  console.log('已连接');
  socket.send(JSON.stringify({
    type: 'subscribe', symbol: 'BTCUSDT' }));
});

socket.addEventListener('message', (event) => {
   
  const data = JSON.parse(event.data);
  console.log('最新行情', data);
});

socket.addEventListener('close', () => console.log('连接关闭'));
socket.addEventListener('error', (err) => console.error('异常', err));

只需要把 URL 改成 ws://wss:// 即可切换,API 完全一致。

也可以直接使用在想工具WebSocket在线测试工具,快速测试。
ScreenShot_2025-11-25_175605_181.png

六、安全性与部署建议

  1. HTTPS 页面统一使用 wss,避免浏览器拦截。
  2. 若后端在同一台服务器,可利用 Nginx 反向代理,统一 443 端口,将 TLS 解密交由 Nginx 完成:
location /socket {
    proxy_pass http://127.0.0.1:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
}
  1. 认证:通过查询参数、Cookie、JWT 或自定义协议字段,在握手阶段校验身份。
  2. 心跳/断线重连:客户端定期发送 ping/pong 或心跳包,配合指数退避的重连策略。

七、常见排障清单

  • Error during WebSocket handshake: Unexpected response code: 404
    • 检查服务器是否正确处理 /socket 路径。
  • Mixed Content: The page at https://... was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint ws://...
    • 使用 wss:// 或在本地 HTTP 页面调试。
  • 证书错误(NET::ERR_CERT_AUTHORITY_INVALID)
    • 在正式环境使用由可信 CA 签发的证书,或在开发环境信任自签名证书。

总结

  • ws 对应 HTTP,wss 对应 HTTPS,功能一致但安全性不同。
  • 现代浏览器在 HTTPS 页面强制使用 wss。
  • 服务端只需在 Transport 层加上 TLS 就能提供 wss,Nginx 反代是主流做法。
  • 构建实时应用时,提前规划认证、心跳与重连策略,才能让 WebSocket 链接稳定可靠。

掌握 ws 与 wss 的差异和使用场景,你就能自如地在任何业务中接入 WebSocket,实现真正实时的产品体验。

相关文章
|
19天前
|
存储 缓存 固态存储
系统分区完全指南:多种方法实现专业磁盘管理
合理磁盘分区可提升搜索效率、增强容错性、优化性能并便于管理。建议分为系统盘与数据盘,Windows推荐GPT格式,支持更大容量与UEFI启动。可通过系统自带工具或DiskGenius进行分区操作,注意备份、4K对齐及电源稳定。
430 3
|
3月前
|
人工智能 前端开发 Docker
从本地到云端:用 Docker Compose 与 Offload 构建可扩展 AI 智能体
在 AI 智能体开发中,开发者常面临本地调试与云端部署的矛盾。本文介绍如何通过 Docker Compose 与 Docker Offload 解决这一难题,实现从本地快速迭代到云端高效扩容的全流程。内容涵盖多服务协同、容器化配置、GPU 支持及实战案例,助你构建高效、一致的 AI 智能体开发环境。
365 2
从本地到云端:用 Docker Compose 与 Offload 构建可扩展 AI 智能体
|
19天前
|
弹性计算 运维 安全
2025年选购指南:阿里云轻量应用服务器与云服务器ECS深度对比
阿里云轻量应用服务器与ECS区别解析:轻量适合个人开发者搭建博客、测试环境,配置简单、成本低,68元/年起;ECS适用于企业级高负载场景,如大数据、游戏等,功能全面但门槛较高。根据使用需求选择更优。
215 6
|
18天前
|
人工智能 边缘计算 安全
云栖发布深度解读|以边缘原生定义 AI 时代的开发与交付
阿里云 ESA 「函数和Pages」云栖大会发布会
云栖发布深度解读|以边缘原生定义 AI 时代的开发与交付
|
19天前
|
Linux 数据安全/隐私保护 芯片
麒麟系统 Kylin-Desktop-V10-SP1-Release-2107-arm64.iso 安装方法详解(附安装包)
本教程介绍如何为国产ARM64架构电脑安装麒麟操作系统V10 SP1。内容包括下载镜像、使用Rufus制作U盘启动盘、BIOS设置启动项、系统安装步骤及注意事项,强调该系统仅适用于飞腾、鲲鹏等ARM芯片设备,不支持Intel/AMD平台。
|
10天前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 API 网关 2025 年 11 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要。
阿里云微服务引擎 MSE 及 API 网关 2025 年 11 月产品动态
|
25天前
|
云安全 人工智能 自然语言处理
AI说的每一句话,都靠谱吗?
阿里云提供AI全栈安全能力,其中针对AI输入与输出环节的安全合规挑战,我们构建了“开箱即用”与“按需增强”相结合的多层次、可配置的内容安全机制。
1727 3
|
26天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
816 225
|
19天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
1010 59
Meta SAM3开源:让图像分割,听懂你的话