三个字母,本质上差了一整层协议栈。
| 层级 | Socket | WebSocket |
|---|---|---|
| 所属层级 | 传输层(TCP/UDP) | 应用层(HTTP之上) |
| 连接方式 | 直接建立 TCP/UDP 连接 | 先通过 HTTP 握手,再升级为 WebSocket 连接 |
| 数据格式 | 二进制字节流 | 帧(Frame)结构,可是文本帧/二进制帧 |
| 通信方向 | 默认是双向(TCP流) | 真正的全双工通信,浏览器可直接收发 |
| 典型端口 | TCP: 80/443/任意 | ws:// 用80,wss:// 用443 |
| 使用场景 | 程序间通信、嵌入式、底层传输 | 浏览器实时通信(IM、推送、视频) |
Socket 是"机制",WebSocket 是"协议"
1、Socket 是操作系统提供的 通信接口
它是"怎么通信"的底层通道。
举个例子:
// TCP Socket
int fd = socket(AF_INET, SOCK_STREAM, 0);
connect(fd, ...);
send(fd, buf, len, 0);
recv(fd, buf, len, 0);
这只是两端程序之间的字节流,谁都可以定义内容(比如你定义 JSON 协议、自定义命令)。
2、WebSocket 是建立在 HTTP 上的一种 应用层协议
它定义了"浏览器如何与服务器保持长连接"的标准做法。
握手过程(HTTP 请求头):
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: ...
服务器响应:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: ...
握手成功后,HTTP连接升级为 WebSocket 通道(TCP 长连接),之后就可以实时收发数据。
⚙️ 三、关系图一看就懂
浏览器 <---HTTP握手---> 服务器
↓ 升级
<=== WebSocket 全双工通道 ===>
底层仍然是:
TCP Socket → send()/recv()
也就是说:
WebSocket 本质上是用 HTTP 协商,然后在 TCP Socket 上跑自定义的帧格式。
| 场景 | 推荐协议 | 说明 |
|---|---|---|
| C++ 程序 ↔ C++ 程序 | 原生 Socket (TCP/UDP) | 性能高、自由度高 |
| 浏览器 ↔ 后端服务 | WebSocket | 兼容 Web 平台、可穿透防火墙 |
| 短期请求 | HTTP/HTTPS | 一次性通信(REST API) |
| 长期实时通信 | WebSocket | 实时推送、消息同步 |
| 类比 | Socket | WebSocket |
|---|---|---|
| 比喻 | 电话线路 | 打电话的"约定规则" |
| 你负责 | 拨号、接通、收发电流 | 用标准话语通话 |
| 特点 | 自由、裸数据 | 标准化、跨平台 |
Socket 是通信的"工具" ,
WebSocket 是一种基于 Socket 的"通信协议" ,专为浏览器实时通信设计。