http,tcp与websocket
HTTP协议、TCP协议、WebSocket的区别
以下是HTTP协议、TCP协议和WebSocket的区别,从定义、功能、特点等多个方面进行比较:
1. TCP协议
- 定义:TCP(Transmission Control Protocol,传输控制协议)是传输层协议,属于OSI模型的第四层或TCP/IP模型的传输层。
- 功能:
- 提供可靠的、面向连接的数据传输。
- 确保数据按序到达、无丢失、无重复,通过三次握手建立连接、四次挥手断开连接。
- 提供流量控制和拥塞控制机制。
- 特点:
- 可靠性:通过确认机制(ACK)、重传机制和错误检测确保数据完整性。
- 面向连接:通信前需建立连接,通信后需断开连接。
- 适用场景:需要高可靠性的场景,如文件传输(FTP)、电子邮件(SMTP)、HTTP等。
- 缺点:相比UDP,开销较大,速度较慢。
- 与HTTP/WebSocket的关系:
- TCP是HTTP和WebSocket的底层传输协议,HTTP和WebSocket依赖TCP提供可靠的数据传输。
2. HTTP协议
- 定义:HTTP(HyperText Transfer Protocol,超文本传输协议)是应用层协议,基于TCP,用于Web浏览器与服务器之间的数据交互。
- 功能:
- 用于传输超文本数据(如HTML、图片等),是Web浏览的基础。
- 基于请求-响应模型,客户端发送请求,服务器返回响应。
- HTTP/1.1支持持久连接(Keep-Alive),HTTP/2引入多路复用,HTTP/3基于UDP(QUIC)。
- 特点:
- 无状态:每个请求独立,服务器不保存客户端状态(可用Cookie/Session解决)。
- 单向通信:客户端主动发起请求,服务器被动响应。
- 短连接(HTTP/1.0)或持久连接(HTTP/1.1):早期每次请求需新建TCP连接,HTTP/1.1优化为复用连接。
- 适用场景:网页浏览、API调用、文件下载等。
- 缺点:不支持服务器主动推送,实时性较差;频繁建立连接(HTTP/1.0)效率低。
- 与WebSocket的关系:
- HTTP用于初始握手建立WebSocket连接,WebSocket随后接管通信。
3. WebSocket
- 定义:WebSocket是应用层协议(基于TCP),通过HTTP/1.1的Upgrade机制建立,提供全双工通信。
- 功能:
- 在客户端和服务器之间建立持久的双向通信通道。
- 支持服务器主动向客户端推送数据。
- 数据以帧的形式传输,支持文本和二进制数据。
- 特点:
- 全双工:客户端和服务器可同时发送和接收数据。
- 持久连接:一次握手后保持连接,减少重复建立连接的开销。
- 低开销:相比HTTP,数据帧头部较小,适合实时通信。
- 适用场景:实时应用,如聊天、在线游戏、实时通知、股票行情推送等。
- 缺点:实现复杂,服务器需维护大量连接,消耗资源;对代理/防火墙支持不够友好。
- 与HTTP的关系:
- WebSocket通过HTTP的Upgrade头从HTTP协议切换到WebSocket协议。
比较表
特性 | TCP协议 | HTTP协议 | WebSocket |
---|---|---|---|
OSI层 | 传输层 | 应用层 | 应用层 |
通信方式 | 面向连接、可靠传输 | 请求-响应、单向 | 全双工、双向 |
连接特性 | 需三次握手建立连接 | 短连接或持久连接 | 持久连接 |
数据格式 | 字节流 | 文本(请求/响应头+正文) | 帧(文本或二进制) |
状态管理 | 无状态 | 无状态(可通过Cookie等实现状态) | 有状态(连接保持期间) |
实时性 | 不直接涉及实时性 | 较差(轮询或长轮询实现伪实时) | 优秀(适合实时通信) |
开销 | 较高(可靠性和连接管理) | 中等(HTTP头较大) | 较低(帧头部小) |
适用场景 | 基础传输(如FTP、HTTP) | 网页、API调用 | 实时应用(聊天、游戏) |
依赖 | 底层协议(IP) | 依赖TCP | 依赖TCP,初始握手用HTTP |
示例代码(简要对比)
- HTTP请求(C++使用libcurl库):
1
2
3
4
5
6
7
8
9
10
int main() {
CURL* curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
curl_easy_perform(curl); // 发送HTTP请求
curl_easy_cleanup(curl);
}
return 0;
} - WebSocket连接(C++使用websocketpp库):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main() {
websocketpp::client<websocketpp::config::asio> client;
client.set_open_handler([](websocketpp::connection_hdl_t) {
std::cout << "WebSocket connected\n";
});
client.init_asio();
websocketpp::lib::error_code ec;
auto con = client.get_connection("ws://example.com", ec);
client.connect(con);
client.run();
return 0;
} - TCP通信(C++ socket编程):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main() {
int sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &server.sin_addr);
connect(sock, (struct sockaddr*)&server, sizeof(server));
// 发送/接收数据
close(sock);
return 0;
}
总结
- TCP是底层传输协议,提供可靠数据传输,HTTP和WebSocket依赖它。
- HTTP适合基于请求-响应的Web应用,无状态,实时性较差。
- WebSocket适合实时、双向通信,效率高但实现复杂。
根据应用场景选择合适的协议:HTTP用于传统Web,WebSocket用于实时交互,TCP用于自定义传输需求。
WebSocket 协议详解
WebSocket 是一种基于 TCP 的全双工通信协议,设计用于在客户端和服务器之间建立持久、低延迟的连接,适用于实时应用场景,如聊天、在线游戏、实时数据推送等。以下是对 WebSocket 协议的详细介绍。
1. WebSocket 协议概述
WebSocket 协议(定义于 RFC 6455)允许客户端和服务器通过单个 TCP 连接进行双向通信,解决了 HTTP 协议在实时通信中的局限性(如轮询的高延迟和高开销)。其主要特点包括:
- 全双工通信:客户端和服务器可同时发送和接收消息。
- 持久连接:建立后保持连接,直到显式关闭,减少连接建立/断开的开销。
- 低开销:WebSocket 数据帧头部较小(2-14 字节),相比 HTTP 请求/响应更高效。
- 基于 HTTP 握手:通过 HTTP/1.1 的 Upgrade 机制建立连接,兼容现有 Web 基础设施。
- 跨域支持:通过 WebSocket URL(
ws://
或wss://
)支持跨域通信。
2. WebSocket 协议工作原理
2.1 连接建立(握手过程)
WebSocket 连接通过 HTTP 协议的 Upgrade 机制建立,过程如下:
- 客户端发起握手请求:
- 客户端发送 HTTP GET 请求,包含特定头部:
1
2
3
4
5
6GET /chat
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13Upgrade: websocket
:请求协议升级。Connection: Upgrade
:表示连接需要升级。Sec-WebSocket-Key
:随机生成的 base64 编码字符串,用于握手验证。Sec-WebSocket-Version
:指定 WebSocket 协议版本(通常为 13)。
- 客户端发送 HTTP GET 请求,包含特定头部:
- 服务器响应:
- 服务器验证请求,返回 HTTP 101 状态码,表示协议切换:
1
2
3
4101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=Sec-WebSocket-Accept
:由服务器基于客户端的Sec-WebSocket-Key
计算生成(算法:对Sec-WebSocket-Key
拼接固定 GUID,计算 SHA-1 哈希并 base64 编码)。
- 服务器验证请求,返回 HTTP 101 状态码,表示协议切换:
- 连接建立:
- 握手完成后,连接升级为 WebSocket 协议,双方可通过该连接发送数据帧。
2.2 数据传输
WebSocket 使用数据帧传输消息,支持文本(UTF-8)和二进制数据。
掩码机制:
- 客户端发送的数据需使用掩码(随机 4 字节)对负载进行 XOR 加密,防止恶意脚本攻击代理服务器。
- 服务器发送的数据通常不需掩码。
2.3 连接关闭
- 关闭连接通过发送 Close 帧(Opcode = 0x8)完成,包含关闭状态码和可选原因。
- 状态码示例:
- 1000:正常关闭。
- 1001:一方离开(如页面关闭)。
- 1002:协议错误。
- 双方关闭连接后,TCP 连接断开。
3. WebSocket 与 HTTP 的对比
特性 | WebSocket | HTTP/1.1 |
---|---|---|
通信方式 | 全双工,持久连接 | 半双工,请求-响应模型 |
协议开销 | 低(帧头部 2-14 字节) | 高(每次请求包含完整 HTTP 头部) |
实时性 | 高,适合实时应用 | 低,需轮询或长轮询实现实时 |
连接管理 | 单次握手,长期保持 | 每次请求需新建连接(除 Keep-Alive) |
典型场景 | 聊天、实时通知、游戏 | 网页加载、API 请求 |
4. WebSocket 的优势与局限性
优势
- 低延迟:持久连接避免了 HTTP 轮询的延迟。
- 高效:数据帧头部小,减少网络开销。
- 双向通信:支持服务器主动推送消息。
- 跨平台:广泛支持于浏览器、服务器和移动端。
局限性
- 复杂性:需要服务器支持 WebSocket 协议,握手和帧处理较复杂。
- 资源占用:持久连接可能增加服务器资源消耗。
- 代理兼容性:某些代理服务器可能不支持 WebSocket 或需要额外配置。
- 安全性:需使用
wss://
(TLS 加密)确保数据安全。
6. 典型应用场景
- 实时聊天:如 WhatsApp、Slack。
- 实时数据推送:股票价格更新、通知系统。
- 在线游戏:多人游戏的状态同步。
- 协同编辑:如 Google Docs 的实时协作。
- 物联网:设备与服务器的实时通信。
7. WebSocket 协议扩展
- 子协议:握手时可通过
Sec-WebSocket-Protocol
指定子协议(如chat
、mqtt
)。 - 扩展:通过
Sec-WebSocket-Extensions
支持数据压缩(如permessage-deflate
)。 - 心跳机制:使用 Ping/Pong 帧(Opcode 0x9/0xA)保持连接活跃。
8. 安全性考虑
- 使用
wss://
(WebSocket over TLS)加密通信,防止中间人攻击。 - 验证
Origin
头部,防止未经授权的跨域连接。 - 实现适当的认证机制(如 token)以验证客户端身份。
- 限制连接数量,避免资源耗尽。
9. 总结
- WebSocket 协议:基于 TCP 的全双工通信协议,通过 HTTP 握手建立,适合实时、低延迟应用。
- 核心机制:握手建立连接,数据帧传输消息,支持文本和二进制数据。
- 优势:高效、双向、实时,广泛应用于聊天、游戏、数据推送等场景。
- 实现:客户端通过浏览器 API(如 JavaScript 的 WebSocket),服务器通过支持 WebSocket 的框架(如 Node.js 的
ws
、Python 的websockets
)。
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
Comments