什么是 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,实现真正实时的产品体验。

相关文章
|
存储 运维 监控
双11黑科技,阿里百万级服务器自动化运维系统StarAgent揭秘
还记得那些年我们半夜爬起来重启服务器的黑暗历史吗?双11期间,阿里巴巴百万量级主机管理能安全、稳定、高效,如丝般顺滑是如何做到的?阿里巴巴运维中台技术专家宋意,首次直播揭秘阿里IT运维的基础设施StarAgent,详细分析StarAgent是如何支持百万级规模服务器管控?如何像生活中的水电煤一样,做...
17345 16
|
1月前
|
存储 自然语言处理 测试技术
一行代码,让 Elasticsearch 集群瞬间雪崩——5000W 数据压测下的性能避坑全攻略
本文深入剖析 Elasticsearch 中模糊查询的三大陷阱及性能优化方案。通过5000 万级数据量下做了高压测试,用真实数据复刻事故现场,助力开发者规避“查询雪崩”,为您的业务保驾护航。
1334 89
|
17天前
|
Web App开发 区块链 C++
为什么网站图标要使用 ICO 格式?
ICO 是专为图标设计的文件格式,支持多尺寸、多色深与透明度,广泛用于网站 favicon。凭借出色的浏览器兼容性、自动识别机制及单文件多尺寸特性,ICO 仍是网页图标首选,推荐结合 PNG、SVG 共同使用以兼顾兼容性与现代体验。(238 字)
|
2月前
|
存储 缓存 固态存储
系统分区完全指南:多种方法实现专业磁盘管理
合理磁盘分区可提升搜索效率、增强容错性、优化性能并便于管理。建议分为系统盘与数据盘,Windows推荐GPT格式,支持更大容量与UEFI启动。可通过系统自带工具或DiskGenius进行分区操作,注意备份、4K对齐及电源稳定。
661 3
|
存储 安全 数据安全/隐私保护
Token 是什么?全面解析身份认证中的 Token 机制
本文全面解析Token在身份认证中的核心机制,涵盖JWT、Session Token、OAuth等类型,深入讲解其工作原理、安全性策略、生命周期管理及实际应用场景,助力开发者构建安全高效的现代Web应用认证体系。
2115 3
|
2月前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
1716 3
|
2月前
|
人工智能 安全 JavaScript
全面解读 SonarQube 8.9 LTS 到 2025.4 的特性变化
本文全面解读SonarQube从8.9 LTS到2025.4 LTA的演进历程,涵盖产品线命名简化、发布周期调整、AI赋能的代码分析升级及安全合规强化,重点解析多质量规则模式、AI代码溯源与修复、SCA依赖风险管控等核心特性,助力企业实现高质量交付。
332 9
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
1444 62