介绍一下HTTP和WebSocket的头部信息
文章目录
- 一、HTTP 头部信息
- 1. 通用头部(General Headers)
- 2. 请求头部(Request Headers)
- 3. 响应头部(Response Headers)
- 4. 实体头部(Entity Headers)
- 二、WebSocket 头部信息
- 1. WebSocket 握手请求头部(客户端 → 服务器)
- 2. WebSocket 握手响应头部(服务器 → 客户端)
- 3. 握手后的通信:无 HTTP 头部
- 三、HTTP 与 WebSocket 头部的核心区别
- 总结
HTTP 和 WebSocket 的头部信息在结构、用途和生命周期上存在显著差异。HTTP 头部贯穿于每次请求-响应过程,而 WebSocket 头部主要用于 初始握手阶段,握手成功后则不再使用 HTTP 头部格式通信。
一、HTTP 头部信息
HTTP 头部是客户端与服务器在请求(Request)和响应(Response)中传递元数据的载体,由键值对(Key: Value
)组成,位于请求行/响应行之后、请求体/响应体之前(以空行分隔)。
根据功能,HTTP 头部可分为以下几类:
1. 通用头部(General Headers)
适用于请求和响应,传递跨消息的基础信息。
头部字段 | 说明 |
---|---|
Date | 消息发送的日期和时间(GMT 格式),如 Date: Wed, 28 Sep 2025 08:00:00 GMT |
Connection | 控制连接状态,常见值: - close :响应后关闭连接(HTTP/1.0 默认)- keep-alive :维持持久连接(HTTP/1.1 默认) |
Cache-Control | 控制缓存策略,如 no-cache (不缓存)、max-age=3600 (缓存1小时) |
Transfer-Encoding | 消息体的传输编码方式,如 chunked (分块传输,用于未知长度的响应体) |
2. 请求头部(Request Headers)
仅由客户端发送,传递请求相关的信息(如客户端身份、期望响应格式等)。
头部字段 | 说明 |
---|---|
Host | 服务器的域名和端口(HTTP/1.1 必需),如 Host: www.example.com:8080 |
User-Agent | 客户端的浏览器/设备信息,如 Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36 |
Accept | 客户端可接受的响应数据格式,如 Accept: application/json, text/html |
Accept-Encoding | 客户端支持的压缩算法,如 Accept-Encoding: gzip, deflate |
Authorization | 身份认证信息,如 Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... (JWT 令牌) |
Cookie | 客户端存储的会话信息,由服务器通过 Set-Cookie 响应头设置,如 Cookie: sessionId=abc123; username=user |
Referer | 当前请求的来源页面(防盗链常用),如 Referer: https://www.google.com/ |
3. 响应头部(Response Headers)
仅由服务器发送,传递响应相关的信息(如服务器身份、响应格式等)。
头部字段 | 说明 |
---|---|
Server | 服务器的软件信息,如 Server: Nginx/1.21.6 或 Server: Apache/2.4.54 |
Content-Type | 响应体的数据类型(MIME 类型),如: - 文本: text/html; charset=utf-8 - JSON: application/json - 图片: image/jpeg |
Content-Length | 响应体的字节长度(若已知),如 Content-Length: 1024 |
Set-Cookie | 服务器向客户端设置 Cookie,如 Set-Cookie: sessionId=abc123; Max-Age=3600; HttpOnly |
Location | 重定向的目标 URL(配合 3xx 状态码),如 Location: https://www.new-example.com |
Access-Control-Allow-Origin | 跨域资源共享(CORS)配置,如 * (允许所有域名)或 https://www.allowed.com |
4. 实体头部(Entity Headers)
描述请求体/响应体的元数据(HTTP/1.1 定义,HTTP/2 后逐渐整合到通用/响应头部)。
Content-Encoding
:响应体的压缩方式(与请求头Accept-Encoding
对应),如gzip
。Last-Modified
:资源的最后修改时间,如Last-Modified: Tue, 27 Sep 2025 12:00:00 GMT
。
二、WebSocket 头部信息
WebSocket 协议的核心是基于 HTTP 握手建立连接,因此仅在握手阶段使用 HTTP 格式的头部;握手成功后,通信使用 WebSocket 专用的帧格式,不再包含 HTTP 头部。
1. WebSocket 握手请求头部(客户端 → 服务器)
核心是告知服务器“请求升级为 WebSocket 协议”,关键字段如下:
头部字段 | 说明 |
---|---|
Host | 同 HTTP 请求头,指定服务器域名和端口 |
Upgrade | 必需,值为 websocket ,表示请求升级协议类型 |
Connection | 必需,值为 Upgrade ,配合 Upgrade 头确认升级意图 |
Sec-WebSocket-Key | 必需,客户端生成的随机字符串(Base64 编码),用于服务器验证握手合法性(避免伪请求) |
Sec-WebSocket-Version | 必需,指定 WebSocket 协议版本(通常为 13,现代浏览器均支持) |
Origin | 可选,同 HTTP 的 Origin ,用于跨域验证(服务器可据此限制跨域连接) |
请求头部示例:
GET /ws-endpoint HTTP/1.1
Host: www.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
Origin: https://www.client.com
2. WebSocket 握手响应头部(服务器 → 客户端)
服务器确认升级协议,返回握手成功的响应(状态码必须为 101 Switching Protocols),关键字段如下:
头部字段 | 说明 |
---|---|
Upgrade | 必需,值为 websocket ,确认协议升级 |
Connection | 必需,值为 Upgrade ,配合确认升级 |
Sec-WebSocket-Accept | 必需,服务器对 Sec-WebSocket-Key 的处理结果:1. 将 Sec-WebSocket-Key 与固定字符串 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 拼接;2. 对拼接后的字符串做 SHA-1 哈希; 3. 将哈希结果做 Base64 编码,得到该字段值。 客户端会验证此值,确保握手来自合法服务器。 |
响应头部示例:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
3. 握手后的通信:无 HTTP 头部
握手成功后,客户端与服务器通过 WebSocket 帧(Frame)通信,帧格式包含 opcode(操作码,如文本/二进制数据)、掩码(客户端发送数据必需)、数据长度等字段,不再有 HTTP 头部的键值对结构,因此通信开销远低于 HTTP 的反复请求-响应。
三、HTTP 与 WebSocket 头部的核心区别
维度 | HTTP 头部 | WebSocket 头部 |
---|---|---|
生命周期 | 每次请求-响应均携带(贯穿通信全程) | 仅用于初始握手阶段,握手后不再使用 |
核心用途 | 传递请求/响应的元数据(如身份、格式、缓存) | 仅用于协商协议升级(确认 WebSocket 连接) |
关键特征 | 键值对结构,随请求/响应动态变化 | 固定的握手专用字段(如 Upgrade 、Sec-WebSocket-Key ) |
数据开销 | 每次通信均需携带(头部可能占较大比例) | 仅握手阶段有开销,后续通信无头部开销 |
总结
- HTTP 头部是请求-响应模式的“元数据载体”,每次通信都离不开它,用于控制缓存、身份认证、数据格式等核心逻辑;
- WebSocket 头部是**“协议升级的敲门砖”**,仅在握手时借用 HTTP 头部格式完成连接建立,一旦进入实时通信阶段,就与 HTTP 头部彻底无关。